gpt4 book ai didi

python - 使用 scipy.signal.spectrogram 时出现错误的频谱图

转载 作者:行者123 更新时间:2023-12-02 06:57:37 27 4
gpt4 key购买 nike

当我使用以下代码使用 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

但是,如果我使用 scipy page 中给出的示例代码生成频谱图使用以下代码,我得到这样的结果:

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

为了调试发生的情况,我尝试使用第一种方法生成的 Pxxfreqsbins,然后使用绘制数据的第二种方法:

plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')

enter image description here

生成的图与第二种方法生成的图几乎相同。所以,看来 scipy.signal.spectrogram 毕竟没有问题。问题在于我们绘制图表的方式。我想知道 plt.pcolormesh 是否是绘制频谱图的正确方法,尽管 scipy document 中建议了此方法。

有人提出了类似的问题here ,但问题还没有答案。

最佳答案

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

scale : [ ‘default’ | ‘linear’ | ‘dB’ ] The scaling of the values in the spec. ‘linear’ is no scaling. ‘dB’ returns the values in dB scale. When mode is ‘psd’, this is dB power (10 * log10). Otherwise this is dB amplitude (20 * log10). ‘default’ is ‘dB’ if mode is ‘psd’ or ‘magnitude’ and ‘linear’ otherwise. This must be ‘linear’ if mode is ‘angle’ or ‘phase’.

mode : [ ‘default’ | ‘psd’ | ‘magnitude’ | ‘angle’ | ‘phase’ ] What sort of spectrum to use. Default is ‘psd’, which takes the power spectral density. ‘complex’ returns the complex-valued frequency spectrum. ‘magnitude’ returns the magnitude spectrum. ‘angle’ returns the phase spectrum without unwrapping. ‘phase’ returns the phase spectrum with unwrapping.

要使用 pcolormesh 获得类似的结果,您需要同等地缩放数据。

plt.pcolormesh(times, frequencies, 10*np.log10(spectrogram))

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

关于python - 使用 scipy.signal.spectrogram 时出现错误的频谱图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51042870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com