2. 时域与频域:傅里叶变换的直观理解,频谱图与语谱图的解读

说实话,我刚入行做音频处理那会儿,最头疼的就是傅里叶变换。课本上全是积分公式和复指数,看得人头皮发麻。后来在项目里调降噪算法,天天跟频谱图打交道,才慢慢悟出来——这东西说白了就是换个角度看声音。

你想想看,我们平时听到的音乐、说话声,在示波器上显示的都是随时间变化的波形。这就是时域。但很多时候,光看波形根本看不出门道。比如一段录音里有嗡嗡的电流声,时域上你只能看到一堆乱糟糟的波形,根本不知道那个噪声到底是多少赫兹。

这时候就需要频域了。傅里叶变换干的事,就是把时域信号拆解成不同频率的成分。就像把一杯混合果汁,分离出橙汁、苹果汁、西瓜汁各有多少毫升。

核心理解:傅里叶变换不是魔法,它只是告诉我们——任何一个复杂的信号,都可以看作无数个不同频率、不同振幅、不同相位的正弦波叠加而成。

2.1 从时域到频域:傅里叶变换在干什么?

先别管公式。我习惯用一个比喻来理解:

  • 时域:你站在音乐厅里,听到乐队演奏的全曲。声音随时间起伏,有高潮有低谷。
  • 频域:你拿到乐谱,看到每个乐器在哪个音高上演奏了多少拍。小提琴多少Hz,大提琴多少Hz,清清楚楚。

傅里叶变换就是那个把“演奏”变成“乐谱”的过程。它把时间轴上的信号,映射到频率轴上。

数学上,连续傅里叶变换的公式长这样:

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

别被这个式子吓到。我在项目里几乎从来不用手算这个。实际做音频DSP,我们用的是离散傅里叶变换(DFT),以及它的快速版本FFT。计算机只能处理离散的采样点,所以公式变成:

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

其中 N 是帧长,x[n] 是时域采样值,X[k] 就是第 k 个频率分量的复数结果。

我的经验:刚开始做降噪时,我总纠结于FFT的数学推导。后来发现,只要理解输入输出就够了——输入是一段时域波形(比如1024个采样点),输出是512个频率点的幅度和相位信息。剩下的,交给库函数去算。

2.2 频谱图:频率成分的“快照”

频谱图,就是某一时刻信号的频率分布。横轴是频率(Hz),纵轴是幅度(dB或线性值)。

举个例子,一个1000Hz的正弦波,它的频谱图就是一根竖线,在1000Hz的位置。如果是一个包含基频和泛音的乐音,频谱图上就会有一排竖线,基频最低,泛音依次升高。

我在做噪声检测时,经常用频谱图来快速定位问题:

  • 50Hz/60Hz 的尖峰:大概率是工频干扰,电源没处理好
  • 宽频带的隆起:可能是白噪声或者风扇噪声
  • 某个频段突然凹陷:可能是房间的梳状滤波效应
频谱特征 可能的噪声源 处理思路
单一频率尖峰 电源哼声、电机转动 陷波滤波器(Notch Filter)
宽频带噪声 白噪声、环境底噪 谱减法、维纳滤波
周期性脉冲 键盘敲击、机械碰撞 门控(Gate)或中值滤波
高频嘶声 录音设备底噪、量化噪声 低通滤波或降噪算法

避坑指南:我曾经在分析一段录音时,看到频谱图上有个明显的尖峰,以为是环境噪声。折腾了半天滤波器,结果发现是录音设备本身的晶振泄漏。所以,拿到频谱图先确认一下,这个频率成分到底来自信号还是设备。

2.3 语谱图:声音的“时频图”

频谱图只能看某一瞬间。但声音是随时间变化的,尤其是语音。这时候就需要语谱图(Spectrogram)了。

语谱图有三维信息:

  • 横轴:时间
  • 纵轴:频率
  • 颜色深浅:能量大小(越亮/越深表示能量越强)

你可以把语谱图想象成把频谱图一帧一帧地拼起来,然后从上往下看。每一帧的频谱竖着放,时间轴横着走。

做语音降噪时,语谱图是我的主力工具。为什么?因为语音和噪声在时频域上往往有不同模式:

  • 语音:有明显的谐波结构(横条纹),能量集中在低频和中频,随时间变化快
  • 稳态噪声:在某个频段上颜色均匀,随时间变化慢
  • 突发噪声:在某个时间点突然出现,覆盖很宽的频率范围

我习惯在调试降噪算法时,同时打开原始音频和降噪后音频的语谱图对比。如果降噪后语音的谐波结构还清晰,说明算法保真度好;如果谐波糊成一片,那就是过降噪了。

2.4 知识体系:时频分析的核心逻辑

下面这张图,是我自己总结的时频分析知识框架。每次带新人时,我都会先让他们看这个。

时频分析知识体系 音频信号 时域分析 频域分析 波形图 频谱图 傅里叶变换 短时傅里叶变换 (STFT) 语谱图(时频图) 语音识别 降噪滤波 声源分离 核心逻辑:时域 → 傅里叶变换 → 频域 → STFT → 时频联合分析 → 实际应用

2.5 实际项目中的小技巧

最后分享几个我在项目中积累的经验:

  1. 帧长选择:做FFT时,帧长决定了频率分辨率和时间分辨率的平衡。帧长越长,频率分辨率越高,但时间分辨率越低。我一般用1024或2048点,采样率48kHz时,频率分辨率大约23Hz或11Hz。
  2. 窗函数:直接对信号截断做FFT会产生频谱泄漏。加窗可以缓解。汉宁窗(Hanning)最常用,兼顾了主瓣宽度和旁瓣衰减。
  3. 重叠率:做STFT时,帧与帧之间一般重叠50%到75%。重叠越多,语谱图越平滑,但计算量也越大。
  4. 看语谱图的习惯:我每次调试降噪参数,都会先看静音段的语谱图,确认噪声底噪的分布。然后再看语音段,确认语音没有被损伤。

一个小工具:如果你手边没有专业软件,可以用Python的librosa库,几行代码就能画出语谱图。我个人经常用它快速验证想法。

嗯,时域和频域的理解,是音频DSP的基石。后面的降噪滤波器、自适应算法,全都建立在这个基础上。把这一章吃透了,后面的路就好走了。