【问题标题】:Fourier transform with python用python进行傅里叶变换
【发布时间】:2015-07-05 11:25:39
【问题描述】:

我有一组data。它显然具有一定的周期性。我想通过使用傅立叶变换找出它的频率并将其绘制出来。

这是我的一张照片,但似乎不太好。

这是对应的代码,不知道为什么会失败:

import numpy
from pylab import *
from scipy.fftpack import fft,fftfreq
import matplotlib.pyplot as plt
dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)
t = dataset[:,0]
signal = dataset[:,1]
npts=len(t)

FFT = abs(fft(signal))
freqs = fftfreq(npts, t[1]-t[0])
subplot(211)
plot(t[:npts], signal[:npts])
subplot(212)
plot(freqs,20*log10(FFT),',')
xlim(-10,10)
show()

我的问题是:由于原始数据看起来非常周期性,我希望看到在频域中的峰值非常尖锐;我怎样才能让山峰看起来更好看?

【问题讨论】:

  • 这有什么不对?你期待什么?
  • @PaulH 为什么波峰这么宽,我看原始数据的周期很不错。如何让频率更明显?

标签: python python-2.7 scipy data-analysis


【解决方案1】:

这是数据分析的问题。

  • FFT 使用复数,因此频谱在实际数据输入上是对称的:限制 xlim(0,max(freqs))
  • 采样周期不好:在保持输入点总数不变的情况下增加采样周期将在此示例中产生最佳质量的频谱。

编辑。 与:

 dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)[::30];
 t,signal = dataset.T
 (...)
 plot(freqs,FFT)
 xlim(0,1)
 ylim(0,30)    

光谱是

为了获得最佳质量的频谱,只需长时间重新采集信号(以获得美丽的峰值),采样频率为 1 Hz,这将为您提供 [0, 0.5 Hz] 频率范围(请参阅奈奎斯特准则)。

【讨论】:

  • 我明白了你的第一点,你能更详细地解释你的第二点吗?我应该将“t[1]-t[0]”替换为“10*(t[1]-t[0])”吗?这也不好。
  • 只是检查一下我的理解。你的采样率是 $1/(30*0.005s)=6.67Hz$,所以根据 Nyquist 标准。这个采样率保证了我们可以恢复频率$f
  • 但是,我仍然不明白您选择更少的点可以使图表看起来更好的魔力,您能否在答案中解释这部分。谢谢!
  • 这只是对 Spectrum 有趣部分的放大。 0.5 Hz 之后似乎没有信息,因此信号被过采样。对于此类数据,此图在线性比例下看起来更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多