首页 > 解决方案 > Numpy fft没有给出预期的结果

问题描述

我试图在来自由 100Hz PWM 驱动器驱动的螺线管的电流信号中找到频谱。信号以 19200 Hz 采样。

下面是信号图。该信号是较长时间序列数据的一部分。从 22 秒点中提取 1024 个数据点。

当前信号

以下代码用于分析

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)
plt.plot(t,y)

Fs=19200              # (Hz) sampling rate
N=len(y)   # length of signal
time=N/Fs #total time of signal, 1/time is the fundamantal frequency
freq=np.arange(N)/time  # frequency vector for fft spectrum plot
freq=freq[0:int(N/2)]  # one sided frequecy
Y=np.fft.fft(y)/N*2     # fft of signal
Y=Y[0:int(N/2)]         # one sided frequency

plt.figure(2)
plt.plot(freq,abs(Y))  # one sided frequency plot

plt.xlabel("Hz")
plt.ylabel("Units")
plt.title("FFT spectrum")
plt.grid()
plt.show()

人们会期望频谱中占主导地位的 100 Hz 分量,但 numpy fft 结果并未反映这一点。以下是numpy.fft频率图。

FFT 频谱

以下是类似信号的 Matlab fft 分析图。正如预期的那样,有一个占主导地位的 100Hz 分量和谐波。

Matlab fft 分析的信号

Matlab FFT谱

标签: pythonnumpyscipyfft

解决方案


我建议您对您已经知道分析结果的函数执行离散傅立叶变换。一旦您对所看到的内容感到满意,就可以在您不知道结果的东西上运行一些代码行,正如我在本次讨论中所做的那样

矩形函数的数值傅里叶变换

如您所见,在 Matlab 和 Python 中,必须在数值傅里叶变换之前和之后执行频谱右侧的移动 ( fftshift(y) )。

您可能还对所谓的奈奎斯特定理感兴趣,它说明了可以应用数值傅里叶变换的最小采样频率,但我认为这不是您目前的问题,因为您的频谱的采样频率看起来相当高。

顺便说一下,使用python对阶跃函数执行快速傅里叶变换的正确方法报告如下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-3, 3, 0.01)
y = np.zeros(len(x))
y[200:400] = 1
# Step function for which the Fourier Transform is well known to be sin(x)/x
yShift = np.fft.fftshift(y) 
# Shift of the N/2 sampling data on the right side to the left side
fftyShift = np.fft.fft(yShift)
# Numerical Fourier Transform (Lanczos)
ffty = np.fft.fftshift(fftyShift)
# Shift of the N/2 transformed data on the right side to the left side

plt.plot(ffty)
plt.show()

推荐阅读