文章目录
1. 前言
语谱图(spectrogram或specgram),也叫声谱图,可以简单看做一个二维矩阵,其纵轴表示频率,横轴表示时间,矩阵的值表示能量强弱。由于它拥有着频率和时间两个维度的信息,所以是比较综合地表示原语音信息的一种特征。另外,我将其看做语音和图像的一种连接,因为图像领域的模型发展得较快,所以通过这种方式把语音转换成一种特殊的图像再进一步处理。
2. 语谱图流程简介
- 将语音可交叉地分成多帧(由于语音的短时平稳性)
- 各帧加窗
- 各帧通过快速傅里叶变化(fft)得到频谱向量
- 沿着时间轴并联各频谱向量得到语谱图
3. 语谱图的提取
3.1 语谱图的matlab提取
先看一段非官方代码,结合上述步骤进行理解。
[x,Fs,nBits]=wavread('audio.wav');
s=length(x); % 信号长度
w=256; % 窗长
n=w; % nfft,表示做fft变换需要的点数,一般为刚大于w的2的幂。举例,w=250,则n一般设为256
ov=w/2; % 分帧的交叉程度,常见设为窗长的二分之一或四分之一
h=w-ov; % 不重叠点数
win=hamming(n)';% 选了常见的汉明窗,并设置nfft
c=1; % 指向当前帧的指针
ncols=1+fix((s-n)/h); % 计算总共有多少帧
d=zeros((1+n/2),ncols); % 语谱图初始化
for b=0:h:(s-n) % 以下处理各帧
u=win.*x((b+1):(b+n)); % 各帧加窗
t=fft(u,n); % 各帧进行fft,内容为u,nfft=n。对于fft,输入n个时域点,输出n个频域点
d(:,c)=t(1:(1+n/2))';</

本文详细介绍了语谱图的原理及其在MATLAB和Python中的实现,包括非官方代码示例和官方函数的使用。同时,讨论了nfft参数、频率分辨率和自定义输出尺寸等关键点,并对比了宽带和窄带语谱图的特点。最后,引入了librosa库进行梅尔频谱图的提取,探讨了梅尔滤波器对频谱图的影响。
最低0.47元/天 解锁文章
1221

被折叠的 条评论
为什么被折叠?



