傅里叶变换(Fourier Transform)
核心思想
傅里叶变换是一种将信号或函数分解成不同频率成分的数学工具,核心思想基于一个惊人的假设:任何周期性的波形,无论看起来多么复杂,都可以看作是无数个不同频率、不同振幅和不同相位的正弦波(或余弦波)的叠加。
- 频率 (Frequency):波动的快慢。比如,高音对应高频,低音对应低频。
- 振幅 (Amplitude):波的高度,代表了信号的强度或能量。在声音里,就是响度。
- 相位 (Phase):波在时间轴上的起始位置。
两种视角:时域 vs. 频域
傅里叶变换让我们可以在两个不同的“世界”里观察同一个信号:时域 (Time Domain):这是我们最熟悉的视角。横轴是时间,纵轴是信号的幅度。它告诉我们信号在“什么时候”发生了什么。比如,一个音乐波形图,我们能看到哪里声音大,哪里声音小。 频域 (Frequency Domain):这是傅里叶变换后的视角。横轴是频率,纵轴是幅度(或能量)。它告诉我们信号“主要由哪些频率构成”。比如,一个音乐的和弦,在频域里会显示出组成这个和弦的几个清晰的峰值。
计算过程
1.核心物理思想:探针与内积
想象你有一团复杂的信号 $f(t)$(比如一段混合了钢琴和小提琴的录音)。你想知道这里面有没有 440Hz(A音)的声音。傅里叶变换的做法是:构造一个标准的 440Hz 正弦波,让它与原始信号相乘,然后对结果进行积分(求和)。 如果信号中含有 440Hz:当两者的波峰和波谷对齐时,乘积总是正数,积分的结果就会很大(形成一个峰值)。如果信号中不含 440Hz:两者相乘时,时而正、时而负,积分的结果会相互抵消,趋近于零。 这就是傅里叶变换的计算逻辑:它让原始信号 $f(t)$ 去和每一个可能频率的波进行“相关性检验”。检验结果(即积分值)就是该频率的强度。
2.数学表达:傅里叶变换公式
$$ F(\omega) = \int_{-\infty}^{\infty}f(t)\cdot e^{-i\omega t}dt $$
根据欧拉公式:
$$ e^{-i\omega t} = \cos(\omega t) - i\sin(\omega t) $$所以,公式可以改写成:
$$ F(\omega) = \int_{-\infty}^{\infty}f(t)\cdot [\cos(\omega t) - i\sin(\omega t)]dt $$
其中:$f(t)$:待分析的原始信号(随时间变化的函数);$\cos(\omega t)$: 用来探测“余弦波”成分(对应波的对称性);$\sin(\omega t)$:用来探测“正弦波”成分(对应波的相位)。$F(\omega)$:计算结果。它是一个包含实部和虚部的复数。|$F(\omega)$| 代表该频率的强度(能量大小)。
3.离散傅里叶变换
上述公式是在数学上的连续形式。但在计算机里,我们处理的数据是离散的(每隔一段时间采一个点),且数据长度是有限的。因此,计算机使用的是 离散傅里叶变换。 假设我们采集了 $N$个样本点,记为 $x[n]$其中 $n = 0 , 1 , 2 , \cdots , N−1(n=0,1,2,...,N−1)$。
计算过程可以分为以下 4 步:
- 第 1 步:准备探针(基函数):计算机要分析的频率不是无限多个,而是与样本数 $N$ 相关的 $N$个特定频率。它构造一系列的数字探针,这些探针就是复数旋转向量(对应正弦和余弦的离散形式)。
- 第 2 步:点对点相乘:对于你想检查的某个频率 $k$,计算机将原始信号 $x[n]$ 的每一个点,与探针 $e^{−i2\pi kn/N}$ 对应的点相乘。
- 第 3 步:求和:把上一步乘出来的所有结果加起来,得到一个总和。这个总和就是 $X[k]$(对应频率 $k$ 的变换结果)。
- 第 4 步:重复:重复步骤 1-3,遍历所有的 $k$ 值(从 0 到N−1),得到完整的频域数据。
离散形式的傅里叶变换公式:
$$ X[k] = \sum_{n=0}^{N-1}x[n] \cdot \left [ \cos \left( \frac{2\pi kn}{N} \right) - i\sin \left(\frac{2\pi kn}{N} \right) \right] $$
如果你直接用$DFT$公式计算,得到的结果 $X[k]$是一个复数。它的模$ |X[k]|$ 的大小是幅度:
$$ \text{mag}[k] = |X[k]| = \sqrt{\text{Re}(X[k])^2 + \text{Im}(X[k])^2} $$
$X[k]:DFT$输出的复数,$\text{Re}$:实部(余弦分量的强度),$\text{Im}:$虚部(正弦分量的强度),$|X[k]|$复数的模(幅度)
快速傅里叶变换(FFT)
你可能会想:按照上面的步骤,如果有 $N$ 个点,就要算 $N$ 个频率,每个频率要做 $N$ 次乘加,总共大约是 $N^2$ 次计算。普通 $DFT$时间复杂度是 $O(N^2)$,而$FFT$利用旋转因子的对称性和周期性,把计算量降低到$O(N\log N)$。
时频图
理解了傅里叶变换能把信号从时间域变到频率域,但标准的傅里叶变换有一个"缺陷":它丢掉了时间信息。时频图,就是为了解决这个问题而生的。它不再是一个二维平面(频率-强度),而是一个三维立体图(时间-频率-强度),能同时看到信号的频率成分随时间的变化。绘制时频图主要方法:短时傅里叶变换$STFT$,既然对整个信号做一次傅里叶变换会丢掉时间信息,那我就把信号切成很多小段,对每一小段分别做傅里叶变换。
实现步骤:
- 第一步:选择一个窗函数:选择一个固定长度的"窗口",比如256个采样点。这个窗口像一把尺子,用来从长信号中截取一小段。
- 第二步:滑动窗口并计算:从信号开头开始,用窗口截取一段信号,对这256个点做FFT(快速傅里叶变换),得到这一小段时间内的频谱。然后将窗口向右滑动一段距离(比如滑动128个点),再截取下一段,再做FFT...直到滑到信号末尾。
- 第三步:堆叠成图:把所有小段的频谱按时间顺序排列:
- 横轴:时间(窗口的中心位置)
- 纵轴:频率(FFT计算出的频率)
- 颜色/亮度:该时刻、该频率的强度
QkCalc中的离散傅里叶变换DFT计算
在趣宽数学软件中,通过“数字信号”菜单中的“离散傅里叶变换”中提供了基于快速傅里叶变换(FFT)的信号频谱分析。该模块可以对一个音频文件的信号进行分析并绘制波形和时频图,并计算信号的能量幅度谱,借助可视化的图形来分析数字信号。也可以通过离散傅里叶变换计算器,计算输入的数字信号的傅里叶变换的结果。