选题自(数字语音处理理论及应用)
Python实现画语音文件的声谱图
参数选用:
窗函数:汉明窗
宽带声谱窗长: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)
在宽带声谱图中,可以看出时间分辨率很好,频率分辨率较低,不能很好反映声音的纹理特性,反映了频谱的时变特性,能很好分辨出共振峰的大致位置,但分辨不清谐波结构。
在窄带声谱图中可以观察到有清楚的谐波结构,而且频率分辨率非常好,可以清楚地看到各音阶出现的时刻,以及各时刻对应频率处的能量强弱,但是时间上的分辨率不太理想,因为频率分辨率太过精细,因而不能很好体现出共振峰的大致位置,即反映不出基波的变化特性。