信号处理基础回顾:傅里叶变换、短时傅里叶变换(STFT)、时频谱图的概念、分贝(dB)与信噪比(SNR)
做深度学习降噪,说白了就是跟声音信号打交道。你想想看,如果连信号的基本特性都搞不清楚,怎么指望模型能学好?这一章我会带你快速过一遍最核心的几个概念。别担心,我不会堆公式,而是用我这些年踩过的坑来帮你理解。
核心观点:深度学习降噪的本质,是在时频域里做「信号与噪声的分离」。不理解时频谱图,你连模型在学什么都看不懂。
2.1 傅里叶变换:从时域到频域的「翻译官」
我记得刚入行时,导师跟我说过一句话:「傅里叶变换就是让你换个角度看世界。」当时觉得玄乎,后来才明白——时域里纠缠不清的信号,到了频域里往往一目了然。
简单来说,傅里叶变换能把一段随时间变化的波形,拆解成不同频率的正弦波分量。比如一段人声,时域波形看起来乱糟糟的,但傅里叶变换后,你就能看到哪些频率是说话声,哪些是背景噪声。
不过,经典傅里叶变换有个致命缺陷:它假设信号是平稳的。什么意思?就是它认为信号的频率成分在整个时间轴上都不变。但现实中的语音、音乐、环境噪声,哪个不是随时间变化的?
注意:经典傅里叶变换只告诉你「信号里有哪些频率」,却无法告诉你「这些频率在什么时间出现」。对于非平稳信号(比如语音),这个信息远远不够。
2.2 短时傅里叶变换(STFT):给信号加个「滑动窗口」
为了解决上面那个问题,有人想了个办法:既然信号整体是非平稳的,那我把它切成一小段一小段,假设每小段里是平稳的,不就行了?这就是短时傅里叶变换(STFT)的核心思想。
具体做法是:用一个固定长度的窗口(比如汉明窗),沿着时间轴滑动,对每一段加窗后的信号做傅里叶变换。这样,你就能得到「频率随时间变化」的信息了。
这里有几个关键参数,我建议你记牢:
- 窗口长度(window length):决定了频率分辨率和时间分辨率的平衡。窗口越长,频率分辨率越高,但时间分辨率越低。反之亦然。
- 帧移(hop length):相邻窗口之间的步长。通常设为窗口长度的一半或四分之一。
- FFT点数(n_fft):做傅里叶变换的点数,一般等于或大于窗口长度。
我的经验:做语音降噪时,我习惯用 32ms 的窗口长度(采样率 16kHz 下对应 512 点),帧移设为 8ms(128 点)。这个配置在大多数场景下效果都不错。当然,具体参数还是要根据你的任务来调。
下面这个 SVG 图展示了 STFT 的核心流程:
2.3 时频谱图:深度学习降噪的「画布」
STFT 的输出,就是时频谱图(spectrogram)。你可以把它想象成一张二维图像:横轴是时间,纵轴是频率,每个像素点的颜色深浅代表该时刻该频率的能量大小。
为什么深度学习降噪要用时频谱图?原因很简单:
- 结构清晰:语音在时频谱图上呈现出明显的谐波结构(那些水平条纹),而噪声往往分布更均匀。模型很容易学会区分它们。
- 适合 CNN:时频谱图本质上就是一张「图像」,可以直接用卷积神经网络(CNN)来处理。
- 信息完整:保留了时间和频率两个维度的信息,比单纯用波形或频谱都更丰富。
重要概念:时频谱图通常用幅度谱(magnitude spectrogram)或功率谱(power spectrogram)。幅度谱是 FFT 结果的值,功率谱是幅度的平方。深度学习降噪中,我们通常处理的是幅度谱,相位信息在增强后从原始信号中借用。
2.4 分贝(dB)与信噪比(SNR):量化「噪声有多大」
做降噪,你得有个标准来衡量「降了多少」。分贝和信噪比就是最常用的两个指标。
2.4.1 分贝(dB)
分贝是个对数单位,用来表示两个量之间的比值。在音频领域,我们常用 dB 来表示声音的强度:
dB = 10 * log10(P / P_ref)
其中 P 是信号功率,P_ref 是参考功率。人耳对声音的感知是对数级的,所以用 dB 更符合听觉特性。
举个例子:
- 0 dB:人耳刚能听到的声音
- 30 dB:安静的图书馆
- 60 dB:正常交谈
- 90 dB:繁忙的街道
- 120 dB:喷气式飞机起飞(会损伤听力)
我的习惯:在代码里,我经常把时频谱图转换成 dB 尺度再送入模型。因为原始幅度谱的动态范围太大(可能相差几个数量级),模型很难学。转换成 dB 后,数值范围更集中,训练也更稳定。
2.4.2 信噪比(SNR)
信噪比衡量的是信号与噪声的功率比值,单位也是 dB:
SNR(dB) = 10 * log10(P_signal / P_noise)
SNR 越高,说明信号越「干净」。比如:
- SNR = 20 dB:信号功率是噪声的 100 倍,听起来很清晰
- SNR = 0 dB:信号和噪声功率相等,听起来比较嘈杂
- SNR = -5 dB:噪声比信号还强,很难听清内容
在深度学习降噪中,我们常用 SNR 来评估模型性能。不过要注意,SNR 只是一个客观指标,有时候 SNR 提高了,但听觉感受不一定好。我遇到过不少案例,模型把 SNR 提得很高,但语音听起来「失真」了——这就是典型的「指标好看,听感翻车」。
避坑指南:我曾经在一个项目里只盯着 SNR 调模型,结果 SNR 涨了 3 dB,但用户反馈说「声音像机器人」。后来我才意识到,除了 SNR,还要关注 PESQ、STOI 等感知指标,以及最重要的——人耳试听。
2.5 本章小结
好了,这一章的内容就到这里。我们回顾了傅里叶变换、STFT、时频谱图、分贝和信噪比这几个核心概念。这些知识是深度学习降噪的基石,后面的章节会反复用到它们。
嗯,说实话,这些概念看起来简单,但真正用好它们需要大量实践。我建议你动手写几行代码,用 Python 的 librosa 或 torchaudio 库,把一段音频的时频谱图画出来,再试试不同的窗口长度和帧移,看看效果有什么变化。亲手做一遍,比看十遍文章都管用。