【发布时间】:2016-08-05 04:40:05
【问题描述】:
我正在使用 python 和 scipy 来理解窗口化,我做了一个图来查看窗口在 FFT 下的行为,但结果不是我所期望的。 情节是:
中间的情节是纯 FFT 情节,这是我得到奇怪东西的地方。 然后我改变了三角。获取泄漏的函数,将 1 直接用于数组的 300 个第一项,结果:
代码:
sign_freq=80
sample_freq=3000
num=np.linspace(0,1,num=sample_freq)
i=0
#wave data:
sin=np.sin(2*pi*num*sign_freq)+np.sin(2*pi*num*sign_freq*2)
while i<1000:
sin[i]=1
i=i+1
#wave fft:
fft_sin=np.fft.fft(sin)
fft_freq_axis=np.fft.fftfreq(len(num),d=1/sample_freq)
#wave Linear Spectrum (Rms)
lin_spec=sqrt(2)*np.abs(np.fft.rfft(sin))/len(num)
lin_spec_freq_axis=np.fft.rfftfreq(len(num),d=1/sample_freq)
#window data:
hann=np.hanning(len(num))
#window fft:
fft_hann=np.fft.fft(hann)
#window fft Linear Spectrum:
wlin_spec=sqrt(2)*np.abs(np.fft.rfft(hann))/len(num)
#window + sin
wsin=hann*sin
#window + sin fft:
wsin_spec=sqrt(2)*np.abs(np.fft.rfft(wsin))/len(num)
wsin_spec_freq_axis=np.fft.rfftfreq(len(num),d=1/sample_freq)
fig=plt.figure()
ax1 = fig.add_subplot(431)
ax2 = fig.add_subplot(432)
ax3 = fig.add_subplot(433)
ax4 = fig.add_subplot(434)
ax5 = fig.add_subplot(435)
ax6 = fig.add_subplot(436)
ax7 = fig.add_subplot(413)
ax8 = fig.add_subplot(414)
ax1.plot(num,sin,'r')
ax2.plot(fft_freq_axis,abs(fft_sin),'r')
ax3.plot(lin_spec_freq_axis,lin_spec,'r')
ax4.plot(num,hann,'b')
ax5.plot(fft_freq_axis,fft_hann)
ax6.plot(lin_spec_freq_axis,wlin_spec)
ax7.plot(num,wsin,'c')
ax8.plot(wsin_spec_freq_axis,wsin_spec)
plt.show()
【问题讨论】:
-
求大神们,请解释一下剧情中每个框是什么,“纯FFT”是什么意思,具体是什么问题。
-
与您的预期有何不同?第二幅图显示了插入 1 的直流分量在 0 处的峰值。不直接明显的是远离峰值的泄漏水平。如果您以对数刻度(分贝)显示频谱幅度,您会看得更清楚。
-
@SleuthEye:来自正弦波和窗口+正弦的线性光谱似乎工作正常,问题是汉宁函数的问题,没有显示任何精确,我预计是这样的: link.问候! :)
-
错误的问题标题。你得到了一个很好的结果,但期望值很差。 Windows 降低了噪声(在光谱的平坦部分),而不是使峰更精确。
-
如果您关心
ax5上的图,我看到的主要问题是您正在绘制复数值。尝试绘制abs(fft_hann)。对于ax6,鉴于您拥有的汉宁窗口的带宽(~1Hz),您可能应该更改x轴的比例以查看任何内容(例如ax6.set_xlim([0, 10]))。