当我使用以下代码中的matplotlib plt.specgram时,生成的频谱图是正确的。
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
Pxx, freqs, bins, im = plt.specgram(samples[:,1], NFFT=1024, Fs=44100, noverlap=900)
![spectrogram generated by using matplotlib](https://istack.dev59.com/UH5CL.webp)
然而,如果我使用
scipy页面中提供的示例代码生成声谱图,使用以下代码,我会得到类似于这样的结果:
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
frequencies, times, spectrogram = signal.spectrogram(samples[:,1],sample_rate,nfft=1024,noverlap=900, nperseg=1024)
plt.pcolormesh(times, frequencies, spectrogram)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
![enter image description here](https://istack.dev59.com/5OZ1f.webp)
为了查明发生了什么,我尝试使用第一个方法生成的
Pxx
、
freqs
和
bins
,然后使用第二个方法绘制出数据:
plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
![enter image description here](https://istack.dev59.com/rBl6A.webp)
生成的图形与第二种方法生成的图形几乎相同。
因此,看来
scipy.signal.spectrogram
没有问题。问题在于我们绘制图形的方式。
我想知道
plt.pcolormesh
是否是绘制频谱图的正确方法,尽管这种方法在
scipy文档中被建议使用。
类似的问题已经被提出
here,但目前还没有解决方案。