我正在尝试使用matplotlib绘制信号和信号的频谱图,但是...我仅对信号的第一个值(样本)获得频谱图(例如30000中的60 ...)。
这是一个非常长的文件,这就是为什么我只想绘制第一个30000个样本的原因。
这是代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
Data=pd.read_csv('MySignal.txt',
skiprows=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],
header=0)
print(Data.head())
DataI=Data['Sig'].tolist()
print(len(Data.index))
DataI=DataI[0:30000]
NFFT = 200 # the length of the windowing segments
Fs = 500 # the sampling rate
# plot signal and spectrogram
t=range(len(DataI))
ax1 = plt.subplot(211)
plt.plot(t, DataI)
plt.subplot(212, sharex=ax1)
Pxx, freqs, bins, im = plt.specgram(DataI, NFFT=NFFT,
Fs=Fs,noverlap=100, cmap=plt.cm.gist_heat)
plt.show()
我不太了解plt.specgram的工作原理,所以我不明白问题出在哪里...
非常感谢 !
最佳答案
这里有一个快速而肮脏的合成示例,每个示例三个音调相距一个八度,效果很好。请仔细阅读采样定理,以了解频谱图的概念。实际上,最好是首先通过玩FFT来学习如何绘制频谱(频谱图的垂直切片)。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
time1 = np.arange(0,5,0.0001)
time = np.arange(0,15,0.0001)
data1=np.sin(2*np.pi*300*time1)
data2=np.sin(2*np.pi*600*time1)
data3=np.sin(2*np.pi*900*time1)
data=np.append(data1,data2 )
data=np.append(data,data3)
print len(time)
print len(data)
NFFT = 200 # the length of the windowing segments
Fs = 500 # the sampling rate
# plot signal and spectrogram
ax1 = plt.subplot(211)
plt.plot(time,data) # for this one has to either undersample or zoom in
plt.xlim([0,15])
plt.subplot(212 ) # don't share the axis
Pxx, freqs, bins, im = plt.specgram(data, NFFT=NFFT, Fs=Fs,noverlap=100, cmap=plt.cm.gist_heat)
plt.show()
顶部的x轴以秒为单位。为了清晰起见,我在5秒内将300 Hz转换为600 Hz时放大了。底轴不是几秒钟,这就是为什么我取出了共享的轴。可以解决(详细信息)。