蝶形算法(Butterfly Algorithm)未更完
文章目录
- 一、蝶形算法的作用
- 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−1x(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−1x(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−1x(n)WNnk+∑n=0,n奇数N−1x(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−1x(2r)WN2rk+∑r=0N/2−1x(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−1x1(r)WN/2rk+∑r=0N/2−1x2(r)WNkWN/2rk
=X1(k)+WNkX2(k)=X_1(k)+W_N^kX_2(k)=X1(k)+WNkX2(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−1x1(r)WN/2r(N/2+k)=∑r=0N/2−1x1(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/2X2(k+N/2)
=X1(k)−WNkX2(k)=X_1(k)-W_N^kX_2(k)=X1(k)−WNkX2(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)+WNkX2(k)X(k)=X1(k)−WNkX2(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−1x(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−1x(n)WNnk+∑n=N/2N−1x(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−1x(n)WNnk+∑n=0N/2−1x(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+1r=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/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
令{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−1x1(n)WN/2nrX(2r+1)=∑n=0N/2−1x2(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)未更完相关推荐
- 大数据Spark学习笔记—未更完
Spark概述 核心模块 Spark编程配置 IDEA配置scala环境 IDEA软件中Scala配置安装教程(Spark计算环境搭建)_jing_zhong的博客-CSDN博客 较全的idea202 ...
- 小程序 | 黑马商城【未更完--实习去了】
文章目录 起步 tabBar 创建 tabBar 分支 创建 tabBar 页面 配置 tabBar 效果 删除默认的 index 首页 修改导航条的样式效果 分支的提交与合并 首页 1. 创建 ho ...
- 马哥linux运维15~25讲笔记(未更完)
# 15至24讲主要是:管理及io重定向.Grep及正则表达式.egrep及扩展正则表达式.bash编程脚本之变量变量类型.条件判断.条件判断及算术运算.整数测试及特殊变量.sed命令.字符串测试及f ...
- 匈牙利算法Hungarian algorithm
匈牙利算法是解决寻找二分图最大匹配的. 匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),换句话说就是 ...
- 分布式共识算法 (Consensus Algorithm)
分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者 针对 某一件事 达成完全 一致 :一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? P ...
- 在线算法(online algorithm)--竞争性分析
文章目录 一.Problem Setting 1.1 competitve analysis 1.2 page replacement 二.Deterministic Online Algorithm ...
- 使用改进的YOLO-V4网络实时检测水产养殖水下图像中未吃完的饲料颗粒
原文链接: <Real-time detection of uneaten feed pellets in underwater images for aquaculture using an ...
- 【智能优化算法】萤火虫优化算法 (Firefly algorithm,FA),2009
前言 萤火虫优化算法(Firefly algorithm,FA).由英国剑桥大学的 Yang 等人于 2009 年提出,主要模拟了萤火虫根据个体亮度而相互吸引的行为.作为最新的群智能优化算法之一 , ...
- 【原创】CSSOO的思想及CSS框架的应用(未整理完)
CSSOO的思想及CSS框架的应用 前语:通过这次研究分析总结,个人对CSSOO的概念及应用的思路也更明确一些,是一个和大家共同学习的过程. 一.CSS框架 框架目的: 给出一个相对规范的开发方法,给 ...
- 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm
我们有一堆数据,默认他们是线性可分的. 定义f为这个数据分割线的最优解,但是我们不知道他的值. 我们仅有一个函数集H,这个函数一般是无穷大的.我们的目的就是从H中找出一条线g来尽可能的接近f.但是 ...
最新文章
- 安卓隐藏摄像_侧置摄像与隐藏前摄,拒绝单调乏味,这两款国产5G手机独具匠心...
- php5和php7的bccomp计算精度区别
- [html] 如何在页面上显示Emoji表情?
- English trip -- VC(情景课)5 Around Town
- Swift @escaping @noescape
- 【Elasticsearch】 elasticsearch中 rollover 的用法
- 在个人Blog页面显示积分与排名
- 华为2021数字化转型报告:从战略到执行.pdf(附103页pdf下载链接)
- NET4.0新功能之String.IsNullOrWhiteSpace() 方法
- gitlab+jenkins+ansible集成持续发布
- php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别
- 拓端tecdat|R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化
- Raki的统计学习方法笔记0x2章:感知机
- 华沙理工大学语言c1,留学波兰华沙理工大学:一个让人轻易就爱上的地方
- 加州大学戴维斯分校 计算机科学,加州大学戴维斯分校计算机科学申请要求详细解读...
- python 切片器_Excel中如何使用切片器,这个太高大上了
- e4a 蓝牙温度app_单片机ESP8266无线传输DHT11温湿度(APP+E4A调试说明与程序设计)
- Weex Android SDK源码分析
- win7自动关机(win7自动关机)
- 小狗钱钱2-读书笔记
热门文章
- java8 131下载_jdk 8u131下载
- 计算机信息安全专业代码0839,网络安全/信息安全专业大学排名(2017-2018-安全导航)...
- 使用 spire.xls 免费版 excel 转换成 pdf
- [SUCTF 2019]EasyWeb 1
- Windows server 2019的系统激活码 激活windows server 2012r2系统
- 苹果应用商店审核_苹果应用商店AppStore审核规则指南
- tim指定保存云服务器_腾讯TIM迎来重大版本更新 新增独立的云文件功能
- 高速列车运行调度控制仿真软件SimTrain
- 利用excel和word批量制作标签
- php集成环境安装包比较,PHP集成环境phpStudy安装包分享