首页 > 编程语言 >手写fft算法,和内置fft算法对比

手写fft算法,和内置fft算法对比

时间:2024-10-29 21:42:35浏览次数:6  
标签:内置 fft 算法 FFT 手写 NumPy

好的,下面我将提供一个完整的Python示例,包括手写FFT算法(快速傅里叶变换)和使用NumPy的内置FFT算法,然后对比两者的结果并绘制图形。

1. 手写FFT算法

我们将实现一个简单的FFT算法,即Cooley-Tukey算法,这是一种最常用的FFT算法。

2. NumPy内置FFT算法

NumPy库提供了一个非常高效的FFT实现,我们可以直接使用它来计算FFT。

3. 代码实现

首先,确保你已经安装了NumPy和matplotlib库。如果没有安装,可以通过以下命令安装:

pip install numpy matplotlib

下面是完整的Python代码:

import numpy as np
import matplotlib.pyplot as plt

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

# 生成测试信号
t = np.linspace(0, 1, 1024, False)
x = np.sin(2 * np.pi * 10 * t) + 0.5 * np.sin(2 * np.pi * 20 * t)

# 使用NumPy的FFT
fft_np = np.fft.fft(x)

# 手写FFT
fft_hand = fft_handwritten(x)

# 绘制结果
plt.figure(figsize=(14, 6))

# 绘制NumPy的FFT结果
plt.subplot(1, 2, 1)
plt.stem(np.abs(fft_np), linefmt='C0-', markerfmt='C0o', basefmt='C3-')
plt.title('NumPy FFT')
plt.xlabel('Frequency Bins')
plt.ylabel('Amplitude')

# 绘制手写FFT结果
plt.subplot(1, 2, 2)
plt.stem(np.abs(fft_hand), linefmt='C1-', markerfmt='C1o', basefmt='C3-')
plt.title('Handwritten FFT')
plt.xlabel('Frequency Bins')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()

4. 代码解释

  • fft_handwritten 函数实现了一个递归的FFT算法。
  • 我们生成了一个包含两个正弦波的测试信号。
  • 使用NumPy的FFT函数和手写的FFT函数计算FFT,并绘制结果的幅度。

5. 结果对比

运行上述代码,你将看到两个图:一个显示NumPy FFT的结果,另一个显示手写FFT的结果。理论上,如果手写FFT算法实现正确,两者的结果应该非常接近。然而,由于浮点数精度和算法优化的差异,可能会有轻微的差异。

这个示例提供了一个基本的框架,你可以根据需要调整和扩展,例如处理更大的数据集或更复杂的信号。

标签:内置,fft,算法,FFT,手写,NumPy
From: https://www.cnblogs.com/redufa/p/18514570

相关文章

  • Offer68题 Day2 树的基础算法
    1.前中后序递归遍历//前序遍历classSolution{public:voidtraversal(TreeNode*cur,vector<int>&vec){if(cur==NULL)return;vec.push_back(cur->val);//中traversal(cur->left,vec);//左traversal(cur-&g......
  • 朱刘算法
    1问题我们知道带权无向图上有一个经典问题:最小生成树。那么如果换成带权有向图呢?对于一个带权有向图,从中选出一个子图,使得该子图中无环,且存在一个点可以到达其他所有点,则这个子图就是一个树形图。而求出所有树形图中选出边权和最小的一种选法,就是最小树形图问题。容易想到,解决......
  • Offer68题 Day3 两个基础算法
    1.DFS深度优先算法/* -深度优先算法 DFS从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。 -使用递归实现。*/#include<iostream>#include<vector>usingnamespacestd;voidDFS(intnode,vector<vector<int>>&gra......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......
  • 算法刷题记录(day5)
    LC160.相交链表题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){if(head......
  • 字符串匹配-KMP算法实现代码
    字符串的基本操作同上一篇BF算法一致一.为模式串创建临时数组//KMP算法//1)为模式串创建临时数组voidcomputeLPSArray(char*pat,intM,int*lps){ //指向首元素 intj=0; //指向首元素的下一个元素 inti=1; //临时数组的首元素总为0 lps[0]=0; //结束条......
  • 【算法】分治算法-让问题消失
    博主推荐!!!:"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享,让我们一起进入这个精彩纷呈的学习网站吧!"即刻点击https://www.captainbed.cn/cyy算法系列:今天,我们要聊的......
  • 【算法学习】基环树
    基环树基环树就是类似于在树上加了一条边形成了环,去点环上的一条边后就会变成数,如下图。这是一个\(n\)个点\(n\)条边的连通图,如果不保证联通,它就会成为基环树森林。外向树:每个点都只有一条入边,因为向内上。内向树:每个点都只有一条出边,因为向外少。怎么用呢?因为有环的性......
  • 算法:查找
    算法1.顺序查找和折半查找1.1顺序查找1.2折半查找1.3索引顺序查找2.树表查找2.1查找2.2插入3.哈希表及哈希查找3.1哈希造表3.2处理冲突开放定址法链地址法3.3哈希查找查找是非数值数据处理中一种基本运算,查找运算的效率与查找表所采用的数据结构和查找......
  • 解码小红书CES算法,让你的笔记阅读量提升100%
    随着社交媒体成为日常生活的一部分,内容创作者们都在积极寻找提高作品可见性的方法。作为社交分享领域的佼佼者,小红书凭借其独特的CES算法机制,在众多平台中脱颖而出。本文将深入探讨小红书的CES算法工作原理,并提供实用技巧,帮助你显著提升笔记的阅读量。一、小红书CES算法解......