音频处理6_时频图
介绍 时频表征-分析 (time-frequency representation/analysis) 常用的 时频图
将时变信号的 “时域”(time domain)和 “频域” (frequency domain)放在一张图上称为:时频图(spectrogram)。
具体方法是:
- 将连续信号划分为足够短的离散序列(通过滑动窗口sliding windowns)
- 序列前后会有重叠以保证信号不失真
- 计算序列中的每一个片段的频谱(Spetrum)
- X轴是时间序列,Y轴是频率范围,另外加一个颜色条代表某一频率的强度(值)
1. 概念
1.1 时频图
- amplitude(振幅):
振幅指时域信号的瞬时强度或波的高度,它表示信号的最大偏离平均值的程度。
对于一个正弦波信号,振幅是从波的中心线到波峰(或波谷)的距离。
- magnitude(幅值)
幅值是频域信号的强度,是傅里叶变换后,频谱中每个频率分量的大小。
幅值可以看作是复数频谱的模,即实部和虚部的平方和的平方根。
因此,时频图没有振幅信息,只有时间t,频域范围和频域强度
librosa库自带小号音频的代码样例:
y, sr = librosa.load(librosa.example('trumpet')) # y.shape = (117601,) sr = 22050
n_fft = 2048
hop_length = 512
D = librosa.stft(y, n_fft=n_fft, hop_length=hop_length) #计算STFT D.shape = (1025, 230)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max) # 计算幅值谱 S_db.shape = (1025, 230)
total_duration = len(y) / sr # 总时长
time_steps = np.arange(D.shape[1]) * hop_length / sr # 时间步长
librosa.display.specshow(S_db, sr=sr, hop_length=hop_length, x_axis='time', y_axis='linear')
# y_axis=‘log’
x 轴:
- 总时长(秒) total_duration = len(y) / sr = 117601/ 22050 = 5.33 seconds
- 时间帧数 frame = signal_length/ hop_length(向上取整) = 117601/512 = 230
- 时间步长: time_steps = total_duration / frame = 0.23 sec
y 轴:
- 线性最大频率(Hz) = sr / 2 = 22050 / 2 = 11025 (log会被压缩,并放大低频刻度)
- 频率点 = n f f t / 2 + 1 = 2048 / 2 + 1 = 1025 n_{fft} / 2 + 1 = 2048 / 2 + 1 = 1025 nfft/2+1=2048/2+1=1025 (y轴内的刻度数量)
- 频率分辨率 = sr / n f f t n_{fft} nfft = 22050 / 2048 = 10.766
如果是log对数刻度,低中频范围更宽
结果1(stft的能量谱D, y为复数矩阵的绝对值):
结果2(计算幅值转分贝, 即y轴是S_db):
需要librosa.amplitude_to_db, 即
dB = 20 l o g 10 a m p l i t u d e n p . m a x 20log_{10}\frac{amplitude}{np.max} 20log10np.maxamplitude
np.max表述输入信号的最大值,用于归一化
结果3(y轴由线性linear,改为对数log):
中低频在y轴内更宽 (0-512Hz占一半,512-8192Hz占另一半)
1.2 梅尔时频图
梅尔尺度是一种非线性频率尺度,更接近于人耳的听觉感知。具体步骤如下:
-
频谱平滑:应用梅尔滤波器组对 STFT 结果进行加权和求和,以得到梅尔频谱。
-
频率分辨率:梅尔滤波器在低频部分有较高的分辨率,在高频部分有较低的分辨率,符合人耳对不同频率的感知特性。
-
鲁棒性:平滑处理去除了频谱中的微小波动和噪声,使得提取的特征更加稳定和可靠。
包含冗余信息,反映频率能量分布,符合人耳听觉感知, mel谱如下:
2.梅尔频率倒谱系数
2.1 倒谱(Cepstrum)
首先区分频谱和倒谱
- Spectrum(频谱)
频谱是信号在频域中的表示,通过傅里叶变换将时间域信号转换为频域信号,包含不同频率成分的幅度和相位信息。
频谱可识别周期性信号、诊断噪声。
- Cepstrum(倒谱)
倒谱是对频谱的傅里叶变换的对数进行逆傅里叶变换得到,包含频谱中的周期性结构信息。
倒谱适用于分析回声延迟、声源与声道分离等特征提取。
2.2 MFCCs
梅尔频率倒谱系数(Mel-frequency cepstral coefficients, MFCCs)用于语音识别和音频分类中的常用特征。计算 MFCC 包括:
-
对音频信号进行短时傅里叶变换(STFT),得到频谱(即切割为小段,每段转为频谱)。
-
应用梅尔滤波器组,将频谱转换为梅尔频谱(用三角滤波器, 转换为Mel-scale的刻度)。
-
取对数梅尔频谱,再离散余弦变换(DCT)得到MFCCs。
相比mel丢失一些信息, MFCCs对非线性关系敏感,维度更低,特征独立,传统模型适用性强
整合预处理和Mel谱的转换步骤如下:
- 预加重滤波(Pre-Emphasis),
- 音频切片 (Slide / Framing)
- 窗口函数 (Window)
- mel滤波转换(Filter Bank)
- 离散余弦变换(DCT)
- 均值归一化 (Normalize)
注:前4步都是“mel时频图”计算,且取了对数单位将频率强度换为分贝dB单位
3. 离散余弦变换
3.1 公式
离散余弦变换 (Discrete cosine transform)的公式如下:
X [ k ] = α ∑ n = 0 N − 1 x [ n ] cos ( π N ( n + 1 / 2 ) k ) X[k] = \alpha \sum^{N-1}_{n=0}x[n]\cos(\frac{\pi}{N}(n+1/2)k) X[k]=α∑n=0N−1x[n]cos(Nπ(n+1/2)k)
其中:
- α \alpha α是归一化系数,如保证变化正交性
- x [ n ] x[n] x[n]是变换前的序列
- 余弦项是DCT的核心变换函数
3.2 MFCCs解析
区别于一般倒谱,MFCCs使用DCT,而不是逆傅立叶变换,因此得到的是实数,而非复数
MFCCs的特点如下:
-
MFCCs用DCT目的是将信号能量进一步压缩到少数几个系数
-
MFCCs是mel时频图的进一步压缩
-
MFCCs以提取周期性特征,弱化频率特征。
下一节讲将音频从时序wave信号,变为mel时频图,最后到MFCCs的代码和可视化。
Reference
- https://github.com/disanda/d_code/tree/master/3.Audio/5_mel_num