matlab绘制语谱图

1.读取音频文件

[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), t的值会随采样频率fs的变化而变化。相较于波形图,语谱图中时间分辨率是有所降低的。例如,有一个信号的长度为101000,窗口长度为200,返回的频率F分辨率为101,则时间T的分辨率为1000。所以,看起来是差不多的,但是其实时间的分辨率降低了很多,而且窗口长度越大,时间分辨率会越低。

3.语谱图的频率轴和采样率什么关系?

  根据奈奎斯特定理,采样的频率大于信号频率的2倍,采样之后的数字信号可以完整的保存期原始信号信息。所以这里的频率轴的最高值是根据输入的采样频率来决定的,本例中采样频率为16000Hz,所以频率轴的最高值为8000Hz。

posted @ 2019-12-31 11:15  peter·zhang  阅读(8861)  评论(2编辑  收藏  举报