【问题标题】:How to do FFT on signal of different period如何对不同周期的信号进行FFT
【发布时间】:2018-03-06 15:51:07
【问题描述】:

我需要对非严格周期性的步态信号执行 FFT。下面是我为双面和单面创建的代码。但是,我不知道这是否正确,因为信号不是严格周期性的——人们每走一步都不同。如果我每个周期采样相同数量的样本,那么我不知道给 fftpack.fftfreq(n, d) 参数 d 提供什么。现在我将 d 设置为样本之间的时间间隔。如果我每个时期创建相同数量的样本,那么 d 将会改变。

不知道该怎么办。这里有现成的代码吗?

def plotDoubleSidedSpectrum(y,timestep,SigName,xlimit):

 n=len(y)
 FFT = fftpack.fft(y)
 freqs = fftpack.fftfreq(n,d=timestep) 

 print(FFT)

 fig,ax=plt.subplots()
 ax.plot(freqs,np.abs(FFT)/n,'r') 
 ax.set_xlabel(SigName+ ': Double Sided Frequency in Hertz [Hz]')
 ax.set_ylabel('Frequency Domain (Spectrum) Magnitude')
 ax.set_xlim(-xlimit, xlimit)




def plotSingleSidedSpectrum(y,timestep,SigName,xlimit):

 n=len(y)
 FFT = fftpack.fft(y)
 freqs = fftpack.fftfreq(n,d=timestep) 
 freqSingle = freqs[:n//2]
 AmpSingle = 2*np.abs(FFT[:n//2])/n  # divided by n is to normalize it

 fig,ax=plt.subplots()
 ax.plot(freqSingle,AmpSingle,'r') 
 ax.set_xlabel(SigName+':Single Sided Frequency in Hertz [Hz]')
 ax.set_ylabel('Frequency Domain (Spectrum) Magnitude')
 ax.set_xlim(0,xlimit)

【问题讨论】:

  • 如果每个周期有N个样本,则可以设置d=1/N,单位为1/周期。
  • 感谢您的回复。是否有任何现有代码可以在每个周期准确地采样 N 个样本然后执行 FFT?我是新手,想着用代码找到信号的峰值,然后了解峰值之间的时间差,然后进行插值等,似乎相当困难。
  • 是的,这不是微不足道的。但我想我不明白您为什么要这样做...您是否尝试使用 FFT 进行步态识别?如果是这样,您不想在步骤持续时间中包含任何违规行为吗?你在处理什么信号?

标签: python numpy signal-processing fft fftpack


【解决方案1】:

d = 应该是采样频率的 1。这将使您的结果能够向您显示步态的频率,而这些变化将帮助您了解步态模式的差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多