IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 蝶形算法(Butterfly Algorithm)未更完 -> 正文阅读

[数据结构与算法]蝶形算法(Butterfly Algorithm)未更完

一、蝶形算法的作用

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

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

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

1.2 使用蝶形算法的运算量

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

二、蝶形算法的原理

2.1 旋转因子 W N n k 的 性 质 W_N^{nk}的性质 WNnk?

对称性: ( W N n k ) ? = W N ? n k = W N k ( N ? n ) (W_N^{nk})^*=W_N^{-nk}=W_N^{k(N-n)} (WNnk?)?=WN?nk?=WNk(N?n)?
周期性: W N ( n + N ) k = W N n ( k + N ) = W N n k W_N^{(n+N)k}=W_N^{n(k+N)}=W_N^{nk} WN(n+N)k?=WNn(k+N)?=WNnk?
可约性: W m N m n k = W N n k W_{mN}^{mnk}=W_N^{nk} WmNmnk?=WNnk? W N n k = W N / m n k / m W_N^{nk}=W_{N/m}^{nk/m} WNnk?=WN/mnk/m?
其他: W N N / 2 = ? 1 W_N^{N/2}=-1 WNN/2?=?1 W N k + N / 2 = ? W N k W_N^{k+N/2}=-W_N^k WNk+N/2?=?WNk?

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

将序列 x ( n ) x(n) x(n)按奇偶性分成两组
{ x ( 2 r ) = x 1 ( r ) r=0,1,...,N/2-1 x ( 2 r + 1 ) = x 2 ( 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 = 0 N ? 1 x ( n ) W N n k X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk} X(k)=n=0N?1?x(n)WNnk?
= ∑ n = 0 , n 偶 数 N ? 1 x ( n ) W N n k + ∑ n = 0 , n 奇 数 N ? 1 x ( n ) W N n k =\sum_{n=0,n偶数}^{N-1}x(n)W_N^{nk}+\sum_{n=0,n奇数}^{N-1}x(n)W_N^{nk} =n=0,nN?1?x(n)WNnk?+n=0,nN?1?x(n)WNnk?
= ∑ r = 0 N / 2 ? 1 x ( 2 r ) W N 2 r k + ∑ r = 0 N / 2 ? 1 x ( 2 r + 1 ) W N ( 2 r + 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 = 0 N / 2 ? 1 x 1 ( r ) W N / 2 r k + ∑ r = 0 N / 2 ? 1 x 2 ( r ) W N k W N / 2 r k =\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?
= X 1 ( k ) + W N k X 2 ( k ) =X_1(k)+W_N^kX_2(k) =X1?(k)+WNk?X2?(k)
X 1 ( k ) X_1(k) X1?(k) X 2 ( k ) X_2(k) X2?(k)分别是 x 1 ( n ) x_1(n) x1?(n) x 2 ( n ) x_2(n) x2?(n) N / 2 N/2 N/2的DFT,即 k = 0 , 1 , . . . , N / 2 ? 1 k=0,1,...,N/2-1 k=0,1,...,N/2?1
所以我们要求 X ( k ) X(k) X(k)的值,还要求后半段的DFT,即 k = N / 2 , N / 2 + 1 , . . . , N ? 1 k=N/2,N/2+1,...,N-1 k=N/2,N/2+1,...,N?1
利用周期性 W N / 2 r ( N / 2 + k ) = W N / 2 r k W_{N/2}^{r(N/2+k)}=W_{N/2}^{rk} WN/2r(N/2+k)?=WN/2rk?可知
X 1 ( N / 2 + k ) = ∑ r = 0 N / 2 ? 1 x 1 ( r ) W N / 2 r ( N / 2 + k ) = ∑ r = 0 N / 2 ? 1 x 1 ( r ) W N / 2 r k = X 1 ( 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)
同理可得 X 2 ( N / 2 + k ) = X 2 ( k ) X_2(N/2+k)=X_2(k) X2?(N/2+k)=X2?(k)
又因为 W N k + N / 2 = ? W N k W_N^{k+N/2}=-W_N^k WNk+N/2?=?WNk?,所以有
k = 0 , 1 , . . . , N / 2 ? 1 k=0,1,...,N/2-1 k=0,1,...,N/2?1
X ( k + N / 2 ) = X 1 ( k + N / 2 ) + W N k + N / 2 X 2 ( 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)
= X 1 ( k ) ? W N k X 2 ( k ) =X_1(k)-W_N^kX_2(k) =X1?(k)?WNk?X2?(k)
综上所述,我们可以得出蝶形运算
{ X ( k ) = X 1 ( k ) + W N k X 2 ( k ) k=0,1,...,N/2-1 X ( k ) = X 1 ( k ) ? W N k X 2 ( 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 = 2 L N=2^L N=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 = 0 N ? 1 x ( n ) W N n k X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk} X(k)=n=0N?1?x(n)WNnk?
= ∑ n = 0 N / 2 ? 1 x ( n ) W N n k + ∑ n = N / 2 N ? 1 x ( n ) W N n k =\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 = 0 N / 2 ? 1 x ( n ) W N n k + ∑ n = 0 N / 2 ? 1 x ( n + N / 2 ) W N k ( 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 = 0 N / 2 ? 1 [ x ( n ) + x ( n + N / 2 ) W N N k / 2 ] W N n k =\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 ? 1 k=0,1,...,N-1 k=0,1,...,N?1
因为 W N N / 2 = ? 1 W_N^{N/2}=-1 WNN/2?=?1,所以 W N N K / 2 = ( ? 1 ) k W_N^{NK/2}=(-1)^k WNNK/2?=(?1)k,可得:
X ( k ) = ∑ n = 0 N / 2 ? 1 [ x ( n ) + ( ? 1 ) k x ( n + N / 2 ) ] W N n k X(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 = 2 r r=0,1,...,N/2-1 k = 2 r + 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 = 0 N / 2 ? 1 [ x ( n ) + ( ? 1 ) k x ( n + N / 2 ) ] W N n k X(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 ( 2 r ) = ∑ n = 0 N / 2 ? 1 [ x ( n ) + x ( n + N / 2 ) ] W N / 2 n r X ( 2 r + 1 ) = ∑ n = 0 N / 2 ? 1 [ x ( n ) ? x ( n + N / 2 ) ] W N n ( 2 r + 1 ) = ∑ n = 0 N / 2 ? 1 { [ x ( n ) ? x ( n + N / 2 ) ] W N n } W N / 2 n r \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??
{ x 1 ( n ) = x ( n ) + x ( n + N / 2 ) 蝶形运算 x 2 ( n ) = [ x ( n ) ? x ( n + N / 2 ) ] W N n \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 ( 2 r ) = ∑ n = 0 N / 2 ? 1 x 1 ( n ) W N / 2 n r X ( 2 r + 1 ) = ∑ n = 0 N / 2 ? 1 x 2 ( n ) W N / 2 n r \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的反序码,如1001)的反序码为100,对应的值为4
indexs=zeros(1,N); %记录反序码值的数组
for n=0:N-1
    opposite=zeros(1,M); %记录反序码的数组
    value=0; %记录反序码的值
    for m=1:M
        s=floor(n/2^(m-1)); %向下取整
        opposite(m)=mod(s,2); %计算余数
        value=value+opposite(m)*2^(M-m);
    end
    indexs(n+1)=value+1;
end
%%蝶形运算
out=zeros(1,N); %定义输出数组
for n=1:N
    out(n)=in(indexs(n));
end
for I=1:M %按照蝶形运行的级数依次计算
    distance=2^(I-1); %两个点的距离
    for J=0:distance-1
        nk=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;
        end
    end
end

运行结果图
在这里插入图片描述
对结果进行检验(公式法)

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

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:24:08  更:2021-09-06 11:24:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:34:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码