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

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

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

但是,如果我通过使用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]')

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

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

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

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

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

here也曾问过类似的问题,但该问题尚未解决。

python参考方案

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

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

模式:[“默认” | ‘psd’| “幅度” | “角度” | “阶段”]
使用哪种频谱。默认值为“ psd”,它采用功率谱密度。 “ complex”返回复数值频谱。 “幅度”返回幅度谱。 “角度”可返回相位光谱而无需展开。 “相位”返回展开后的相位频谱。

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

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

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

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…

Python:检查新文件是否在文件夹中[重复] - python

This question already has answers here: How do I watch a file for changes? (23个答案) 3年前关闭。 我是python的新手,但是我尝试创建一个自动化过程,其中我的代码将侦听目录中的新文件条目。例如,某人可以手动将zip文件复制到一个特定的文件夹中,并且我希望我的代码能够在文件完全…