SciPy 的 FFT 输出令人困惑,或者我可能误解了

问题描述

我正在对一维信号应用 SciPy 包中的 FFT。该信号以 512hz 采样率捕获,这意味着 1 秒内有 512 个数据点。我总共有 5 分钟的数据。

当我使用下面的代码在这个信号上应用来自 SciPy 的 FFT 时,我立即将 FFT 应用于整个信号。根据我的理解,当我以 512 的采样率对信号应用 FFT 时,FFT 会应用于前 512 个点,然后是接下来的 512 个数据点,依此类推,但这里 FFT 立即应用于整个信号,我不明白.

import numpy as np
import pandas as pd
from scipy.stats import zscore
from scipy.fft import fft,fftfreq,rfft,rfftfreq
import matplotlib.pyplot as plt

df =  pd.read_csv("data.csv")
df = df.drop('Unnamed: 0',axis=True)
print(df.head())

# measuring the fft of the signal
def plotFFT(df):#,cleanDF):
    sampleRate = 512 # Hz
    duration = df.shape[0]
    
    xf = rfftfreq(duration,1/sampleRate)
    yf = rfft(df['value'])
    
    fig = plt.figure(num='FFT of signal',figsize=(20,10))
    plt.plot(xf,np.real(yf),label='raw')
    plt.legend()
    plt.grid()
    plt.draw()
    plt.waitforbuttonpress(0)
    plt.close(fig)

plotFFT(df)

当我换行时

yf = rfft(df['value'])

yf = rfft(df['value'],n=sampleRate)

我收到此错误

C:\ProgramData\Anaconda3\python.exe C:/Users/BLACK/Desktop/PythonXperiments/FFTScipy/main.py
Traceback (most recent call last):
  File "C:/Users/BLACK/Desktop/PythonXperiments/FFTScipy/main.py",line 29,in <module>
    plotFFT(df)
  File "C:/Users/BLACK/Desktop/PythonXperiments/FFTScipy/main.py",line 21,in plotFFT
    plt.plot(xf,label='raw')
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\pyplot.py",line 2840,in plot
    return gca().plot(
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py",line 1743,in plot
    lines = [*self._get_lines(*args,data=data,**kwargs)]
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_base.py",line 273,in __call__
    yield from self._plot_args(this,kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_base.py",line 399,in _plot_args
    raise ValueError(f"x and y must have same first dimension,but "
ValueError: x and y must have same first dimension,but have shapes (53378,) and (257,)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)