所以我一直在自学信号处理,并一直在尝试使用 Python 来获得高质量的频谱图,质量频谱图就像会大胆地产生的频谱图等。我所做的步骤是:
我说“计算机”,以 .m4a 格式记录在我的 mac 上,然后我使用 ffmpeg 将其转换为 .wav
$ ffmpeg -i computer.m4a -acodec pcm_s16le -ac 1 -ar 16000 computer.wav
通过以下方式导入 Python:
sample_rate, samples = wavfile.read('/path/to/computer.wav')
现在我只是快速绘制样本图:
plt.plot(samples)
我得到这样的图表:
为什么我的峰被封顶?
无论如何,我继续,据我所知,我执行傅里叶变换,将我的信号分解为不同幅度和频率的正弦波,然后得到生成的复数的实部:
样本_fft = np.fft.rfft(样本) 频率 = np.abs(samples_fft)
我现在绘制频率图:
这就是我猜想的样子,因为人声频率通常在 100 到 1000 之间,对吧?
频谱图是将我的样本分成一定数量的窗口,然后对每个窗口进行傅里叶变换,从而得到一个时间频率图。
最后风 = 0 windows = np.linspace(0,len(samples),1000) 频谱图 = [] 对于窗口中的窗口: 如果窗口!= 0: samples_in_range = samples[last_wind:int(window)] samples_in_range_fft = np.fft.rfft(samples_in_range) 频率_in_range = np.abs(samples_in_range_fft) spectrogram.append(list(frequencies_in_range)) last_wind = int(窗口) 谱图2 = np.asarray(谱图).T
绘制频谱图:
audio_length = len(samples)/sample_rate audio_time_intervals = np.linspace(0,audio_length,999) tempfreq = np.linspace(0,1,19) plt.pcolormesh(audio_time_intervals,tempfreq,spectrogram2)
所以现在我有一个频谱图,但质量很差。但我一直在看 youtube 视频,比如这个,我如何获得更好的分辨率和清晰度以便阅读元音中的共振峰等内容,我尝试改变分区的大小,但仍然得到非常相似的结果,更多的窗口在每个窗口中获得较少的频率数据,并且较少的窗口获得较差的时间分辨率。
我对信号处理非常陌生,因此将不胜感激任何帮助,例如正确方向的点或关于我做错了什么的指针,以便获得清晰的频谱图以便研究。
注意,我已经尝试过这样的 python 包signal.spectrogram
,但结果也很差。另外,我宁愿了解细节,这样我才能真正了解发生了什么。