不计算给定信号的规格

时间:2015-02-13 19:57:30

标签: python matplotlib

我尝试绘制某些特定信号的specgram,但我得到的只是一个空白的情节:

enter image description here

我不知道为什么会这样。这是我用来绘制信号和规格本身的代码:

import pylab as py

'''
PLOT SIGNAL

Additional info about the signal:
Sampling frequency = 1024.
Total samples = 1127.
'''
ax1 = py.subplot(2, 1, 1)
py.plot(np.arange(np.size(signal)), signal)

'''
PLOT SPECGRAM
'''
py.subplot(2, 1, 2, sharex=ax1)
Pxx, freqs, bins, im = py.specgram(signal, NFFT=1024, Fs=1024, noverlap=900,
                                cmap=py.cm.gist_heat)
py.show()

提前谢谢。

1 个答案:

答案 0 :(得分:0)

要共享x轴,您应该将其缩放到时间而不是样本编号。正如@Ajean建议的那样,更改每个周期图中的样本数量可以更全面的覆盖

首先是一些假数据(2048个样本):

a = np.linspace(0, 10*np.pi,2048)
b = np.linspace(0, 23*np.pi,2048)
s1 = np.sin(a)
s2 = np.sin(a*2)
s3 = np.cos(b)
s4 = np.cos(b*2)
s5 = np.sin(b)
signal = s1+s2+s3+s4+s5

然后x轴表示时间(采样率= 200 sa / S)

fs = 200
x = np.arange(2048) / fs

这些图使用x轴的时间 - 需要通知采样率(Fs)。每个情节都有这个共同点:

ax = plt.subplot(2, 1, 1)
plt.plot(x, signal)
plt.subplot(2, 1, 2, sharex = ax)

` NFFT = 1024

spectrum, freqs, t, im = plt.specgram(signal, NFFT = 1024, noverlap = 512, Fs = fs)
plt.show()
plt.close()

enter image description here

NFFT = 256

spectrum, freqs, t, im = plt.specgram(signal, NFFT = 256, noverlap = 128, Fs = fs)

enter image description here

NFFT = 64

spectrum, freqs, t, im = plt.specgram(signal, NFFT = 64, noverlap = 32, Fs = fs)

enter image description here


通过减少样本数,specgram在图中有更多的周期图。 specgram的x轴表示用于计算周期图的每个的中点。

在最后一个图中,最后一个周期图以10.08秒为中心,包括9.92-10.24秒的数据。 specgram在时间历史之前停止,因为它已用完数据 - 下一个周期图将以第二个10.24为中心,包括10.08-10.40秒的数据,最后一个样本为10.24秒,所以另一个无法制作64个样本周期图。


我想你可以弄清楚为什么你的情节会如此。