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

embedded/2024/10/18 18:14:38/

FFT快速傅里叶变换介绍

FFT(快速傅里叶变换)是计算离散傅里叶变换(DFT)及其逆变换的一种高效算法。DFT是一种将信号从时域转换到频域的数学工具,而FFT通过减少计算量来加速这一过程。

FFT的基本思想

FFT利用了DFT中的对称性和周期性,通过分而治之的策略将DFT分解为更小的DFT,从而显著减少计算复杂度。对于长度为N的序列,直接计算DFT的复杂度是O(N^2),而FFT的复杂度可以降低到O(N log N)。

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

选择分解:首先,将N(序列长度)分解为两个较小的因子,通常是选择N的偶数因子。最常见的分解是将N分解为两个相等的因子(即N为2的幂)。

重新排序(位反转):对输入序列进行位反转排序,这是为了将输入序列重新排列成一种便于后续处理的顺序。

蝶形运算:FFT算法的核心是蝶形运算。在蝶形运算中,两个输入(通常来自序列的特定位置)通过一系列乘法和加法操作结合成一个输出。这个过程在算法的不同层级上重复进行。

逐层计算:FFT算法通过逐层(从最低层到最高层)应用蝶形运算来计算DFT。每一层都基于前一层的输出,并且每一层的计算都更加接近最终的DFT结果。

Python FFT快速傅立叶变换

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

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

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

python">pip install numpy

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

python">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的幅度谱。

注意,这个例子仅用于演示如何在Python中使用numpy库进行FFT计算。在实际应用中,你可能需要根据你的具体需求调整信号生成、FFT计算以及结果分析的方式。

FFT(快速傅立叶变换)是一种计算离散傅立叶变换(DFT)的快速算法,用于将信号从时域转换为频域。在Python中,可以使用NumPy库进行FFT的实现。

python_68">FFT python样例

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

python">import numpy as npdef fft(x):N = len(x)if N <= 1:return xeven = 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变换后的结果。

注意:上述代码是一个简化的FFT实现,不考虑性能优化和处理异常情况。在实际应用中,可以使用NumPy库中的 numpy.fft.fft 函数进行FFT计算,它提供了更高效和稳定的实现。


http://www.ppmy.cn/embedded/91123.html

相关文章

linux基础知识

1、如何查看 CPU 信息&#xff1f; cat /proc/meminfo 2、查看占用 CPU 使用率最高的进程&#xff1f; ps aux --sort-%cpu | head3、如何查看一个文件的末尾 50 行&#xff1f; tail -n 50 /etc/profile 4、如何查看一个文件的前10行&#xff1f; head -n 10 /etc/profile 5…

第T6周:好莱坞明星识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** ● 难度&#xff1a;夯实基础 ● 语言&#xff1a;Python3、TensorFlow2 &#x1f37a; 要求&#xff1a; 1. 使用categorical_cross…

老版本kafka查询topic消费情况(python查询)

由于老版本的kafka缺少shell&#xff0c;导致无法通过命令直接进行查询&#xff0c;所以通过python代码&#xff0c;实现消费情况查询 安装必须的包 #pyhon2.5 pip install kafka-python1.4.7python脚本 #!/usr/bin/env python import sys from kafka import KafkaConsumer, …

Oracle认证1Z0-071线上考试注意事项

目录 一、前言二、回顾过往战绩第一次 裸考&#x1f412;第二次 背题库硬考&#xff01;&#x1f412;第三次 软件卡住&#xff0c;寄&#xff01;&#x1f648;第四次 汇总纠错&#xff0c;通过&#xff01;&#x1f31a; 三、考试流程四、考试注意事项1. 是否需要科学上网2. …

第六章 网络互连与互联网(一)

一、网络互连设备 &#xff08;1&#xff09;组成因特网的各个网络叫做子网&#xff0c;用于连接子网的设备叫作中间系统 ( IS )&#xff0c; 它的主要作用是协调各个网络的工作&#xff0c;使得跨网络的通信得以实现。 &#xff08;2&#xff09;网络互连设备的作用是连接不…

同城交易小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商家管理&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xff0…

【java基础】徒手写Hello, World!程序

文章目录 前提&#xff1a;java环境变量配置使用vscode编写helloworld解析 前提&#xff1a;java环境变量配置 https://blog.csdn.net/xzzteach/article/details/140869188 使用vscode编写helloworld code .为什么用code看下图 报错了&#xff01;&#xff01;&#xff01;&…

如何在运行Centos 6的虚拟服务器上安装cPanel

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Status: 废弃 本文涵盖的 CentOS 版本已不再受支持。如果您目前正在运行 CentOS 6 服务器&#xff0c;我们强烈建议升级或迁移到受支持的…