首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python列表上的NP.FFT

python列表上的NP.FFT
EN

Stack Overflow用户
提问于 2019-08-23 16:43:59
回答 1查看 883关注 0票数 1

我从Arduino ADC收集数据,并使用Python3将数据存储在树莓派4上的列表中。该列表名为'dataList‘,包含1024个10位样本。这一切都工作得很好:我可以在Raspberry上重现采样信号。

我想使用numpy FFT来使用采集信号的功率谱。我尝试了以下几种方法:

见下文

这应该说明了我正在尝试做的事情;然而,这会产生不连贯的输出。采样的信号具有大约300 Hz的频率。如果有任何正确方向的提示,我将非常感激!

代码语言:javascript
复制
def show_FFT(window):
   fft = np.fft.fft (dataList, 1024, -1, None)
   for X_value in range (0,512, 1):
       Y_value = fft ([X_value]
       gfxdraw.pixel (window, X_value, int(abs(Y_value), black)
EN

回答 1

Stack Overflow用户

发布于 2019-08-27 05:29:05

正如你在问题中提到的,你有一个数据集,其中X从0到…但对于numpy.fft.fft,你必须记住,它是一个离散傅立叶变换(DFT),它计算等间距样本的快速傅立叶变换,我必须指出,它必须是从-x到x的对称范围的数据集。你可以简单地尝试它,并根据需要改变参数,看看结果是什么。由于您在这里没有给出任何数据集,我建议您使用以下代码的generl案例:

代码语言:javascript
复制
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
# create data from dataframes
x = np.random.rand(50) #unequaly spaced measurment
x.sort()
y = np.exp(-x*x) #measured signal

根据答案here,您可以通过以下方式将数据重新采样为等间距的点:

代码语言:javascript
复制
f = interpolate.interp1d(x, y)
num = 500
xx = np.linspace(x[0], x[-1], num)
yy = f(xx)
plt.close('all')
plt.plot(x,y,'bo')
plt.plot(xx,yy, 'g.-')
plt.show()

enter image description here然后,您可以通过以下方法非常简单地使您的x数据对称:

代码语言:javascript
复制
x=xx
y=yy
xsample = x-((x.max()-x.min())/2)
xsample=xsample-(xsample.max()+xsample.min())/2
x=xsample

因此,如果您尝试fft,您将获得如下正确的结果:

代码语言:javascript
复制
ysample =yy
ysample_fft = np.fft.fftshift(np.abs(np.fft.fft(ysample/ysample.max()))) / 
np.sqrt(len(ysample))
plt.plot(xsample,ysample_fft/ysample_fft.max(),'b--')
plt.show()

enter image description here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57622674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档