選題自(數字語音處理理論及應用)
參數選用:
窗函數:漢明窗
寬帶聲譜窗長:5ms
寬帶聲譜FFT長度:1024
窄帶聲譜窗長:50ms
窄帶聲譜FFT長度:1024
使用對數幅度
聲譜圖爲彩色
代碼部分
import matplotlib.pyplot as plt #畫圖用
import librosa.core as lc #計算stft使用
import numpy as np #使用了其中的一些工具函數
import librosa.display #畫聲譜圖用
from scipy.io import wavfile #獲取wav文件的採樣率
path = "/Users/mine/Desktop/wavefiles/s5.wav"
fs, y_ = wavfile.read(path) #讀取文件的採樣率
fs = fs
n_fft = 1024 #FFT長度
y, sr = librosa.load(path, sr=fs)
#獲取寬帶聲譜圖
mag = np.abs(lc.stft(y, n_fft=n_fft, hop_length=10, win_length=40, window='hamming')) #進行短時傅里葉變換,並獲取幅度
D = librosa.amplitude_to_db(mag, ref=np.max) #幅度轉換爲db單位
librosa.display.specshow(D, sr=fs, hop_length=10, x_axis='s', y_axis='linear') #畫聲譜圖
plt.colorbar(format='%+2.0f dB')
plt.title('broadband spectrogram')
plt.savefig('broader.png')
plt.show()
#獲取窄帶聲譜圖
mag1 = np.abs(lc.stft(y, n_fft=n_fft, hop_length=100, win_length=400, window='hamming'))
mag1_log = 20*np.log(mag1)
D1 = librosa.amplitude_to_db(mag1, ref=np.max)
librosa.display.specshow(D1, sr=fs, hop_length=100, x_axis='s', y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('narrowband spectrogram')
plt.savefig('narrowband.png')
plt.show()
結果以及分析
寬帶聲譜圖如下:
窄帶聲譜圖如下
結果分析:
聲譜圖也即是語音短時傅里葉變換的幅度畫出的2D圖,
寬帶聲譜圖參數:
FFT長度:1024
聲譜窗長:5ms(8k採樣率時設置爲40)
窗移:(8k採樣率時設置爲10)
窄帶聲譜圖參數:
FFT長度:1024
聲譜窗長:50ms(8k採樣率時設置爲400)
窗移:(8k採樣率時設置爲100)
在寬帶聲譜圖中,可以看出時間分辨率很好,頻率分辨率較低,不能很好反映聲音的紋理特性,反映了頻譜的時變特性,能很好分辨出共振峯的大致位置,但分辨不清諧波結構。
在窄帶聲譜圖中可以觀察到有清楚的諧波結構,而且頻率分辨率非常好,可以清楚地看到各音階出現的時刻,以及各時刻對應頻率處的能量強弱,但是時間上的分辨率不太理想,因爲頻率分辨率太過精細,因而不能很好體現出共振峯的大致位置,即反映不出基波的變化特性。