python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python FFT快速傅立叶变换算法

python实现FFT快速傅立叶变换算法案例

作者:luthane

FFT(快速傅里叶变换)是计算DFT及其逆变换的一种算法,其基本思想是利用DFT的对称性和周期性,通过分而治之的策略将DFT分解为更小的DFT,从而降低计算复杂度,FFT的算法步骤包括选择分解、重新排序、蝶形运算和逐层计算,在Python中

FFT快速傅里叶变换介绍

FFT(快速傅里叶变换)是计算离散傅里叶变换(DFT)及其逆变换的一种高效算法。

DFT是一种将信号从时域转换到频域的数学工具,而FFT通过减少计算量来加速这一过程。

FFT的基本思想

FFT的算法步骤(以Cooley-Tukey算法为例)

Python FFT快速傅立叶变换

在Python中,实现快速傅里叶变换(FFT)的一种简便方法是使用numpy库中的fft模块。numpy提供了高效的FFT算法实现,能够处理一维或多维数组。

以下是一个简单的例子,展示如何使用numpy中的fft.fft函数来计算一维数组的FFT。

首先,确保你已经安装了numpy库。如果没有安装,可以通过pip安装:

pip install numpy

然后,你可以使用以下Python代码来计算FFT:

import numpy as np
import matplotlib.pyplot as plt

# 创建一个样本信号,例如一个包含正弦波和余弦波的复合信号
Fs = 1000  # 采样频率
T = 1/Fs  # 采样周期
L = 1500  # 信号长度
t = np.linspace(0, L-1, L)*T  # 时间向量

# 创建一个复合信号
S = 0.7*np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)

# 使用numpy的fft函数计算FFT
Y = np.fft.fft(S)

# 获取FFT的频率轴
P2 = np.abs(Y/L)
P1 = P2[:L//2+1]
P1[1:-1] = 2*P1[1:-1]  # 去除对称性
f = Fs*np.arange(0,(L//2+1))/L

# 绘制FFT的幅度谱
plt.figure()
plt.plot(f, P1) 
plt.title('Single-Sided Amplitude Spectrum of S(t)')
plt.xlabel('f (Hz)')
plt.ylabel('|P1(f)|')
plt.show()

在这个例子中,我们首先生成了一个包含两个不同频率正弦波的复合信号S。然后,我们使用numpy.fft.fft函数计算了信号的FFT。为了获得FFT的幅度谱,我们计算了Y的绝对值并除以信号长度L,以得到归一化的幅度。由于FFT的结果是对称的(对于实数输入),我们通常只关注一半的频率范围,并相应地调整幅度(将一半的频率范围中的幅度加倍,除了第一个和最后一个点)。最后,我们使用matplotlib库绘制了FFT的幅度谱。

注意:

FFT(快速傅立叶变换)是一种计算离散傅立叶变换(DFT)的快速算法,用于将信号从时域转换为频域。

在Python中,可以使用NumPy库进行FFT的实现。

FFT python样例

下面是一个使用NumPy实现FFT的示例代码:

import numpy as np

def fft(x):
    N = len(x)
    if N <= 1:
        return x
    even = fft(x[0::2])
    odd = fft(x[1::2])
    T = [np.exp(-2j * np.pi * k / N) * odd[k] for k in range(N // 2)]
    return [even[k] + T[k] for k in range(N // 2)] + [even[k] - T[k] for k in range(N // 2)]

# 示例输入信号
x = [0, 1, 2, 3, 4, 5, 6, 7]
# 执行FFT
X = fft(x)
# 输出FFT结果
print(X)

输出结果:

[(28+0j), (-4+9.65685424949238j), (-4+4j), (-4+1.6568542494923806j), (-4+0j), (-4-1.6568542494923806j), (-4-4j), (-4-9.65685424949238j)]

上述代码中的 fft 函数使用递归将输入信号划分为偶数和奇数索引的两个部分,然后再将两部分合并。函数的返回值是FFT变换后的结果。

注意:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文