使用scipy.signal.spectrogram时频谱图错误

Rav*_*euk 6 python audio scipy spectrogram

当我通过使用以下代码使用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)
Run Code Online (Sandbox Code Playgroud)

使用matplotlib生成的频谱图

但是,如果我通过使用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]')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

要调试这是怎么回事,我尝试使用Pxxfreqsbins,通过第一种方法生成的,然后使用第二种方法绘制出来的数据:

plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

生成的图与通过第二种方法生成的图几乎相同。因此,似乎scipy.signal.spectrogram毕竟没有问题。问题是我们绘制图形的方式。我想知道plt.pcolormesh频谱图是否是正确的绘制方法,尽管在scipy文件中建议使用这种方法

这里已经提出类似的问题,但该问题尚未解决。

jak*_*ket 11

频谱图的默认缩放模式为“ dB”(来自频谱图文档)

比例尺:['默认'| '线性'| 'dB'] 规范中值的缩放比例。“线性”没有定标。“ dB”返回以dB为单位的值。当模式为“ psd”时,这是dB功率(10 * log10)。否则,这是dB幅度(20 * log10)。如果模式为“ psd”或“幅度”,则“默认”为“ dB”,否则为 “线性”。如果模式为“角度”或“相位”,则此参数必须为“线性”。

模式:['默认'| 'psd'| '幅值'| '角度'| [相位]]使用 哪种频谱。默认值为'psd',它采用功率谱密度。“ complex”返回复数值频谱。“幅度”返回幅度谱。“角度”返回相位光谱而不展开。'phase'返回展开的相位谱。

为了获得相似的结果,pcolormesh您将需要等效地缩放数据。

plt.pcolormesh(times, frequencies, 10*np.log10(spectrogram))
Run Code Online (Sandbox Code Playgroud)

我认为pcolormesh示例的缩放比例不正确。您可以在示例中清楚地看到载波,但是看不到添加的噪声信号。