[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倍,采樣之后的數字信號可以完整的保存期原始信號信息。