FFT蝶形算法的verilog实现专题——64点FFT 蝶形算法完整展开
FFT蝶形算法的verilog实现专题——64点FFT 蝶形算法完整展开
针对上一篇博文继续分解
因为64点FFT进行分组后,每组还是有16个数据,这需要对每组的16个数据在进行分组,这样才能达到最小运算单位4点FFT。
同样的,将A(n),B(n),C(n),D(n)按照上面的分组规则再次分组,A(n)又分出了4个数据组,依此类推,直接用matlab程序来展示(程序段3)
close all; clear all; clc;%%%%%%%%%%%stage1N = 64;
n = 0:N/4-1;data(1:64) = randn(1,64) + j*randn(1,64); %???????? ????
dataA = (data(1:16) + data(33:48) + data(17:32) + data(49:64)); % 0 4 8 12 16......
dataB = (((data(1:16) + data(33:48)) - (data(17:32) + data(49:64))).*exp(-j*2*pi/N*(2*n))); % 2 6 10 14 18......
dataC = (((data(1:16) - data(33:48)) - j*(data(17:32) - data(49:64))).*exp(-j*2*pi/N*(1*n))); % 1 5 9 13 17......
dataD = (((data(1:16) - data(33:48)) + j*(data(17:32) - data(49:64))).*exp(-j*2*pi/N*(3*n))); % 3 7 11 15 19......%%%%%%%%%stage2N = 16;
n = 0:N/4-1;dataA1 = (dataA(1:4) + dataA(9:12) + dataA(5:8) + dataA(13:16)); % 0 16 32 48
dataA2 = (((dataA(1:4) + dataA(9:12)) - (dataA(5:8) + dataA(13:16))).*exp(-j*2*pi/N*(2*n))); % 8 24 40 56
dataA3 = (((dataA(1:4) - dataA(9:12)) - j*(dataA(5:8) - dataA(13:16))).*exp(-j*2*pi/N*(1*n)));% 4 20 36 52
dataA4 = (((dataA(1:4) - dataA(9:12)) + j*(dataA(5:8) - dataA(13:16))).*exp(-j*2*pi/N*(3*n)));% 12 28 44 60fft_dataA(1:4:16) = fft(dataA1);
fft_dataA(3:4:16) = fft(dataA2);
fft_dataA(2:4:16) = fft(dataA3);
fft_dataA(4:4:16) = fft(dataA4);dataB1 = (dataB(1:4) + dataB(9:12) + dataB(5:8) + dataB(13:16)); % 2 18 34 50
dataB2 = (((dataB(1:4) + dataB(9:12)) - (dataB(5:8) + dataB(13:16))).*exp(-j*2*pi/N*(2*n))); % 10 26 42 58
dataB3 = (((dataB(1:4) - dataB(9:12)) - j*(dataB(5:8) - dataB(13:16))).*exp(-j*2*pi/N*(1*n)));% 6 22 38 54
dataB4 = (((dataB(1:4) - dataB(9:12)) + j*(dataB(5:8) - dataB(13:16))).*exp(-j*2*pi/N*(3*n)));% 14 30 46 62fft_dataB(1:4:16) = fft(dataB1);
fft_dataB(3:4:16) = fft(dataB2);
fft_dataB(2:4:16) = fft(dataB3);
fft_dataB(4:4:16) = fft(dataB4);dataC1 = (dataC(1:4) + dataC(9:12) + dataC(5:8) + dataC(13:16)); % 1 17 33 49
dataC2 = (((dataC(1:4) + dataC(9:12)) - (dataC(5:8) + dataC(13:16))).*exp(-j*2*pi/N*(2*n))); % 9 25 41 57
dataC3 = (((dataC(1:4) - dataC(9:12)) - j*(dataC(5:8) - dataC(13:16))).*exp(-j*2*pi/N*(1*n)));% 5 21 37 53
dataC4 = (((dataC(1:4) - dataC(9:12)) + j*(dataC(5:8) - dataC(13:16))).*exp(-j*2*pi/N*(3*n)));% 13 29 45 61fft_dataC(1:4:16) = fft(dataC1);
fft_dataC(3:4:16) = fft(dataC2);
fft_dataC(2:4:16) = fft(dataC3);
fft_dataC(4:4:16) = fft(dataC4);dataD1 = (dataD(1:4) + dataD(9:12) + dataD(5:8) + dataD(13:16)); % 3 19 35 51
dataD2 = (((dataD(1:4) + dataD(9:12)) - (dataD(5:8) + dataD(13:16))).*exp(-j*2*pi/N*(2*n))); % 11 27 42 59
dataD3 = (((dataD(1:4) - dataD(9:12)) - j*(dataD(5:8) - dataD(13:16))).*exp(-j*2*pi/N*(1*n)));% 7 23 39 55
dataD4 = (((dataD(1:4) - dataD(9:12)) + j*(dataD(5:8) - dataD(13:16))).*exp(-j*2*pi/N*(3*n)));% 15 31 47 63fft_dataD(1:4:16) = fft(dataD1);
fft_dataD(3:4:16) = fft(dataD2);
fft_dataD(2:4:16) = fft(dataD3);
fft_dataD(4:4:16) = fft(dataD4);fft2(1:4:64) = fft_dataA;
fft2(3:4:64) = fft_dataB;
fft2(2:4:64) = fft_dataC;
fft2(4:4:64) = fft_dataD;fft1 = (fft(data));
plot(abs(fft1 - fft2))
运行后如下图所示:
(程序段4)
close all; clear all; clc;%%%%%%%%%%%stage1N = 64;
n = 0:N/4-1;data(1:64) = randn(1,64) + j*randn(1,64); dataA = (data(1:16) + data(33:48) + data(17:32) + data(49:64)); % 0 4 8 12 16......
dataB = (((data(1:16) + data(33:48)) - (data(17:32) + data(49:64))).*exp(-j*2*pi/N*(2*n))); % 2 6 10 14 18......
dataC = (((data(1:16) - data(33:48)) - j*(data(17:32) - data(49:64))).*exp(-j*2*pi/N*(1*n))); % 1 5 9 13 17......
dataD = (((data(1:16) - data(33:48)) + j*(data(17:32) - data(49:64))).*exp(-j*2*pi/N*(3*n))); % 3 7 11 15 19......%%%%%%%%%stage2N = 16;
n = 0:N/4-1;dataA1 = (dataA(1:4) + dataA(9:12) + dataA(5:8) + dataA(13:16)); % 0 16 32 48
dataA2 = (((dataA(1:4) + dataA(9:12)) - (dataA(5:8) + dataA(13:16))).*exp(-j*2*pi/N*(2*n))); % 8 24 40 56
dataA3 = (((dataA(1:4) - dataA(9:12)) - j*(dataA(5:8) - dataA(13:16))).*exp(-j*2*pi/N*(1*n)));% 4 20 36 52
dataA4 = (((dataA(1:4) - dataA(9:12)) + j*(dataA(5:8) - dataA(13:16))).*exp(-j*2*pi/N*(3*n)));% 12 28 44 60dataB1 = (dataB(1:4) + dataB(9:12) + dataB(5:8) + dataB(13:16)); % 2 18 34 50
dataB2 = (((dataB(1:4) + dataB(9:12)) - (dataB(5:8) + dataB(13:16))).*exp(-j*2*pi/N*(2*n))); % 10 26 42 58
dataB3 = (((dataB(1:4) - dataB(9:12)) - j*(dataB(5:8) - dataB(13:16))).*exp(-j*2*pi/N*(1*n)));% 6 22 38 54
dataB4 = (((dataB(1:4) - dataB(9:12)) + j*(dataB(5:8) - dataB(13:16))).*exp(-j*2*pi/N*(3*n)));% 14 30 46 62dataC1 = (dataC(1:4) + dataC(9:12) + dataC(5:8) + dataC(13:16)); % 1 17 33 49
dataC2 = (((dataC(1:4) + dataC(9:12)) - (dataC(5:8) + dataC(13:16))).*exp(-j*2*pi/N*(2*n))); % 9 25 41 57
dataC3 = (((dataC(1:4) - dataC(9:12)) - j*(dataC(5:8) - dataC(13:16))).*exp(-j*2*pi/N*(1*n)));% 5 21 37 53
dataC4 = (((dataC(1:4) - dataC(9:12)) + j*(dataC(5:8) - dataC(13:16))).*exp(-j*2*pi/N*(3*n)));% 13 29 45 61dataD1 = (dataD(1:4) + dataD(9:12) + dataD(5:8) + dataD(13:16)); % 3 19 35 51
dataD2 = (((dataD(1:4) + dataD(9:12)) - (dataD(5:8) + dataD(13:16))).*exp(-j*2*pi/N*(2*n))); % 11 27 42 59
dataD3 = (((dataD(1:4) - dataD(9:12)) - j*(dataD(5:8) - dataD(13:16))).*exp(-j*2*pi/N*(1*n)));% 7 23 39 55
dataD4 = (((dataD(1:4) - dataD(9:12)) + j*(dataD(5:8) - dataD(13:16))).*exp(-j*2*pi/N*(3*n)));% 15 31 47 63%%%%%%%%%stage3N = 4;
n = 0;dataA11 = (dataA1(1) + dataA1(3) + dataA1(2) + dataA1(4)); % 0
dataA12 = (((dataA1(1) + dataA1(3)) - (dataA1(2) + dataA1(4))).*exp(-j*2*pi/N*(2*n))); % 32
dataA13 = (((dataA1(1) - dataA1(3)) - j*(dataA1(2) - dataA1(4))).*exp(-j*2*pi/N*(1*n)));% 16
dataA14 = (((dataA1(1) - dataA1(3)) + j*(dataA1(2) - dataA1(4))).*exp(-j*2*pi/N*(3*n)));% 48%fft_dataA(1:4:16) = fft(dataA1); 这里只展开一个式子,后面15个都需要像这样展开,我就偷懒不写了
fft_dataA(1:4:16) = [dataA11,dataA13,dataA12,dataA14];
fft_dataA(3:4:16) = fft(dataA2);
fft_dataA(2:4:16) = fft(dataA3);
fft_dataA(4:4:16) = fft(dataA4);
fft_dataB(1:4:16) = fft(dataB1);
fft_dataB(3:4:16) = fft(dataB2);
fft_dataB(2:4:16) = fft(dataB3);
fft_dataB(4:4:16) = fft(dataB4);
fft_dataC(1:4:16) = fft(dataC1);
fft_dataC(3:4:16) = fft(dataC2);
fft_dataC(2:4:16) = fft(dataC3);
fft_dataC(4:4:16) = fft(dataC4);
fft_dataD(1:4:16) = fft(dataD1);
fft_dataD(3:4:16) = fft(dataD2);
fft_dataD(2:4:16) = fft(dataD3);
fft_dataD(4:4:16) = fft(dataD4);fft2(1:4:64) = fft_dataA;
fft2(3:4:64) = fft_dataB;
fft2(2:4:64) = fft_dataC;
fft2(4:4:64) = fft_dataD;fft1 = (fft(data));
plot(abs(fft1 - fft2))
整个蝶形算法示意图如下,完全对应上面matlab程序
这里就已经有点复杂了,够好好理解的了。
接下来就是切换到verilog实现了。
写于2021年11月6日。
如需交流,可以评论区留言,然后加QQ:172146579
FFT蝶形算法的verilog实现专题——64点FFT 蝶形算法完整展开相关推荐
- 《算法不好玩》专题二:基础排序算法
视频链接:<算法不好玩>专题二 2-1选择排序 无序数组→有序数组 基于排序算法可以学习的话题:「时间复杂度」.「递归」.「循环不变量」 排序算法可以分为:「基于比较的排序算法」.「非比较 ...
- lms算法的verilog实现_基于FPGA和LMS算法的系统建模
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.c ...
- [转]常用数字处理算法的Verilog实现
2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自 ...
- 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现
2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自低位 ...
- 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)
[经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...
- matlab函数fftshift,matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)
plot([0 : PointNum/2 - 1], x1(1:PointNum/2)); grid on subplot(3,1,2); % [REX IMX] am = sqrt(abs(REX. ...
- 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换
对称加密算法 对称加密算法又可以分成流加密算法和块加密 算法. 流加密算法又称为序列加密算法或序列密码,它每次只对明文中的单个位或单个字节 进行加密操作.这种算法的优点是能够实时进行数据传输和解密,缺 ...
- 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h
变量x与固定系数h二补数乘积算法及其Verilog实现(signed 2'scomplement) 一.二补数乘法算法 我们设计有符号乘法器时会遇到一个问题,负数二进制数不能直接移位相乘再相加,这样做 ...
- lms算法的verilog实现_LMS verilog实现的LMS的算法,另外有tb文件可以测试 代码正确 VHDL-FPGA- 252万源代码下载- www.pudn.com...
文件名称: LMS下载 收藏√ [ 5 4 3 2 1 ] 开发工具: VHDL 文件大小: 3496 KB 上传时间: 2013-07-07 下载次数: 56 提 供 者: 强建龙 详细 ...
- 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
承接上文 承接上一篇文章[算法数据结构专题]「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)]我们基本上对层级时间轮算法的基本原理有了一定的认识, ...
最新文章
- Django 中的 cookie 和 session
- 【转】WINDOWS消息响应,以及处理分派机制
- chrome浏览器调试手机端h5页面
- 网易MCtalk Live:漫谈短视频平台概况,全面解读头部内容
- java中的工厂模式_深入理解Java的三种工厂模式
- ASP.NET .Net UCS2 加码最复杂的方法
- java chain_java 8中 predicate chain的使用
- [Linux]守护进程(精灵进程)
- ue4集合类型_UE4-Sockets
- ThinkPHP6内核学生成绩管理系统源码 内附安装说明
- 计算机科学与技术专业可以转哪些专业,计算机科学与技术学院本科生转专业实施细则...
- 今日恐慌与贪婪指数为86 贪婪程度有所缓解
- vscode配置python 控制台/终端/TERMINAL 不输出/不显示 解决办法
- Excel导出时数据中有特殊字符的可能会出错
- Python 基础——一张图告诉你PyCharm如何进行断点调试
- 黄聪:解决WordPress的函数mb_strimwidth截断中文产生乱码的问题
- WifiConnectivityManager 管理扫描
- C语言中逻辑非和取反的不同
- 哔哩哔哩APP导出缓存视频并合并成MP4
- c++ 序列化库iguana使用总结