news 2026/9/4 21:49:28

用傅里叶变换和频谱分析,给理工生讲懂乐理中的音色与协和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用傅里叶变换和频谱分析,给理工生讲懂乐理中的音色与协和

如果你是一个理工科背景的人,第一次翻开乐理书,大概率会有一种很熟悉的感觉:每个字都认识,组合在一起就是不懂。C大调、属七和弦、调式、终止式……这些概念建立在大量听觉经验之上,而理工生的听觉经验往往没有跟上文字描述。于是很多人学了三个月,记住一堆名词,却依然说不清“为什么这个音和那个音放在一起好听”。

本文想换一条路:不从五线谱开始,而是从物理和信号处理出发,用傅里叶变换把“音色”拆成“频谱”,再从频谱反推乐理中“协和”与“不协和”的来源。换句话说,这篇文章是把乐理课改写成了一堂信号处理实战课。

读完你会得到三样东西:

  • 一套用频率、频谱、谐波理解音乐的思维框架;
  • 用 Python 对乐音做 FFT 频谱分析和频谱图绘制的完整代码;
  • 从“音色 = 频谱”出发,理解泛音列、协和音程和十二平均律的数学本质。

文章不要求你有乐理基础,但希望你具备最基本的 Python 使用经验。

1. 为什么建议理工生换一条路学乐理

1.1 传统乐理学习路径,卡住了很多理工生

乐理书通常先讲音名、音程、音阶、调号,再讲和弦与和声进行。这种路径有一个默认前提:学生能听出“Do-Re-Mi”的差别,能分辨大三和弦与小三和弦的情绪差异。

但理工生常常卡在这一步。

“我知道 Do 和 Re 是两个音,可为什么它们轮流出现会好听?”这种问题在传统乐理体系里很难得到一个量化答案。书里会告诉你“这个进行在调内,很自然”,可“自然”这个词对习惯了公式和参数的人来说,几乎等于没有解释。

理工生需要的是映射关系:物理量到听觉感受的映射。而傅里叶变换恰好提供了最核心的映射工具。

1.2 傅里叶变换是理工生理解音乐的一座桥

音乐信号在时域上看起来是一条复杂的波形曲线,但傅里叶变换告诉我们:任何周期信号都可以分解成一系列不同频率、不同幅度、不同相位的正弦波之和。

这个概念的价值在于,它把“音色”这个主观词汇,翻译成了“频谱结构”这个客观描述。

一旦完成这个翻译,很多乐理困惑就自动化解了:

  • 为什么不同乐器演奏同一个音,我们能分辨出来?
  • 为什么有些音程听起来协和,有些听起来刺耳?
  • 为什么钢琴按下一个键,发出来的其实不止一个频率?

这三个问题都可以用频谱回答。所以,这篇教程不是否定乐理,而是给乐理换一个更适合理工生的坐标系。

2. 声音是什么:从空气振动到三个基本属性

2.1 声音的本质是振动,不是“音符”

在物理层面,声音就是空气压力的周期性波动。声源振动,推动周围空气分子,形成疏密相间的纵波,传入人耳后引起鼓膜振动,最终被听觉系统感知。

这里有几个关键物理量:

  • 振动频率,单位是赫兹(Hz),每秒振动次数;
  • 振动幅度,决定了声音的强弱;
  • 振动波形,也就是压力随时间变化的形状。

音乐中所谓“音符”,实际上是人耳对某个频率振动的主观标签。比如国际标准音 A4,频率被规定为 440 Hz,意思就是声源每秒完成 440 次振动循环。

2.2 乐音的三大属性与物理量的对应关系

在音乐理论中,一个乐音通常被描述为三个维度:

音乐属性主观感受主要对应的物理量
音高这个音是偏高还是偏低基频,也就是最低的那个主要频率
音强声音的大小振动的幅度
音色是钢琴还是小提琴频率成分的组成结构

前两个对应关系很直接:基频越高,听起来音越高;振幅越大,听起来越响。

但音色就麻烦一些。同样是 440 Hz 的 A4,钢琴发出的声音和小提琴发出的声音,基频都是 440 Hz,响度也可以调到一致,可听感完全不同。差异不在基频,而在“基频之外还有什么”。

2.3 用“频率成分”重新理解音色

一架钢琴在弹奏 A4 时,真正发出声音的空气振动不是单一的正弦波,而是一个复杂的周期信号。这个周期信号的基频是 440 Hz,但除了 440 Hz 之外,还包含 880 Hz、1320 Hz、1760 Hz……等一系列频率成分。

小提琴的 A4 也有这些成分,但每个频率成分的强度比例不一样。

人耳对音色的辨认,本质上就是对“频率成分比例”的辨认。你用频谱图去看这两种乐器,一眼就能看出它们的差异,哪怕它们演奏同一个音高。

这就是“音色 = 频谱”这个标题想表达的直觉。下一章,我们把傅里叶变换这个工具正式请出来。

3. 傅里叶变换:从一条波形到一张频谱

3.1 时域与频域:同一声音的两种观察方式

声音信号最原始的表达方式是时域波形,横轴是时间,纵轴是振幅。它告诉你在每个瞬间空气压力的变化情况。

但时域波形有一个问题:它把所有频率成分混合在一起,你很难看出这个声音里面有哪些频率。

傅里叶变换提供了另一种视角。变换之后,横轴变成频率,纵轴变成该频率成分的强度。这就是频域表达。

同一个声音,时域是一条曲线,频域是一张频谱图,两者包含的信息在数学上等价。频域的优点是把“混合后的结果”还原成“原始的成分列表”,方便我们观察哪些频率是主角,哪些是配角。

3.2 傅里叶变换公式与直觉解释

连续傅里叶变换的数学表达式为:

X(f) = ∫ x(t) · e^(-j2πft) dt

其中 x(t) 是时域信号,X(f) 是频域信号,f 是频率,j 是虚数单位。

这个公式一眼看上去可能让人头疼,但直觉其实很简单:把原始信号 x(t) 与一个频率为 f 的标准正弦波相乘,再对整个时间求积分。如果信号里恰好包含频率 f 的成分,乘积会得到较大的积分值;如果信号里根本没有这个频率,正负部分会相互抵消,积分结果趋近于零。

所以傅里叶变换本质上是“扫描式地检测信号中包含哪些频率成分”,扫描到哪个频率有强响应,就说明信号里存在那个频率的分量。

3.3 从连续变换到FFT

现实中的音频信号是离散采样得到的。假设采样率为 fs,每隔 1/fs 秒采集一个样本,得到离散序列 x[n],n = 0, 1, ..., N-1。

离散傅里叶变换(DFT)的公式是:

X[k] = Σ x[n] · e^(-j2πkn/N)

直接按这个公式计算 N 个点的复杂度是 O(N²),对实时应用来说太慢。快速傅里叶变换(FFT)利用对称性和周期性,把复杂度降到 O(N log N),这才让频谱分析在工程中真正可用。

现在几乎所有主流编程语言都有成熟的 FFT 库。Python 中最常用的是 numpy 和 scipy 提供的 FFT 接口,后面我们会直接用。

3.4 频谱与频谱图的区别

这里要区分两个容易混淆的概念:

  • 频谱(spectrum):对一段信号做傅里叶变换,得到频率与幅度的对应关系。它是一张静态的“频率快照”。
  • 频谱图(spectrogram):把信号分成很多短窗口,对每个窗口分别做 FFT,再按时间顺序排列,形成“时间-频率-幅度”三维信息,通常用颜色表示幅度大小。

音乐是时间艺术,音色会随着演奏过程变化。一个钢琴音开头有冲击感,中段是衰减的余音,末段逐渐消失。单纯看整个音符的频谱,会丢失这种动态信息。

所以实践中,分析单个音色看频谱,分析一段旋律或乐句,更适合看频谱图。文章第 5 章会把两种方法都演示一遍。

4. “音色 = 频谱”:这个等式为什么能成立,又不能完全成立

4.1 最直接的证据:波形不同,频谱不同

做一个简单实验:一个 440 Hz 的正弦波,和一个 440 Hz 的方波,听感完全不同。没错,基频相同,音高相同,但音色差异巨大。

看时域波形,正弦波是平滑的曲线,方波是陡峭的上下跳变。为什么会有这种差异?因为方波里包含了大量的高频分量。

数学上,方波可以用傅里叶级数展开为:

x(t) = (4/π) · [sin(2πft) + (1/3)sin(6πft) + (1/5)sin(10πft) + ...]

方波包含基频的 1 倍、3 倍、5 倍、7 倍……等奇次谐波,而且谐波幅度按 1/n 的规律递减。正弦波只有一个基频分量。两者的频谱差异,就是音色差异最直观的体现。

所以“音色 = 频谱”这个式子,在教学上非常有用:它把一个难以言说的主观听觉,映射成了可以计算的客观频谱。

4.2 谐波与泛音:两个容易混淆的词

在讨论频谱时,经常会遇到两个词:谐波(harmonic)和泛音(overtone)。

  • 谐波:频率为基频整数倍的频率成分。比如基频 440 Hz,则 880 Hz 是二次谐波,1320 Hz 是三次谐波。
  • 泛音:除基频之外的所有频率成分。泛音不一定是基频的整数倍,它可以是非整数倍。

大多数弦乐器和管乐器的泛音近似整数倍关系,所以它们的泛音基本就是谐波。但有些乐器,比如钟、锣、某些打击乐器,泛音并非整数倍关系,频谱结构更加复杂,听感也更有金属感和不和谐感。

讨论乐音音色时,谐波结构是分析重点;讨论所有声音时,泛音是更宽泛的称呼。

4.3 幅度谱与相位谱的取舍

严格来说,傅里叶变换输出的是复数频谱,包含幅度和相位两部分信息。

  • 幅度谱:告诉你每个频率成分有多少能量;
  • 相位谱:告诉你每个频率成分在时间上的对齐关系。

人耳对幅度谱的感知非常敏感,这就是不同乐器音色差异的主要来源。但对相位谱的敏感度相对较低,尤其对稳态音符来说,人耳很难分辨两个只有相位不同的声音。

工程上,很多音频处理系统只保留幅度谱,丢弃相位,比如常见的频谱可视化。但在某些场景,比如波表合成、脉冲响应处理、声场重建中,相位信息非常重要。

所以更严谨的说法是:完整的复数频谱与声音一一对应;但日常语境中说“频谱”,通常指幅度谱,它捕获了音色的主体,却丢掉了相位和一部分时变细节。

4.4 包络与时变:音色的“另一只脚”

再回到钢琴和小提琴的例子。即使你忽略相位,只看幅度谱,钢琴与小提琴的差异依然很明显。但如果只取音符开头 50 毫秒做频谱分析,你会得到完全不同的结果,因为钢琴声音一开始有很强的冲击噪声,而长笛没有。

这说明音色不仅是“某时刻的频谱”,还包括“频谱随时间的变化”。

包络(envelope)就是描述声音幅度随时间变化的曲线。常见的包络模型是 ADSR:起音、衰减、延音、释放。不同乐器的包络差异巨大:

  • 钢琴:起音快,随后快速衰减,延音逐渐消逝;
  • 管风琴:起音慢,持续期保持稳定,几乎没有衰减;
  • 打击乐:起音极短,衰减极快。

所以,如果你想在合成器上模拟一种真实乐器,除了调整谐波幅度比例,还要调整包络。这就是“音色 = 频谱”这个表达需要补充的地方:准确说,是“频谱结构 + 频谱随时间的演变 + 包络,共同决定音色”。

不过,作为给理工生的第一课,先牢牢记住“频谱是音色的地基”,完全够用了。

5. 用 Python “看见”音色

5.1 环境准备

这一章我们用 Python 合成不同的音色,并绘制它们的波形、频谱和频谱图。

环境建议:

  • Python 3.8 或更高版本;
  • numpy,用于数组计算;
  • scipy,用于 FFT 和 WAV 文件读取;
  • matplotlib,用于绘图。

安装命令:

pip install numpy scipy matplotlib

如果你用的是 Anaconda 发行版,以上三个库通常已经内置,直接使用即可。

版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示分析思路。

5.2 合成三种音色

我们先用正弦波叠加的方式合成三个乐音,基频都设置为 220 Hz,对应 A3 这个音,但谐波结构不同。

新建一个 Python 文件tone_analysis.py,内容如下:

import numpy as np import matplotlib.pyplot as plt from scipy.fft import rfft, rfftfreq # 全局参数 SR = 22050 # 采样率,单位 Hz DURATION = 1.0 # 音长,单位秒 F0 = 220.0 # 基频,A3 def synth_tone(partials, f0=F0, duration=DURATION, sr=SR, decay=0.0): """ 用正弦波叠加合成乐音。 partials: 列表,每个元素为 (倍频数, 幅度, 相位) decay: 指数衰减系数,0 表示不衰减 """ t = np.linspace(0, duration, int(sr * duration), endpoint=False) y = np.zeros_like(t) for mult, amp, phase in partials: y += amp * np.sin(2 * np.pi * f0 * mult * t + phase) if decay > 0: y *= np.exp(-decay * t) return t, y # 1. 纯正弦波:只有基频 t_pure, y_pure = synth_tone([(1, 1.0, 0)]) # 2. 模拟钢琴音色:基频强,高频谐波快速衰减,整体带指数衰减 piano_partials = [ (1, 1.00, 0), (2, 0.50, 0.2), (3, 0.25, 0.5), (4, 0.12, 1.0), (5, 0.06, 1.5), ] t_piano, y_piano = synth_tone(piano_partials, decay=1.5) # 3. 模拟弦乐音色:谐波更多,衰减更慢,保留更多高频 string_partials = [ (1, 1.00, 0), (2, 0.80, 0.1), (3, 0.60, 0.3), (4, 0.45, 0.6), (5, 0.30, 1.0), (6, 0.20, 1.4), (7, 0.12, 1.8), (8, 0.08, 2.2), ] t_string, y_string = synth_tone(string_partials, decay=0.5) print("合成完成,信号长度:", len(y_pure))

这段代码的核心是synth_tone函数。它把一组正弦波叠加在一起,再乘上可选的指数衰减包络。谐波结构通过partials列表控制,这是理解“音色 = 频谱”的实验基础。

5.3 画波形与 FFT 频谱

接着,在同一个文件后面添加绘图函数:

def plot_wave_and_spectrum(t, y, title): fig, axes = plt.subplots(2, 1, figsize=(12, 8)) # 上半部分:时域波形 axes[0].plot(t[:2000], y[:2000], lw=0.8) axes[0].set_title(title + " - 时域波形") axes[0].set_xlabel("时间 (s)") axes[0].set_ylabel("振幅") axes[0].set_xlim(0, 2000 / SR) # 下半部分:FFT 幅度谱 N = len(y) freqs = rfftfreq(N, 1 / SR) mag = np.abs(rfft(y)) # 只显示 0~4000 Hz 范围,便于观察谐波结构 mask = freqs <= 4000 axes[1].stem(freqs[mask], mag[mask], basefmt=" ", markerfmt="C1o") axes[1].set_title(title + " - FFT 幅度谱") axes[1].set_xlabel("频率 (Hz)") axes[1].set_ylabel("幅度") axes[1].set_xlim(0, 4000) plt.tight_layout() plt.savefig(title.replace(" ", "_") + ".png", dpi=150) plt.show() plot_wave_and_spectrum(t_pure, y_pure, "Pure Sine 220Hz") plot_wave_and_spectrum(t_piano, y_piano, "Piano Like 220Hz") plot_wave_and_spectrum(t_string, y_string, "String Like 220Hz")

注意这里使用了scipy.fft模块的rfft,它针对实数序列做了优化,只输出非负频率部分。rfftfreq则生成对应的频率轴坐标。

运行后,你会看到:

  • 纯正弦波的频谱只有一根谱线,位于 220 Hz;
  • 模拟钢琴音在 220、440、660、880、1100 Hz 处各有谱线,且幅度逐级下降;
  • 模拟弦乐音拥有更多谐波,幅度衰减更慢。

这正是音色差异的可视化证据。三个声音基频相同,所以音高相同;谐波结构不同,所以音色不同。

5.4 用频谱图观察音色随时间的变化

上面看到的频谱是整段信号的静态统计。钢琴音的衰减包络、弦乐音更有持续性的特点,需要用频谱图来观察。

pylab 风格的specgram函数底层就是短时傅里叶变换(STFT)。添加如下代码:

def plot_spectrogram(y, sr, title): plt.figure(figsize=(12, 5)) plt.specgram(y, NFFT=1024, Fs=sr, noverlap=512, cmap="magma") plt.title(title + " - 频谱图") plt.xlabel("时间 (s)") plt.ylabel("频率 (Hz)") plt.ylim(0, 4000) plt.colorbar(label="幅度 (dB)") plt.tight_layout() plt.savefig(title.replace(" ", "_") + "_specgram.png", dpi=150) plt.show() plot_spectrogram(y_pure, SR, "Pure Sine 220Hz") plot_spectrogram(y_piano, SR, "Piano Like 220Hz") plot_spectrogram(y_string, SR, "String Like 220Hz")

频谱图中,横轴是时间,纵轴是频率,颜色深浅代表该时刻该频率的能量大小。

你能清楚看到钢琴音在开头的高频能量比较明显,后面整体衰减;弦乐音维持时间更长;纯正弦波则从头到尾只有一条稳定的横线。

如果将来做音乐合成、乐器识别或音频混音,掌握频谱图比只看静态频谱更有用,因为它保留了时序信息。

5.5 分析一段真实音乐文件

合成的音色虽然便于理解,但分析真实音频更有成就感。你可以用手机录制一段钢琴长音,或者下载一段免版权乐器采样,保存为 WAV 文件。

分析代码如下:

from scipy.io import wavfile def analyze_wav(path): sr, data = wavfile.read(path) # 如果采样率过高,可以降采样到 22050,方便计算 if sr > 22050: step = sr // 22050 data = data[::step] sr = 22050 # 如果是立体声,取左声道 if data.ndim > 1: data = data[:, 0] # 归一化到 [-1, 1] if np.issubdtype(data.dtype, np.integer): data = data / 32768.0 # 取前 2 秒进行分析 data = data[:int(sr * 2)] plot_wave_and_spectrum( np.linspace(0, len(data) / sr, len(data), endpoint=False), data, "Real Audio" ) # 将下面路径换成你自己的 wav 文件 # analyze_wav("piano_a3.wav")

这段代码兼容常见 16 位整型 WAV 文件。如果你录制的文件采样率比较高,它会先降采样到 22050 Hz,再做频谱分析。

一个值得做的实验是:分别录制同一个人说“啊——”和“咿——”,然后看频谱图。你会发现虽然都是同一个人的声音,基频可能差不多,但高频谐波的分布完全不同。这就是人耳区分元音的原理,也是语音识别中频谱特征的起点。

6. 从频谱到乐理:泛音列、协和音程与十二平均律

6.1 泛音列:每种乐器都自带一把“频率尺子”

现在你已经知道,一个乐音通常包含基频和一系列谐波。把这些谐波按频率高低排列,就是泛音列:

基频 f, 2f, 3f, 4f, 5f, ...

这个序列不是任意虚构的,而是物理振动的自然结果。琴弦振动时,不仅整根弦振动,还同时进行二分之一段、三分之一段、四分之一段……的局部振动。这些振动模式叠加,就形成了谐波频谱。

泛音列对乐理非常关键,因为很多音程关系直接来自泛音列中的频率比:

  • 八度:频率比 2:1,也就是基频与二次谐波的关系;
  • 纯五度:频率比 3:2,接近基频与三次谐波的关系;
  • 纯四度:频率比 4:3;
  • 大三度:频率比 5:4。

当两个音同时发声时,如果它们的频率比接近这些简单整数比,频谱中的谐波会大量重合,人耳会感到稳定、融合。这就是协和音程的物理基础。

6.2 协和音程为什么协和

假设你同时演奏 220 Hz 和 330 Hz 两个音,它们分别有自己的谐波序列:

  • 220 Hz 的谐波:220, 440, 660, 880, 1100, ...
  • 330 Hz 的谐波:330, 660, 990, 1320, 1650, ...

两者在 660 Hz 处出现重合,而且很多谐波互相交织,听起来是融合的。

再试试 220 Hz 和 305 Hz。谐波序列几乎不重合,频率差会产生明显的拍频和粗糙感,听起来比较刺耳。

所以“协和”不是玄学,而是两个信号的谐波结构在频谱上有没有大量重叠。这个解释对理工生来说,比“听起来舒服”要有说服力得多。

6.3 十二平均律:一次精妙的近似

泛音列给出的是纯律音程,频率比是精确的整数比。但纯律有一个问题:如果严格按照 3:2 搭音阶,转调时会积累误差,演奏不同调式需要重新调音。

十二平均律的解决方案是:把八度平均分成 12 个半音,每个半音的频率比是:

2^(1/12) ≈ 1.059463

这样一来,任何调式都采用同一套音阶体系,转调变得非常方便。代价是少数音程与纯律有微小偏差。

比如纯五度在纯律中是精确的 3:2 = 1.5,而在十二平均律中是 2^(7/12) ≈ 1.4983,偏差很小,人耳几乎察觉不到。

理解这一点,你就知道钢琴为什么能用一套键盘弹所有调式了。本质上,十二平均律是用“轻微的频谱失配”换来了“极大的转调便利”,这是乐器设计史上最重要的工程决策之一。

7. 常见误区与排查思路

7.1 四个高频误区

初学阶段,以下四个误区最容易出现:

误区正确理解后果
音色 = 幅度谱完整复数谱才与声音一一对应,幅度谱丢相位,频谱图补时变合成音色时忽略包络,做出来很假
谐波 = 泛音谐波特指基频整数倍,泛音包含非整数倍成分分析打击乐器时漏掉关键特征
FFT 点数越大越好点数大频率分辨率高,但时间分辨率低,二者不可兼得分析短促音符时频谱模糊一片
音高只取决于基频基频缺失时,人耳会通过谐波间距感知虚拟基频低音混音时切掉基频,低音感仍然存在

最后一条很多做音频的工程师都踩过坑。电话语音带宽有限,基频可能被滤掉,但人耳照样能从谐波间隔中推断出音高,这叫“虚拟音高”现象。

7.2 分析频谱时的环境自检

如果你用 Python 分析音频时发现结果不对,按以下顺序排查:

  1. 检查采样率是否设置正确。采样率错误会导致频率轴整体偏移。
  2. 检查数据是否归一化。整型 WAV 不归一化直接做 FFT,频谱会偏大。
  3. 检查 FFT 窗口长度。窗口太短,低频分辨不出;窗口太长,瞬态变化被抹平。
  4. 检查是否只取了单声道。立体声不处理会得到混合结果,谐波结构可能不清晰。
  5. 检查是否有直流偏置。如果波形整体不在零轴附近,频谱的 0 Hz 处会出现巨大峰值,影响观察。

8. 工程实践建议:从理论学习到真实项目

8.1 用频谱思维做调音与混音

理解了频谱,再回来看音乐制作中的 EQ(均衡器),理解就会完全不同。

EQ 的本质就是对频谱的不同频段做增益或衰减。混音中常说“让吉他在 2kHz 处避开人声”,背后就是在频域上给两个乐器划清界限,减少遮挡感。

做混音时,可以先用频谱图分析所有轨道,找出冲突频段,再针对性 EQ。这个工作流比凭耳朵盲调更高效,尤其对刚开始接触混音的新手。

8.2 频谱分析相关工具链

除了 Python,工程中常用的频谱分析工具还有:

  • Audacity:开源音频编辑器,自带频谱图和频谱分析功能;
  • iZotope RX / Ozone:专业音频修复和母带处理工具,频谱可视化做得非常好;
  • Spek:轻量级频谱查看器,适合快速查看音频文件频谱;
  • SoX:命令行音频处理工具,可以输出频谱数据,适合批量处理。

采样率、FFT 点数、窗函数类型,这些参数在不同工具中都有对应设置。建议结合播放试听,把“频谱长什么样”和“听起来什么样”联系起来,逐步建立听觉与视觉的映射。

8.3 嵌入式频谱显示项目要点

如果你对硬件感兴趣,做实时频谱显示是一个很有意思的入门项目。常见方案是先用 ADC 或 I2S 采集音频,再用 FFT 计算幅度谱,最后把频谱画到 OLED、LCD 或 LED 点阵屏上。

以 STM32F407 为例,可以使用 ARM CMSIS-DSP 库中的arm_rfft_fast_f32完成实数 FFT,1024 点 FFT 在 168 MHz 主频下耗时很短,可以轻松达到实时刷新。ESP32 平台则可以借助 arduino-esp32 的 DSP 库或者直接调用 ESP-DSP 库。

做这类项目时,几个工程要点需要提前考虑:

  • 采样率与 FFT 点数决定频率分辨率,公式是 fs / N。比如 1024 点、44100 Hz 采样率,频率分辨率约 43 Hz,低频段会显得很粗。
  • 输入信号需要加窗函数。矩形窗频谱泄漏严重,汉宁窗适合大多数音乐信号。
  • 显示上限频率要结合奈奎斯特定理,最高只能显示采样率的一半。如果是 44.1kHz 采样,超过 22.05kHz 的频率都是混叠伪影。
  • MCU 内存紧张时,可以改用定点 FFT 或分段处理,避免一次性加载全部音频数据。

这类项目不需要很顶级的硬件,但能让你把本文的傅里叶变换知识真正落地成可触摸的东西。

9. 总结与下一步学习路线

这篇博客从一个有点反传统的角度切入乐理:先把音色翻译成频谱,再用频谱去理解乐理中的协和、不协和和调律体系。核心收获可以浓缩成几条:

  • 声音三要素中,音高对应基频,音量对应幅度,音色对应谐波结构;
  • 傅里叶变换把时域波形变成频域频谱,FFT 让这个变换在工程上可用;
  • 幅度谱是音色的主体,相位和包络决定细微差异;
  • 泛音列中的整数比关系,解释了协和音程的物理来源;
  • 十二平均律是用近似换转调便利的工程折中。

下一步可以按这个路线继续深入:

  1. 用傅里叶变换分析更多真实乐器声,建立常见音色频谱特征的感性认识;
  2. 学习短时傅里叶变换(STFT)和小波变换,掌握非平稳信号分析;
  3. 尝试 AUDACITY 或 Python 处理自己的录音,做 EQ 和滤波实验;
  4. 学习基本乐理体系时,随时追问“这个规则对应的频谱规律是什么”。

如果你只做一件事,建议合成一段“基频相同但谐波不同”的声音对比。耳朵听到的差异,和眼睛看到的频谱差异一一对应,这种体验会让你彻底记住“音色 = 频谱”这句话。

如果本文对你有帮助,可以收藏备用,也欢迎在实际动手遇到报错时回来对照排错。祝你在“理工生学乐理”这条路上,找到属于自己的频率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 19:36:19

新能源汽车电池缺陷检测数据集全解析:从标注规范到YOLOv8训练实践

简介&#xff1a;面向新能源汽车电池健康状态估计与剩余寿命预测研究&#xff0c;这份项目代码为智能汽车安全技术全国重点实验室发布的三元锂离子电池运行数据集提供了轻量级使用入口。原始数据采集自300辆真实运营车辆&#xff0c;覆盖0—50万公里里程、0.5—4年运行周期&…

作者头像 李华
网站建设 2026/9/4 20:52:23

Minecraft插件PlotSquared移植版

基于plosquared7.6.0的移植版兼容1.21.11Bukkit、1.21.11Spigot、1.21.11Paper需要FastAsyncWorldEdit (FAWE)作为前置插件下载连接&#xff1a;https://wwbmi.lanzoub.com/iMuHT45guxuj 提取码: 3pa7推荐配合Multiverse插件使用&#xff1a;使用 /mv create <世界名> no…

作者头像 李华
网站建设 2026/9/4 16:52:47

【干货】总结最详细图像去噪方法

图像降噪Image Denoising&#xff0c; 图像处理中的专业术语。是指减少数字图像中噪声的过程&#xff0c;有时候又称为图像去噪。噪声是图像干扰的重要原因。一幅图像在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。根据噪声和信号的…

作者头像 李华
网站建设 2026/9/3 15:53:17

充电桩管理平台搭建全攻略:OCPP协议、小程序与对账实战

简介&#xff1a;这套充电桩系统源码包是面向新能源汽车充电设施开发者与运营方的完整技术方案&#xff0c;整合了充电桩平台、充电桩系统、充电桩管理系统、管理后台及微信小程序端。压缩包共十三个文件&#xff0c;其中十个Java文件承载核心业务逻辑&#xff0c;涵盖充电控制…

作者头像 李华
网站建设 2026/9/4 21:36:58

【人工智能每日精选】从微米级贴片到6G高速链路:机器学习如何优化THz MIMO天线?

6G 和高容量物联网需要更高的数据速率、更低的通信时延和更密集的设备连接。THz 频段能够提供巨大的可用带宽&#xff0c;因此被认为是未来短距离超高速通信和高分辨率感知的重要候选频段。但频率越高&#xff0c;天线设计越困难。THz 信号传播损耗大、有效传输距离短&#xff…

作者头像 李华
网站建设 2026/9/3 18:43:54

AI Native Web开发实战:从架构到代码的完整指南

简介&#xff1a;面向现代 Web 开发者与 AI 应用工程师&#xff0c;这份代码包完整呈现了人工智能原生 Web 产品从架构设计到生产落地的实战路径&#xff0c;核心聚焦在项目启动之初就将 AI 能力作为一等公民的系统性方法论&#xff0c;涉及前后端技术选型、模块划分与数据流设…

作者头像 李华