python - 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
频率图。
以下是类似信号的 Matlab fft 分析图。正如预期的那样,有一个占主导地位的 100Hz 分量和谐波。
解决方案
我建议您对您已经知道分析结果的函数执行离散傅立叶变换。一旦您对所看到的内容感到满意,就可以在您不知道结果的东西上运行一些代码行,正如我在本次讨论中所做的那样
如您所见,在 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()
推荐阅读
- youtube - 通过 YouTube API 上传的视频会被 YouTube 自动阻止并设置为私有
- python - bbc-microbit 不进入配对模式
- sql - 对表格突出显示感到困惑
- android - 未找到 ID 为“com.google.firebase.firebase-perf”的插件
- javascript - 将 Html 表值存储在 javascript 数组中,并使用 jquery 和 ajax 将其发送到 laravel 脚本
- python - Python初始化随机值的多维numpy数组
- java - 有没有一种方法可以解析日期,我可以确定我想要哪一天?
- javascript - 选中复选框时更改html元素内容不起作用
- sql - 如何比较表中的两行
- laravel - Laravel 活动参与者雄辩 vs 收藏