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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM