matlab绘制语谱图
[cleanAudio,fs] = audioread('SA1W.WAV'); %cleanAudio 为音频文件按照采样频率fs存储在计算机的数字信号(一维数据),其值代表幅度值。
2.设置窗口函数、帧长、帧移
windowLength = 256;%帧长 win = hamming(windowLength,'periodic');%窗口函数(汉明窗) overlap = 128; %帧移(一般为帧长的一半) ffTLength = windowLength; %做DFT的点数,一般和帧长一样
3.计算时间
t = (1/fs) * (0:numel(cleanAudio)-1);%波形图的时间(单位为秒)
4.绘图
subplot(2,1,1) plot(t,cleanAudio);%利用读取的音频信号绘制波形图 title('波形图') grid on; subplot(2,1,2) spectrogram(cleanAudio,win,overlap,ffTLength,fs,'yaxis');%绘制语谱图 'yaxis'代表频率轴在Y轴 title('语谱图')
5.解释
1. spectrogram的返回值
[S,F,T,P]=spectrogram(cleanAudio,win,overlap,nfft,fs,'yaxis');
S:是音频经过加窗、分帧、傅里叶变化得到的一个矩阵。时间分辨率是矩阵的列,频率分辨率为矩阵的行。这里cleanAudio如果是实值并且nfft是偶数,则S有 (
nfft
/2 + 1) 行,cleanAudio如果是实值并且nfft是奇数,则S有 (nfft
+ 1)/2 行。这里的信号是实值,nfft为256,所以S的行是129。F: S的行,也就是频率分辨率,这里的值为129.
T: S的列,也就是时间分辨率,其中的每个值为各段的中点。如果频率分辨率固定,音频的数字信号的长度越长,该向量也越大。
P:能量谱密度。也是一个矩阵。和S的大小是一样的。是S中的每个值的平方。
2.波形图和语谱图的时间轴看起来为什么是一样的?
其实两个图的时间轴是不太一样的,时间分辨率是不一样的。在波形图中,时间的轴的长度是和音频的数字信号向量的长度是一样的,t = (1/fs) * (0:numel(cleanAudio)-1)
3.语谱图的频率轴和采样率什么关系?
根据奈奎斯特定理,采样的频率大于信号频率的2倍,采样之后的数字信号可以完整的保存期原始信号信息。