3、数字信号处理基础(上):傅里叶变换(FT)与短时傅里叶变换(STFT)。频谱与语谱图。
各位同学好,欢迎来到《语音增强与降噪技术实战》的第三讲。今天咱们聊聊数字信号处理里最核心的两个工具:傅里叶变换和短时傅里叶变换。说白了,没有它们,语音增强这事儿基本干不了。
我记得刚入行那会儿,带我的老工程师跟我说过一句话:「搞语音,先学会看频谱,再看语谱图,最后才是算法。」当时我不太理解,后来踩了不少坑才明白——你连信号长什么样都看不清,怎么去降噪?
3.1 从时域到频域:傅里叶变换(FT)
咱们平时录到的语音信号,是随时间变化的波形。这叫时域表示。但时域信号有个问题——你很难一眼看出里面有哪些频率成分。
举个例子,一段录音里混了50Hz的工频噪声,你在波形图上看到的只是一堆乱糟糟的起伏。但用傅里叶变换一转,频域里50Hz处就会冒出一个尖峰。这就是FT的厉害之处:把信号从时间轴掰到频率轴上去看。
核心公式(连续形式):
X(f) = ∫ x(t) · e^(-j2πft) dt
简单理解:把信号x(t)和不同频率的复指数做内积,看看哪个频率成分贡献大。
实际工程里,我们处理的是离散采样信号。所以用的是离散傅里叶变换(DFT),以及它的快速实现——FFT。我个人习惯用FFT长度取1024或2048,既能保证频率分辨率,计算量也适中。
我的经验:做语音增强时,FFT点数最好选2的幂次。不是玄学,是FFT算法本身要求这样。我曾经图省事用了非2的幂次,结果计算慢了一倍多,还容易出bug。
3.2 傅里叶变换的局限:为什么需要STFT?
FT有个致命问题:它假设信号是平稳的。但语音信号呢?你想想看,一句话里,元音、辅音、停顿,频率特性一直在变。用FT对整个句子做一次变换,得到的是所有时刻频率的平均值——这有啥用?
比如你说「你好」,FT只能告诉你这句话里大致有哪些频率,但说不清「你」和「好」分别是什么时候说的。这就好比把一整部电影压缩成一张照片,你只能看到颜色分布,看不到剧情发展。
所以,我们需要一种能同时看到时间和频率的工具。这就是短时傅里叶变换(STFT)登场的时候了。
3.3 短时傅里叶变换(STFT)
STFT的思路很朴素:把信号切成一小段一小段,假设每小段里信号是平稳的,然后对每一段分别做FT。
具体怎么做?
- 加窗:用一个滑动窗口(比如汉明窗)截取信号的一小段。
- FFT:对这一段做傅里叶变换,得到这一时刻的频谱。
- 滑动:窗口往前移动一个步长,重复上述过程。
最终得到的是一个二维矩阵:行代表时间帧,列代表频率点。这个矩阵就是语谱图的基础。
STFT公式(离散形式):
X(m, k) = Σ x[n] · w[n - mR] · e^(-j2πkn/N)
其中:m是帧索引,k是频率索引,w是窗函数,R是帧移,N是FFT长度。
这里有个关键参数:帧移。帧移越小,时间分辨率越高,但计算量也越大。我一般设帧移为窗长的一半,也就是50%重叠。这样既能保证时间连续性,又不会太浪费算力。
避坑指南:我曾经在做一个实时降噪项目时,为了省计算量把帧移设成了窗长的75%。结果呢?语音听起来像机器人,有严重的「咔咔」声。后来才发现,帧移太大导致帧间不连续,重建时出现了相位跳变。嗯,这里要注意:帧移和窗长要匹配好,一般推荐25%-50%重叠。
3.4 频谱与语谱图
好,现在咱们有了STFT的结果,怎么把它可视化出来?
频谱:就是某一时刻(某一帧)的幅度随频率变化的曲线。横轴是频率(Hz),纵轴是幅度(dB)。你可以把它理解成「当前这一瞬间的声音成分分布」。
语谱图:把每一帧的频谱按时间排列,用颜色表示幅度大小。横轴是时间,纵轴是频率,颜色深浅代表能量强弱。这就是语音信号处理里最常用的「眼睛」。
我刚开始学的时候,总觉得语谱图花花绿绿的看不懂。后来带我的师傅说:「你把它想象成钢琴的琴键。横轴是时间,纵轴是音高,颜色亮的地方就是弹得响的音。」这么一想,豁然开朗。
实用技巧:看语谱图时,重点关注三个东西:
- 谐波结构:元音部分会出现水平条纹,那是基频及其倍频。
- 噪声区域:均匀分布的「雾状」区域,往往是背景噪声。
- 瞬态事件:垂直的亮线,比如爆破音「p」「t」。
能分清这三样,你就算入门了。
3.5 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图。你可以把它当作一张地图,随时回来看看自己走到哪了。
从这张图可以看得很清楚:我们从时域信号出发,先学FT理解频域概念,再通过STFT引入时间维度,最后得到频谱和语谱图这两个核心工具。每一步都有它的物理意义和工程考量。
3.6 本章小结
好了,这一讲的内容就到这里。咱们回顾一下重点:
- FT 把信号从时域变到频域,但丢失了时间信息。
- STFT 通过加窗和滑动,同时保留时间和频率信息。
- 频谱 是某一时刻的频率快照,语谱图 是时间-频率-能量的三维展示。
- 参数选择(窗长、帧移、FFT点数)直接影响分析效果,需要根据实际场景调整。
我个人觉得,学这部分内容最忌讳的就是死记公式。你只要理解了一个核心思想:语音信号是非平稳的,所以我们需要用STFT把它切成一段段近似平稳的小块来处理。剩下的,都是工程细节。
下一讲咱们会深入聊窗函数的选择、相位问题,以及怎么用Python把STFT和语谱图画出来。到时候我会分享一些我踩过的坑,保证实用。