簡體   English   中英

matplotlib.mlab和numpy.abs(numpy.fft.fft(data))中提供的振幅譜結果之間的差異

[英]Difference between magnitude_spectrum result available in matplotlib.mlab and numpy.abs(numpy.fft.fft(data))

我有一個簡單的正弦波。 我試圖在頻域中找到幅度譜。
我使用了要驗證此結果的功能matplotlib.mlab.magnitude_spectrum(data) ,因此嘗試使用numpy.abs(numpy.fft.fft(data)) ,結果卻有所不同。
應該一樣吧? 即使我嘗試
numpy.sqrt(matplotlib.mlab.psd(data)) ,結果是不同的。

我正在尋找對此的解釋。

有兩個主要區別。 首先, matplotlib.mlab.magnitude_spectrum在進行FFT之前將窗口函數應用於輸入數據(默認情況下為Hanning窗口 )。 其次,它僅返回正頻率,而np.fft.fftnp.fft.fft返回正和負頻率:

import numpy as np
from matplotlib import pyplot as plt


x = np.random.randn(500)

mag1, f = plt.mlab.magnitude_spectrum(x)

# apply a hanning window to x
xw = np.hanning(x.shape[0]) * x

# use np.fft.rfft to get the positive frequencies only
mag2 = np.abs(np.fft.rfft(xw))

fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(f, mag1, '-k', lw=2)
ax.plot(f, mag2, '--r', lw=2)
plt.show()

在此處輸入圖片說明

matplotlib.mlab.psd做的事情更復雜-它使用Welch的方法計算周期圖,而不僅僅是采用FFT的平方幅度。 它基本上將平均周期圖用於信號的窗口重疊段,從而為您提供了一個“更平滑”的周期圖,該周期圖對噪聲更魯棒,但會犧牲一些頻率分辨率。 根據信號的外觀以及對psd noverlap= NFFT=noverlap=參數的選擇,您應該期望結果看上去與magnitude_spectrum完全不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM