一、STFT(短时傅里叶变换)的详细原理与公式
1.1 傅里叶变换的局限性与STFT的诞生
傅里叶变换(FT)能将时域信号x(t)x(t)x(t)转换为频域表示X(ω)X(\omega)X(ω),公式为:
X(ω)=∫−∞∞x(t)e−jωtdt(1) X(\omega) = \int_{-\infty}^{\infty} x(t) e^{-j\omega t} dt \tag{1}X(ω)=∫−∞∞x(t)e−jωtdt(1)
其中ω=2πf\omega = 2\pi fω=2πf为角频率,fff为频率(Hz)。
但FT的缺陷是完全丢失了时间信息——只能得到信号中“有哪些频率”,无法知道“这些频率在何时出现”。例如,一段包含钢琴声和鼓声的音频,FT只能告诉你总频谱中有哪些频率成分,却无法区分钢琴声和鼓声的时间先后。
为解决这一问题,STFT通过**“加窗分段”**的方式,在“时间局部性”和“频率分辨率”之间取得平衡:将长信号切割为多个短时片段(假设每个片段是“平稳的”),对每个片段单独做傅里叶变换,最终拼接出“时间-频率”平面的能量分布。
1.2 STFT的数学定义
连续时间下,STFT定义为:
STFT(τ,ω)=∫−∞∞x(t)g∗(t−τ)e−jωtdt(2) \text{STFT}(\tau, \omega) = \int_{-\infty}^{\infty} x(t) g^*(t - \tau) e^{-j\omega t} dt \tag{2}STFT(τ,ω)=∫−∞∞x(t)g∗(t−τ)e−jωtdt(2)
其中:
- τ\tauτ为“时间中心”(窗函数的滑动位置,对应横轴时间);
- g(t)g(t)g(t)为窗函数(如汉宁窗、矩形窗),g∗(t)g^*(t)g∗(t)为其共轭;
- 物理意义:用窗函数g(t−τ)g(t - \tau)g(t−τ)截取t=τt = \taut=τ附近的信号片段,再对该片段做傅里叶变换,得到该时刻的频率谱。
1.3 离散化实现(实际工程中)
实际处理数字音频时,信号是离散的(采样率为fsf_sfs,单位Hz),需对STFT离散化:
分帧:将离散信号x[n]x[n]x[n](nnn为采样点索引)按窗长NNN分成多个帧,第mmm帧为xm[n]=x[n+m⋅S]⋅w[n]x_m[n] = x[n + m \cdot S] \cdot w[n]xm[n]=x[n+m⋅S]⋅w[n],其中:
- SSS为帧移(相邻帧的采样点间隔,通常取S=N/2S = N/2S=N/2以减少帧间信息丢失);
- w[n]w[n]w[n]为离散窗函数(如汉宁窗:w[n]=0.5(1−cos(2πn/N))w[n] = 0.5(1 - \cos(2\pi n/N))w[n]=0.5(1−cos(2πn/N)),0≤n<N0 \leq n < N0≤n<N)。
傅里叶变换:对每帧做离散傅里叶变换(DFT):
Xm[k]=∑n=0N−1xm[n]e−j2πkn/N(3) X_m[k] = \sum_{n=0}^{N-1} x_m[n] e^{-j2\pi kn/N} \tag{3}Xm[k]=n=0∑N−1xm[n]e−j2πkn/N(3)
其中kkk为频率索引,对应频率fk=k⋅fs/Nf_k = k \cdot f_s / Nfk=