当我通过使用以下代码使用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)
但是,如果我通过使用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)
要调试这是怎么回事,我尝试使用Pxx,freqs,bins,通过第一种方法生成的,然后使用第二种方法绘制出来的数据:
plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]') …Run Code Online (Sandbox Code Playgroud) 我使用matplotlib.pyplot.specgram和matplotlib.pyplot.pcolormesh来制作地震信号的频谱图.
背景信息 - 使用pcolormesh的原因是我需要在光谱图数据阵列上进行算术,然后重新绘制得到的频谱图(对于三分量地震图 - 东,北和垂直 - 我需要计算水平频谱幅度和用水平光谱划分垂直光谱.使用谱图阵列数据比使用单个振幅谱更容易
我发现算术后的谱图有意想不到的值.经过进一步调查后发现,与使用pyplot.pcolormesh制作的频谱图和pyplot.specgram方法返回的数据数据相比,使用pyplot.specgram方法制作的频谱图具有不同的值.两个图/数组都应该包含相同的值,我无法弄清楚它们为什么没有.
示例:的情节
plt.subplot(513)
PxN, freqsN, binsN, imN = plt.specgram(trN.data, NFFT = 20000, noverlap = 0, Fs = trN.stats.sampling_rate, detrend = 'mean', mode = 'magnitude')
plt.title('North')
plt.xlabel('Time [s]')
plt.ylabel('Frequency [Hz]')
plt.clim(0, 150)
plt.colorbar()
#np.savetxt('PxN.txt', PxN)
Run Code Online (Sandbox Code Playgroud)
看起来与情节不同
plt.subplot(514)
plt.pcolormesh(binsZ, freqsZ, PxN)
plt.clim(0,150)
plt.colorbar()
Run Code Online (Sandbox Code Playgroud)
即使"PxN"数据阵列(即每个段的频谱图数据值)由第一种方法产生并在第二种方法中重新使用.
有人知道为什么会这样吗?
PS我意识到我对NFFT的价值不是一个平方数,但在我编码的这个阶段它并不重要.
PPS我不知道"imN"数组(来自pyplot.specgram的第四个返回变量)是什么以及它用于什么......