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 蝶形算法完整展开相关推荐

  1. 《算法不好玩》专题二:基础排序算法

    视频链接:<算法不好玩>专题二 2-1选择排序 无序数组→有序数组 基于排序算法可以学习的话题:「时间复杂度」.「递归」.「循环不变量」 排序算法可以分为:「基于比较的排序算法」.「非比较 ...

  2. lms算法的verilog实现_基于FPGA和LMS算法的系统建模

    © 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.    http://www.c ...

  3. [转]常用数字处理算法的Verilog实现

      2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自 ...

  4. 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现

    2.6.3 常用数字处理算法的Verilog实现 1.加法器的Verilog实现 串行加法器 组合逻辑的加法器可以利用真值表,通过与门和非门简单地实现.假设 和 表示两个加数, 表示和, 表示来自低位 ...

  5. 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)

    [经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...

  6. 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. ...

  7. 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换

    对称加密算法 对称加密算法又可以分成流加密算法和块加密 算法. 流加密算法又称为序列加密算法或序列密码,它每次只对明文中的单个位或单个字节 进行加密操作.这种算法的优点是能够实时进行数据传输和解密,缺 ...

  8. 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h

    变量x与固定系数h二补数乘积算法及其Verilog实现(signed 2'scomplement) 一.二补数乘法算法 我们设计有符号乘法器时会遇到一个问题,负数二进制数不能直接移位相乘再相加,这样做 ...

  9. 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 提 供 者: 强建龙 详细 ...

  10. 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)

    承接上文 承接上一篇文章[算法数据结构专题]「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)]我们基本上对层级时间轮算法的基本原理有了一定的认识, ...

最新文章

  1. Django 中的 cookie 和 session
  2. 【转】WINDOWS消息响应,以及处理分派机制
  3. chrome浏览器调试手机端h5页面
  4. 网易MCtalk Live:漫谈短视频平台概况,全面解读头部内容
  5. java中的工厂模式_深入理解Java的三种工厂模式
  6. ASP.NET .Net UCS2 加码最复杂的方法
  7. java chain_java 8中 predicate chain的使用
  8. [Linux]守护进程(精灵进程)
  9. ue4集合类型_UE4-Sockets
  10. ThinkPHP6内核学生成绩管理系统源码 内附安装说明
  11. 计算机科学与技术专业可以转哪些专业,计算机科学与技术学院本科生转专业实施细则...
  12. 今日恐慌与贪婪指数为86 贪婪程度有所缓解
  13. vscode配置python 控制台/终端/TERMINAL 不输出/不显示 解决办法
  14. Excel导出时数据中有特殊字符的可能会出错
  15. Python 基础——一张图告诉你PyCharm如何进行断点调试
  16. 黄聪:解决WordPress的函数mb_strimwidth截断中文产生乱码的问题
  17. WifiConnectivityManager 管理扫描
  18. C语言中逻辑非和取反的不同
  19. 哔哩哔哩APP导出缓存视频并合并成MP4
  20. c++ 序列化库iguana使用总结

热门文章

  1. 计算机视觉知识点-车型识别
  2. 一款访问远程Linux服务器的web SSH终端
  3. 虚拟机桥接模式ping不通外网的解决办法
  4. php中医处方系统简介
  5. 关于2019中国移动广西分公司社会招聘互联网电视维护岗位笔试、面试经验分享
  6. 计算机学部毕业设计答疑记录,毕业论文指导记录怎么写?毕业论文指导记录12篇...
  7. 拼多多店铺等级怎么提升?店盈通来告诉你
  8. MOS管、IGBT、BJT的区别
  9. 公文写作神器 v2.8.1.20 去更新去广告版
  10. 一个完整的软件项目管理流程包括什么?有什么软件项目管理工具?