文章目录

  • 一、蝶形算法的作用
    • 1.1 直接计算离散傅里叶变换(DFT)的运算量
    • 1.2 使用蝶形算法的运算量
  • 二、蝶形算法的原理
    • 2.1 旋转因子WNnk的性质W_N^{nk}的性质WNnk​的性质
    • 2.2 按时间抽取基2-FFT(N=2LN=2^LN=2L)
    • 2.3 按频率抽取基2-FFT(N=2LN=2^LN=2L)
    • 2.4 两种抽取方法的比较
  • 三、蝶形算法的实现

一、蝶形算法的作用

使用蝶形算法的主要目的就是减少计算量

1.1 直接计算离散傅里叶变换(DFT)的运算量

设复序列X(n)X(n)X(n)长度为NNN点,其DFT为X(k)=∑n=0N−1x(n)WNnkX(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk}X(k)=∑n=0N−1​x(n)WNnk​,其中k=0,1,...,N−1k=0,1,...,N-1k=0,1,...,N−1
所以我们可以算出:
计算一个X(k)X(k)X(k)需要进行乘法NNN次、加法N−1N-1N−1次
计算整个复序列X(N)X(N)X(N)需要进行乘法N2N^2N2次、加法N(N−1)N(N-1)N(N−1)次
当NNN很大时,其运算量也很大

1.2 使用蝶形算法的运算量

(为了对比明显,此处直接给出分解一次所需的运算量,具体过程见原理)
分解一次后的运算量=222个N/2N/2N/2的DFT+N/2N/2N/2个蝶形
乘法次数2∗(N/2)2+N/2=N2/2+N/22*(N/2)^2+N/2=N^2/2+N/22∗(N/2)2+N/2=N2/2+N/2
加法次数2∗N/2∗(N/2−1)+N=N2/22*N/2*(N/2-1)+N=N^2/22∗N/2∗(N/2−1)+N=N2/2
经过一次分解后,运算量减少了近一半

二、蝶形算法的原理

2.1 旋转因子WNnk的性质W_N^{nk}的性质WNnk​的性质

对称性:(WNnk)∗=WN−nk=WNk(N−n)(W_N^{nk})^*=W_N^{-nk}=W_N^{k(N-n)}(WNnk​)∗=WN−nk​=WNk(N−n)​
周期性:WN(n+N)k=WNn(k+N)=WNnkW_N^{(n+N)k}=W_N^{n(k+N)}=W_N^{nk}WN(n+N)k​=WNn(k+N)​=WNnk​
可约性:WmNmnk=WNnkW_{mN}^{mnk}=W_N^{nk}WmNmnk​=WNnk​ WNnk=WN/mnk/mW_N^{nk}=W_{N/m}^{nk/m}WNnk​=WN/mnk/m​
其他:WNN/2=−1W_N^{N/2}=-1WNN/2​=−1 WNk+N/2=−WNkW_N^{k+N/2}=-W_N^kWNk+N/2​=−WNk​

2.2 按时间抽取基2-FFT(N=2LN=2^LN=2L)

将序列x(n)x(n)x(n)按奇偶性分成两组
{x(2r)=x1(r)r=0,1,...,N/2-1x(2r+1)=x2(r)\begin{cases} x(2r)=x_1(r)&\text{r=0,1,...,N/2-1} \\ x(2r+1)=x_2(r) \end{cases}{x(2r)=x1​(r)x(2r+1)=x2​(r)​r=0,1,...,N/2-1
X(k)=∑n=0N−1x(n)WNnkX(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk}X(k)=∑n=0N−1​x(n)WNnk​
=∑n=0,n偶数N−1x(n)WNnk+∑n=0,n奇数N−1x(n)WNnk=\sum_{n=0,n偶数}^{N-1}x(n)W_N^{nk}+\sum_{n=0,n奇数}^{N-1}x(n)W_N^{nk}=∑n=0,n偶数N−1​x(n)WNnk​+∑n=0,n奇数N−1​x(n)WNnk​
=∑r=0N/2−1x(2r)WN2rk+∑r=0N/2−1x(2r+1)WN(2r+1)k=\sum_{r=0}^{N/2-1}x(2r)W_N^{2rk}+\sum_{r=0}^{N/2-1}x(2r+1)W_N^{(2r+1)k}=∑r=0N/2−1​x(2r)WN2rk​+∑r=0N/2−1​x(2r+1)WN(2r+1)k​
=∑r=0N/2−1x1(r)WN/2rk+∑r=0N/2−1x2(r)WNkWN/2rk=\sum_{r=0}^{N/2-1}x_1(r)W_{N/2}^{rk}+\sum_{r=0}^{N/2-1}x_2(r)W_N^kW_{N/2}^{rk}=∑r=0N/2−1​x1​(r)WN/2rk​+∑r=0N/2−1​x2​(r)WNk​WN/2rk​
=X1(k)+WNkX2(k)=X_1(k)+W_N^kX_2(k)=X1​(k)+WNk​X2​(k)
X1(k)X_1(k)X1​(k)和X2(k)X_2(k)X2​(k)分别是x1(n)x_1(n)x1​(n)和x2(n)x_2(n)x2​(n)的N/2N/2N/2的DFT,即k=0,1,...,N/2−1k=0,1,...,N/2-1k=0,1,...,N/2−1
所以我们要求X(k)X(k)X(k)的值,还要求后半段的DFT,即k=N/2,N/2+1,...,N−1k=N/2,N/2+1,...,N-1k=N/2,N/2+1,...,N−1
利用周期性WN/2r(N/2+k)=WN/2rkW_{N/2}^{r(N/2+k)}=W_{N/2}^{rk}WN/2r(N/2+k)​=WN/2rk​可知
X1(N/2+k)=∑r=0N/2−1x1(r)WN/2r(N/2+k)=∑r=0N/2−1x1(r)WN/2rk=X1(k)X_1(N/2+k)=\sum_{r=0}^{N/2-1}x_1(r)W_{N/2}^{r(N/2+k)}=\sum_{r=0}^{N/2-1}x_1(r)W_{N/2}^{rk}=X_1(k)X1​(N/2+k)=∑r=0N/2−1​x1​(r)WN/2r(N/2+k)​=∑r=0N/2−1​x1​(r)WN/2rk​=X1​(k)
同理可得X2(N/2+k)=X2(k)X_2(N/2+k)=X_2(k)X2​(N/2+k)=X2​(k)
又因为WNk+N/2=−WNkW_N^{k+N/2}=-W_N^kWNk+N/2​=−WNk​,所以有
当k=0,1,...,N/2−1k=0,1,...,N/2-1k=0,1,...,N/2−1时
X(k+N/2)=X1(k+N/2)+WNk+N/2X2(k+N/2)X(k+N/2)=X_1(k+N/2)+W_N^{k+N/2}X_2(k+N/2)X(k+N/2)=X1​(k+N/2)+WNk+N/2​X2​(k+N/2)
=X1(k)−WNkX2(k)=X_1(k)-W_N^kX_2(k)=X1​(k)−WNk​X2​(k)
综上所述,我们可以得出蝶形运算:
{X(k)=X1(k)+WNkX2(k)k=0,1,...,N/2-1X(k)=X1(k)−WNkX2(k)k=N/2,N/2+1,...,N-1\begin{cases} X(k)=X_1(k)+W_N^kX_2(k)& \text{k=0,1,...,N/2-1} \\ X(k)=X_1(k)-W_N^kX_2(k)& \text{k=N/2,N/2+1,...,N-1} \end{cases}{X(k)=X1​(k)+WNk​X2​(k)X(k)=X1​(k)−WNk​X2​(k)​k=0,1,...,N/2-1k=N/2,N/2+1,...,N-1​

2.3 按频率抽取基2-FFT(N=2LN=2^LN=2L)

将序列x(n)x(n)x(n)按顺序分成前后两半
{前半子序列x(n)n=0,1,...,N/2-1后半子序列x(n)n=N/2,N/2+1,...,N-1\begin{cases} 前半子序列x(n)& \text{n=0,1,...,N/2-1} \\ 后半子序列x(n)& \text{n=N/2,N/2+1,...,N-1} \end{cases}{前半子序列x(n)后半子序列x(n)​n=0,1,...,N/2-1n=N/2,N/2+1,...,N-1​
X(k)=∑n=0N−1x(n)WNnkX(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk}X(k)=∑n=0N−1​x(n)WNnk​
=∑n=0N/2−1x(n)WNnk+∑n=N/2N−1x(n)WNnk=\sum_{n=0}^{N/2-1}x(n)W_N^{nk}+\sum_{n=N/2}^{N-1}x(n)W_N^{nk}=∑n=0N/2−1​x(n)WNnk​+∑n=N/2N−1​x(n)WNnk​
=∑n=0N/2−1x(n)WNnk+∑n=0N/2−1x(n+N/2)WNk(n+N/2)=\sum_{n=0}^{N/2-1}x(n)W_N^{nk}+\sum_{n=0}^{N/2-1}x(n+N/2)W_N^{k(n+N/2)}=∑n=0N/2−1​x(n)WNnk​+∑n=0N/2−1​x(n+N/2)WNk(n+N/2)​
=∑n=0N/2−1[x(n)+x(n+N/2)WNNk/2]WNnk=\sum_{n=0}^{N/2-1}\begin{bmatrix}x(n)+x(n+N/2)W_N^{Nk/2}\end{bmatrix}W_N^{nk}=∑n=0N/2−1​[x(n)+x(n+N/2)WNNk/2​​]WNnk​
其中k=0,1,...,N−1k=0,1,...,N-1k=0,1,...,N−1
因为WNN/2=−1W_N^{N/2}=-1WNN/2​=−1,所以WNNK/2=(−1)kW_N^{NK/2}=(-1)^kWNNK/2​=(−1)k,可得:
X(k)=∑n=0N/2−1[x(n)+(−1)kx(n+N/2)]WNnkX(k)=\sum_{n=0}^{N/2-1}\begin{bmatrix}x(n)+(-1)^kx(n+N/2)\end{bmatrix}W_N^{nk}X(k)=∑n=0N/2−1​[x(n)+(−1)kx(n+N/2)​]WNnk​
然后再按照奇偶性进行划分
{k=2rr=0,1,...,N/2-1k=2r+1\begin{cases}k=2r& \text{r=0,1,...,N/2-1}\\k=2r+1\end{cases}{k=2rk=2r+1​r=0,1,...,N/2-1
则式X(k)=∑n=0N/2−1[x(n)+(−1)kx(n+N/2)]WNnkX(k)=\sum_{n=0}^{N/2-1}\begin{bmatrix}x(n)+(-1)^kx(n+N/2)\end{bmatrix}W_N^{nk}X(k)=∑n=0N/2−1​[x(n)+(−1)kx(n+N/2)​]WNnk​可转化为
{X(2r)=∑n=0N/2−1[x(n)+x(n+N/2)]WN/2nrX(2r+1)=∑n=0N/2−1[x(n)−x(n+N/2)]WNn(2r+1)=∑n=0N/2−1{[x(n)−x(n+N/2)]WNn}WN/2nr\begin{cases} X(2r)=\sum_{n=0}^{N/2-1}\begin{bmatrix}x(n)+x(n+N/2)\end{bmatrix}W_{N/2}^{nr}\\X(2r+1)=\sum_{n=0}^{N/2-1}\begin{bmatrix}x(n)-x(n+N/2)\end{bmatrix}W_{N}^{n(2r+1)}=\sum_{n=0}^{N/2-1}\begin{Bmatrix}\begin{bmatrix}x(n)-x(n+N/2)\end{bmatrix}W_N^n\end{Bmatrix}W_{N/2}^{nr}\end{cases}{X(2r)=∑n=0N/2−1​[x(n)+x(n+N/2)​]WN/2nr​X(2r+1)=∑n=0N/2−1​[x(n)−x(n+N/2)​]WNn(2r+1)​=∑n=0N/2−1​{[x(n)−x(n+N/2)​]WNn​​}WN/2nr​​
令{x1(n)=x(n)+x(n+N/2)蝶形运算x2(n)=[x(n)−x(n+N/2)]WNn\begin{cases}x_1(n)=x(n)+x(n+N/2)& \text{蝶形运算}\\x_2(n)=\begin{bmatrix}x(n)-x(n+N/2)\end{bmatrix}W_N^n\end{cases}{x1​(n)=x(n)+x(n+N/2)x2​(n)=[x(n)−x(n+N/2)​]WNn​​蝶形运算
有{X(2r)=∑n=0N/2−1x1(n)WN/2nrX(2r+1)=∑n=0N/2−1x2(n)WN/2nr\begin{cases} X(2r)=\sum_{n=0}^{N/2-1}x_1(n)W_{N/2}^{nr}\\X(2r+1)=\sum_{n=0}^{N/2-1}x_2(n)W_{N/2}^{nr}\end{cases}{X(2r)=∑n=0N/2−1​x1​(n)WN/2nr​X(2r+1)=∑n=0N/2−1​x2​(n)WN/2nr​​

2.4 两种抽取方法的比较

  • 时间抽取法输入的是倒位序,输出是正位序;频率抽取法相反;
  • 两种抽取方法的基本蝶形不同;
  • 两种抽取方法的运算量相同;
  • 两种抽取方法的基本蝶形互为转置。

三、蝶形算法的实现

Matlab代码实现:
Butterfly_Algorithm.m

function out=butterfly_algorithm(in)
N=length(in); %输入数据的长度
M=log2(N); %蝶形运算的级数
%%求N的反序码,如1(001)的反序码为100,对应的值为4
indexs=zeros(1,N); %记录反序码值的数组
for n=0:N-1opposite=zeros(1,M); %记录反序码的数组value=0; %记录反序码的值for m=1:Ms=floor(n/2^(m-1)); %向下取整opposite(m)=mod(s,2); %计算余数value=value+opposite(m)*2^(M-m);endindexs(n+1)=value+1;
end
%%蝶形运算
out=zeros(1,N); %定义输出数组
for n=1:Nout(n)=in(indexs(n));
end
for I=1:M %按照蝶形运行的级数依次计算distance=2^(I-1); %两个点的距离for J=0:distance-1nk=J*(2^(M-I));W=exp(-i*2*pi*nk/N); %转换因子公式,其中i代表虚部for K=J+1:2^I:N %找到每一个蝶形的左上点t1=out(K);t2=out(K+distance);out(K)=t1+t2*W; %蝶形运算公式out(K+distance)=t1-t2*W;endend
end

运行结果图

对结果进行检验(公式法)

function X=test_butterfly_algorithm(x)
N=length(x);
X=[];
for k=1:Nsum=0;for n=1:Nsum=sum+x(n)*exp(-j*2*pi*(k-1)*(n-1)/N)endX(k)=sum;
end

运行结果图

在误差允许的范围内,蝶形运行的结果和直接计算快速傅里叶变换的结果相同。

蝶形算法(Butterfly Algorithm)未更完相关推荐

  1. 大数据Spark学习笔记—未更完

    Spark概述 核心模块 Spark编程配置 IDEA配置scala环境 IDEA软件中Scala配置安装教程(Spark计算环境搭建)_jing_zhong的博客-CSDN博客 较全的idea202 ...

  2. 小程序 | 黑马商城【未更完--实习去了】

    文章目录 起步 tabBar 创建 tabBar 分支 创建 tabBar 页面 配置 tabBar 效果 删除默认的 index 首页 修改导航条的样式效果 分支的提交与合并 首页 1. 创建 ho ...

  3. 马哥linux运维15~25讲笔记(未更完)

    # 15至24讲主要是:管理及io重定向.Grep及正则表达式.egrep及扩展正则表达式.bash编程脚本之变量变量类型.条件判断.条件判断及算术运算.整数测试及特殊变量.sed命令.字符串测试及f ...

  4. 匈牙利算法Hungarian algorithm

    匈牙利算法是解决寻找二分图最大匹配的. 匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),换句话说就是 ...

  5. 分布式共识算法 (Consensus Algorithm)

    分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者 针对 某一件事 达成完全 一致 :一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? P ...

  6. 在线算法(online algorithm)--竞争性分析

    文章目录 一.Problem Setting 1.1 competitve analysis 1.2 page replacement 二.Deterministic Online Algorithm ...

  7. 使用改进的YOLO-V4网络实时检测水产养殖水下图像中未吃完的饲料颗粒

    原文链接: <Real-time detection of uneaten feed pellets in underwater images for aquaculture using an ...

  8. 【智能优化算法】萤火虫优化算法 (Firefly algorithm,FA),2009

    前言 萤火虫优化算法(Firefly algorithm,FA).由英国剑桥大学的 Yang 等人于 2009 年提出,主要模拟了萤火虫根据个体亮度而相互吸引的行为.作为最新的群智能优化算法之一 , ...

  9. 【原创】CSSOO的思想及CSS框架的应用(未整理完)

    CSSOO的思想及CSS框架的应用 前语:通过这次研究分析总结,个人对CSSOO的概念及应用的思路也更明确一些,是一个和大家共同学习的过程. 一.CSS框架 框架目的: 给出一个相对规范的开发方法,给 ...

  10. 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm

    我们有一堆数据,默认他们是线性可分的.  定义f为这个数据分割线的最优解,但是我们不知道他的值.  我们仅有一个函数集H,这个函数一般是无穷大的.我们的目的就是从H中找出一条线g来尽可能的接近f.但是 ...

最新文章

  1. 安卓隐藏摄像_侧置摄像与隐藏前摄,拒绝单调乏味,这两款国产5G手机独具匠心...
  2. php5和php7的bccomp计算精度区别
  3. [html] 如何在页面上显示Emoji表情?
  4. English trip -- VC(情景课)5 Around Town
  5. Swift @escaping @noescape
  6. 【Elasticsearch】 elasticsearch中 rollover 的用法
  7. 在个人Blog页面显示积分与排名
  8. 华为2021数字化转型报告:从战略到执行.pdf(附103页pdf下载链接)
  9. NET4.0新功能之String.IsNullOrWhiteSpace() 方法
  10. gitlab+jenkins+ansible集成持续发布
  11. php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别
  12. 拓端tecdat|R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化
  13. Raki的统计学习方法笔记0x2章:感知机
  14. 华沙理工大学语言c1,留学波兰华沙理工大学:一个让人轻易就爱上的地方
  15. 加州大学戴维斯分校 计算机科学,加州大学戴维斯分校计算机科学申请要求详细解读...
  16. python 切片器_Excel中如何使用切片器,这个太高大上了
  17. e4a 蓝牙温度app_单片机ESP8266无线传输DHT11温湿度(APP+E4A调试说明与程序设计)
  18. Weex Android SDK源码分析
  19. win7自动关机(win7自动关机)
  20. 小狗钱钱2-读书笔记

热门文章

  1. java8 131下载_jdk 8u131下载
  2. 计算机信息安全专业代码0839,网络安全/信息安全专业大学排名(2017-2018-安全导航)...
  3. 使用 spire.xls 免费版 excel 转换成 pdf
  4. [SUCTF 2019]EasyWeb 1
  5. Windows server 2019的系统激活码 激活windows server 2012r2系统
  6. 苹果应用商店审核_苹果应用商店AppStore审核规则指南
  7. tim指定保存云服务器_腾讯TIM迎来重大版本更新 新增独立的云文件功能
  8. 高速列车运行调度控制仿真软件SimTrain
  9. 利用excel和word批量制作标签
  10. php集成环境安装包比较,PHP集成环境phpStudy安装包分享