一、蝶形算法的作用
使用蝶形算法的主要目的就是减少计算量
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,n偶数N?1?x(n)WNnk?+∑n=0,n奇数N?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的反序码,如1(001)的反序码为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
运行结果图 在误差允许的范围内,蝶形运行的结果和直接计算快速傅里叶变换的结果相同。
|