如何使用 Python 获得傅里叶级数呸呸呸_ _fft

信息处理 fft 离散信号 频谱 Python 傅里叶级数
2022-02-11 20:17:53

我希望能够重建构成离散信号的每个单独的正弦曲线。我有以下信号:(我正在使用 Python) 在此处输入图像描述

信号本质上是一个包含约 400 个随时间变化的元素的阵列。在 Pythonfft中对数据调用函数后

 dft= rfft(dat)/len(dat)  #real fft

我收到下图: 在此处输入图像描述

我知道我可以使用 的结果fft来获得单个傅立叶级数分量,但我不确定具体如何。我的代码为信号的每个谐波产生了一个幅度数组,我如何使用它来获得傅里叶级数的每个单独分量?

3个回答

我不是这个主题的专家,但有一些有用的例子可以分享。

1 个组件示例

要保留i-eth 傅里叶分量,您可以将其余分量归零:

n = len(y)
Y = numpy.fft.fft(y)
numpy.put(Y, range(0, i), 0.0)
numpy.put(Y, range(i+1, n), 0.0)
# Now Y holds 1 imaginary coefficient corresponding with the i-eth Fourier component

如果您正在寻找与所选i-eth 分量相对应的 Real 信号,您可以随后通过以下方式执行逆变换ifft

ifft = numpy.fft.ifft(Y) # the sinusoid you're looking for

多组件示例

您保留的傅立叶分量越多,您就越能模仿原始信号。此示例显示了当您保留 10、20、...up tp n 个组件时会发生什么。

假设xy是您的数据向量。

import numpy
from matplotlib import pyplot as plt

n = len(y)
COMPONENTS = [10, 20, n]

for c in COMPONENTS:
    colors = numpy.linspace(start=100, stop=255, num=c)
    for i in range(c):
        Y = numpy.fft.fft(y)
        numpy.put(Y, range(i+1, n), 0.0)
        ifft = numpy.fft.ifft(Y)
        plt.plot(x, ifft, color=plt.cm.Reds(int(colors[i])), alpha=.70)

    plt.title("First {c} fourier components".format(c=c))
    plt.plot(x,y, label="Original dataset")
    plt.grid(linestyle='dashed')
    plt.legend()
    plt.show()

前 10 个傅里叶分量 前 20 个傅立叶分量 前 306 个傅立叶分量

...看看它如何模仿原始信号?

如果您假设您的信号是原始信号的一个周期,那么 FFT 会为您提供高达频率的傅里叶级数系数Fs/2(由于奈奎斯特定理)。DFT 结果正是复傅立叶级数的系数。您可以将复数系数转换为anbn根据维基百科的真实傅立叶级数(正弦和余弦) 。另外,我的两篇文章(Complex Fourier Series , Spectral Leakage)可能会帮助您进一步理解。

只有在以下情况下,DFT 结果向量才会为您提供傅立叶级数系数​​:(1) 信号在 DFT/FFT 长度内完全是整数周期,并且 (2) 信号(采样前)完全受限于低于 Fs/ 的频率2. 否则,DFT 将包含窗口伪影和/或频率混叠。