按时间抽取的基2FFT算法分析及MATLAB实现

合集下载

时间抽取的基2快速傅里叶变换FFT分析与算法实现

时间抽取的基2快速傅里叶变换FFT分析与算法实现

离散时间信号的基2快速傅里叶变换FFT (时间抽取)蝶形算法实现一、一维连续信号的傅里叶变换连续函数f(x)满足Dirichlet (狄利克雷)条件下,存在积分变换:正变换:2()()()()j ux F u f x e dx R u jI u π+∞--∞==+⎰ 反变换:2()()j ux f x F u e du π+∞-∞=⎰其中()()cos(2)R u f t ut dt π+∞-∞=⎰,()()sin(2)I u f t ut dt π+∞-∞=-⎰定义幅值、相位和能量如下:幅度:1222()()()F u R u I u ⎡⎤⎡⎤=+⎣⎦⎣⎦ 相位:()arctan(()/())u I u R u ϕ= 能量:22()()(E u R u I u =+)二、一维离散信号的傅里叶变换将连续信号对自变量进行抽样得到离散信号(理想冲击抽样脉冲),利用连续信号的傅里叶变换公式得到离散时间傅里叶变换DTFT ;再利用周期性进行频域抽样,得离散傅里叶变换DFT (详情参考任何一本《数字信号处理》教材)。

DFT 变换如下:正变换:12/0()(),0,1,2,1N j ux Nx F u f x eu N π--===-∑。

反变换:12/01()(),0,1,2,1N j ux Nu f x F u ex N Nπ-===-∑。

DFT 是信号分析与处理中的一种重要变换,因为计算机等数字设备只能存储和处理离散数据(时域、频域)。

因直接计算DFT 的计算量大(与变换区间长度N 的平方成正比,当N 较大时,计算量太大),所以在快速傅里叶变换(简称FFT)出现以前,直接用DFT 算法进行谱分析和信号的实时处理是不切实际的。

直到1965年发现了DFT 的一种快速算法(快速傅里叶变换,即FFT )以后,情况才发生了根本的变化。

FFT 有时间抽取和频率抽取两种,下面介绍时间抽取FFT 。

三、时间抽取的基2快速傅里叶变换FFT令2j NN W eπ-=,则2jkm km NNWeπ-=称为旋转因子,把DFT 正变换改写为:1[][],0,1,1N km N k F m f k W m N -===-∑将函数记作x ,变换后为X ,则为:10[][],0,1,1N kmN k X m x k W m N -===-∑时间抽取的FFT 算法利用了旋转因子的三个性质:周期性、对称性和可约性。

基2DIT-FFT的MATLAB实现

基2DIT-FFT的MATLAB实现

基2FFT算法
(3)第二次分解: • 将x1(r)按r取奇、偶可分解成2个长度为N/4的子序列 x3(l)= x1(2l)、 x4(l) = x1(2l+1), 根据上面推导可得:X1 (k)= X3(k)+ WN/2kX4(k),k=0,1,…,N/2-1
X 1 (k ) X 3 (k ) WN 2 k X 4 (k ), k 0,1, N 4 1; K N X 1 k X 3 (k ) WN 2 X 4 (k ), k 0,1,, N 4 1; 2
e e
2 2 j j mm ) ( lN N N
e W
2 j m m N N
m N 2 N
m WN
对称性: 3、FFT算法思想
W
m N
N m N
W
N m * N
W
m N
W
m WN
不断地把长序列的DFT分解成几个短序列的DFT,并利用旋转因子的周期
(1)倒序:输入自然顺序序列x(n),根据倒序规 律,进行倒序处理;
倒 序
L=1 , M
(2) 循 环 层 1: 确 定 运 算 的 级 数 , L=1M
(N=2M);确定一蝶形两输入数据距离B=2L-1 (3)循环层2:确定L级的(B=)2L-1 个旋转因子; 旋转因子指数p=2M-LJ,J=0B-1; (4)循环层3:对于同一旋转因子,用于同一级 2M-L 个蝶形运算中:k的取值从J到N-1,步长 为2L (使用同一旋转因子的蝶形相距的距离)
1、直接DFT运算N点运算:
复加次数: 2 ×N/2×M= N×log2N。 可见FFT大大减少了运算次数,提高了运算速度。

按时间抽取的基2FFT算法分析

按时间抽取的基2FFT算法分析

按时间抽取的基2FFT算法分析基2FFT算法是一种快速傅里叶变换算法,它通过将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn),大大提高了傅里叶变换的效率。

基2FFT算法的核心思想是将一个长度为n的序列分成长度为n/2的两个子序列,并分别做傅里叶变换。

然后将两个子序列的傅里叶变换结果合并起来,得到原始序列的傅里叶变换结果。

具体来说,基2FFT算法的步骤如下:1.如果输入序列长度为1,则返回输入序列作为傅里叶变换结果。

2.将输入序列按奇偶位置分为两个子序列。

3.对两个子序列分别递归地应用基2FFT算法,得到它们的傅里叶变换结果。

4.根据蝶形算法,将子序列的傅里叶变换结果合并起来,得到原始序列的傅里叶变换结果。

基2FFT算法通过不断将序列分成两半的方式,将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn)。

在每一层递归中,需要进行O(n)次计算,而递归的层数为logn,因此总的时间复杂度为O(nlogn)。

基2FFT算法的关键之一是蝶形算法。

蝶形算法是一种合并子序列傅里叶变换结果的方法。

在每一层递归中,对于每个位置k,需要计算一个长度为n的序列上的k点DFT。

根据蝶形算法,可以将这个计算分成两个部分:计算序列中偶数位置上的点DFT和计算序列中奇数位置上的点DFT,并通过一些乘法和加法操作合并起来。

这样做可以大大减少计算量,提高计算效率。

基2FFT算法还可以通过多线程或并行处理来进一步提高效率。

由于基2FFT算法具有递归结构,可以将不同的递归层分配给不同的线程或处理器来并行进行计算,从而加快计算速度。

基2FFT算法在数字信号处理、图像处理、通信系统和科学计算等领域有着广泛的应用。

它的高效性和快速运算速度使得它成为处理大规模数据的重要工具。

综上所述,基2FFT算法通过将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn),大大提高了傅里叶变换的效率。

它采用递归分治的思想,通过分解和合并操作来实现傅里叶变换的计算。

按时间抽选的基2-FFT算法

按时间抽选的基2-FFT算法

X(2)
x(6)
X1(3)
X(3)
x(1) x(3)
4点
X2(0) W80 X2(1) W81
x(5)
DFT
X2(2)
W
2 8
X(4) X(5) X(6)
x(7)
X2(3) W83
X(7)
因为4点DFT还是比较麻烦,所以再继续分解。
若将N/2(4点)子序列按奇/偶分解成两个N/4点(2点)子 序列。即对将x1(r)和x2(r)分解成奇、偶两个N/4点(2点) 点的子序列。
W
2 8
4点
x2(5点) DFT x(7)
X6(0) X6(1)
WD80FT
W
2 8
XXXX11((1101((01)) )) XX1(12(2) ) XX1(13(3) )
XX2(20(0) )
XX2(21(1) ) XXXX22((2223((23)) ))
WW8080
WW8181 WW8282 WW8383
那么,X1(k)又可表示为
N / 41
N / 41
X1(k)
x1
(2l
)W
2 lk N /2
x1 ( 2l
1)W
( 2l 1) N /2
k
l0
l0
N / 41
N / 41
x3
(l
)W
lk N/
4
Wk N /2
x4
(
l
)W
lk N/
4
l0
l0
X
3
(k
)
W
K N/
2
X
4
(
k
)
X1(k)

4.2 按时间抽选的基-2FFT算法

4.2 按时间抽选的基-2FFT算法
X (6) X1(2) X 2 (2)W82 1 j
X (1)
X1(1)
X 2 (1)W81
j 3
1 e 4
X (3)
X1(3)
X 2 (3)W83
j
1 e 4
X
(5)
X1(1)
X 2 (1)W81
1 e
j 3 4
X (7)
X1(3)
X 2 (3)W83
j
1 e 4
——电子信息工程
4.2.3 按时间抽选的FFT算法的其他形式流图
x3 (0) x1(0) x(0)
N 点 X 3(0) 4
x3 (1) x1(2) x(4)
DFT X 3 (1)
k 0,1,..., N 1 4
X1(0) X 1 (1)
x4 (0) x1(1) x(2) x4 (1) x1(3) x(6)
N点 4 DFT
X 4 (0)
W
0 N
/
统一系数:WNk / 2 WN2k
——电子信息工程
图4-4 按时间抽选,将一个N点DFT分解为四个N/4点DFT
——这电样子逐信级息分工解程,直到2点DFT
当N = 8时,即分解到X3(k),X4(k),X5(k), X6(k),k = 0, 1
N / 41
1
X3(k)
x3(l)WNlk/ 4 x3(l)WNlk/ 44
(0)W20 (0)W20
W20 x4 (1) W21x4 (1)
x(2) x(2)
WN0 x(6) WN0 x(6)
——电子信息工程
图4-5 N=8按时间抽选法FFT运算流图
——电子信息工程
二、DIT-FFT算法的特点 1、运算结构

按时间抽选的基2FFT算法

按时间抽选的基2FFT算法

按时间抽选的基2FFT算法基2FFT算法(Fast Fourier Transform,快速傅里叶变换)是一种高效的算法,用于在计算机上计算离散傅里叶变换(Discrete Fourier Transform,DFT)。

它的核心思想是利用分治策略和递归操作,在O(nlogn)的时间复杂度下完成离散傅里叶变换。

基2FFT算法的关键步骤如下:1. 将输入的序列划分为两个子序列:偶数位置和奇数位置上的元素分别组成两个子序列。

2. 对这两个子序列分别进行离散傅里叶变换,得到两个新的子序列。

3. 将两个新子序列的元素按照原始顺序交替排列,得到最终的结果。

基于以上步骤,可以利用递归操作来实现基2FFT算法。

具体的实现过程如下:1. 如果输入序列的长度为1,则不需要进行任何操作,直接返回该序列作为结果。

2. 如果输入序列的长度大于1,则按照上述步骤进行分割和计算。

3. 首先将输入序列分为偶数位置和奇数位置上的元素组成的两个子序列。

4. 对这两个子序列分别递归调用基2FFT算法,得到两个新的子序列。

5. 将两个新子序列的元素按照原始顺序交替排列,得到最终的结果。

基2FFT算法的时间复杂度分析如下:假设输入序列的长度为n,则每一层递归的时间复杂度为O(n),总共有logn层递归。

因此,基2FFT算法的总时间复杂度为O(nlogn)。

基2FFT算法在信号处理、图像处理等领域具有广泛的应用。

它可以高效地计算离散傅里叶变换,将时域信号转换为频域信号,从而实现信号分析、频谱分析和频域滤波等操作。

同时,基于基2FFT算法的快速傅里叶变换还能够应用于多项式乘法、高效计算卷积等问题的求解。

总之,基2FFT算法是一种高效的离散傅里叶变换算法,通过利用分治策略和递归操作,能够在O(nlogn)的时间复杂度下完成计算。

它在信号处理和图像处理等领域有着重要的应用价值。

基2FFT算法(Fast Fourier Transform,快速傅里叶变换)是离散傅里叶变换(Discrete Fourier Transform,DFT)的一种高效计算方法。

按时间抽取的基2FFT算法分析及MATLAB实现

按时间抽取的基2FFT算法分析及MATLAB实现

按时间抽取的基2FFT算法分析及MATLAB实现基2FFT算法是一种快速傅里叶变换(Fast Fourier Transform,FFT)的算法,在信号处理、图像处理等领域有着广泛的应用。

该算法通过将N个输入值分解成两个长度为N/2的DFT(离散傅里叶变换)来实现快速的计算。

本文将对基2FFT算法进行分析,并给出MATLAB实现。

基2FFT算法的主要思路是将输入序列分解成奇偶两个子序列,然后分别对这两个子序列进行计算。

具体步骤如下:1.将输入序列拆分成奇数位和偶数位两个子序列。

比如序列x[0],x[1],x[2],x[3]可以拆分成x[0],x[2]和x[1],x[3]两个子序列。

2. 对两个子序列分别进行DFT计算。

DFT的定义为:X[k] = Σ(x[n] * exp(-i * 2π * k * n / N)),其中k为频率的索引,N为序列长度。

3.对得到的两个DFT结果分别进行合并。

将奇数位子序列的DFT结果和偶数位子序列的DFT结果合并成一个长度为N的DFT结果。

4.重复以上步骤,直到计算结束。

基2FFT算法的时间复杂度为O(NlogN),远远小于直接计算DFT的时间复杂度O(N^2)。

这是因为基2FFT算法将问题的规模逐步减半,从而实现了快速的计算。

下面是MATLAB中基2FFT算法的简单实现:```matlabfunction X = myFFT(x)N = length(x);if N == 1X=x;%递归结束条件return;endeven = myFFT(x(1:2:N)); % 偶数位子序列的FFT计算odd = myFFT(x(2:2:N)); % 奇数位子序列的FFT计算W = exp(-1i * 2 * pi / N * (0:N/2-1)); % 蝶形因子temp = W .* odd; % 奇数位子序列的DFT结果乘以蝶形因子X = [even + temp, even - temp]; % 合并得到一个长度为N的DFT结果end```上述代码中,函数myFFT为基2FFT算法的MATLAB实现。

6.3.3 按时间抽取的基-2 FFT算法[共4页]

6.3.3 按时间抽取的基-2 FFT算法[共4页]

数字图像处理与机器视觉——Visual C++与Matlab 实现– 188 – 2,N r N r r r N N N N W W W W ++==- (6-30)式(6-29)是W 矩阵中元素的某些特殊值,而式(6-30)则说明了W 矩阵元素的周期性和对称性。

利用W 的周期性,DFT 运算中的某些项就可以合并;而利用W 的对称性,则可以仅计算半个W 序列。

而根据这两点,我们就可以将一个长度为N 的序列分解成两个长度为N /2的序列并分别计算DFT ,这样就能节省大量的运算量。

我们将在讲述常见的FFT 算法后分析节省的运算量。

这正是快速傅立叶变换(FFT: Fast Fourier Transform )的基本思路——通过将较长的序列转换成相对短得多的序列来大大减少运算量。

6.3.2 常见的FFT 算法目前流行的大多数成熟的FFT 算法的基本思路大致可以分为两大类,一类是按时间抽取的快速傅立叶算法(Decimation In Time ,DIT-FFT ),另一类是按频率抽取的快速傅立叶算法(Decimation In Freqency ,DIF-FFT )。

这两种算法思路的基本区别如下。

按时间抽取的FFT 算法是基于将输入序列f (x )分解(抽取)成较短序列,然后从这些序列的DFT 中求得输入序列F (u )的方法。

由于抽取后的较短序列仍然可分,所以最终仅仅需要计算一个很短序列的DFT 。

在这种算法中,我们主要关注的是当序列长度是2的整数次幂时,如何高效地进行抽取和运算的方法。

而按频率抽取的FFT 算法是基于将输出序列F (u )分解(抽取)成较短的序列,并且从f (x )计算这些分解后的序列的DFT 。

同样,这些序列可以继续分解下去,继续得到更短的序列,从而可以更简便地进行运算。

同样这种算法主要针对2的整数次幂长度的序列。

从本章前面对DFT 的介绍和本节开头的分析可知,随着序列长度的减小,FFT 运算的复杂度将以指数规律降低。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按时间抽取的基2FFT 算法分析及MATLAB 实现
一、DIT-FFT 算法的基本原理
基2FFT 算法的基本思想是把原始的N 点序列依次分解成一系列短序列,充分利用旋转因子的周期性和对称性,分别求出这些短序列对应的DFT ,再进行适当的组合,得到原N 点序列的DFT ,最终达到减少运算次数,提高运算速度的目的。

按时间抽取的基2FFT 算法,先是将N 点输入序列x(n)在时域按奇偶次序分解成2个N/2点序列x1(n)和x2(n),再分别进行DFT 运算,求出与之对应的X1(k)和X2(k),然后利用图1所示的运算流程进行蝶形运算,得到原N 点序列的DFT 。

只要N 是2的整数次幂,这种分解就可一直进行下去,直到其DFT 就是本身的1点时域序列。

图1 DIT-FFT 蝶形运算流图
二、DIT-FFT 算法的运算规律及编程思想
1.原位计算
[
对N=M
2点的FFT 共进行M 级运算,每级由N/2个蝶形运算组成。

在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元),经过M 级运算后,原来存放输入序列数据的N 个存储单元中可依次存放X(k)的N 个值,这种原位(址)计算的方法可节省大量内存。

2.旋转因子的变化规律
N 点DIT ―FFT 运算流图中,每个蝶形都要乘以旋转因子p
W N ,p 称为旋转因子的指数。

例如N =8 =3
2 时各级的旋转因子:
第一级:L=1, 有1个旋转因子:p
W N =J
/4W N =J
2L W J=0
第二级:L=2,有2个旋转因子:p
W N =J
/2W N =J
2L W J=0,1
第三级:L=3,有4个旋转因子:p
W N =J
W N =J 2L W J=0,1,2,3
对于N =M 2的一般情况,第L 级共有1-L 2个不同的旋转因子:
p W N =J 2L W J=0,1,2,… ,1-L 2
-1 L 2=M 2×M -L 2= N ·M -L 2
故: 按照上面两式可以确定第L 级运算的旋转因子
\
3、同一级中,同一旋转因子对应蝶形数目 第L 级FFT 运算中,同一旋转因子用在L
-M 2
个蝶形中;
4、同一级中,蝶形运算使用相同旋转因子之间相隔的“距离” 第L 级中,蝶距:D=L
2; 5、同一蝶形运算两输入数据的距离
在输入倒序,输出原序的FFT 变换中,第L 级的每一个蝶形的2个输入数据相距:B=1
-L 2。

6、码位颠倒
输入序列x(n)经过M 级时域奇、偶抽选后,输出序列X(k)的顺序和输入序列的顺序关系为倒位关系。

'
将十进制顺序数用I 表示,与之对应的二进制是用IB 表示,十进制倒序数用J 表示,与之对应的二进制是用JB 表示。

十进制顺序数I 增加1,相当于IB 最低位加1且逢2向高位进1,即相当于JB 最高位加1且逢2向低位进1。

JB 的变化规律反映到J 的变化分为两种情况,若JB 的最高位是0(J<N/2),则直接由加1(J ←J+N/2)得到下一个倒序值,若JB 的最高位是1(J ≧N/2),则要先将最高位变0(J ←J-N/2),再在次高位加1(J ←J+N/4),但次高位加1时,同样要判断0、1值,如果是0(J<N/4),则直接加1(J ←J+N/4),否则要先将次高位变0(J ←J-N/4)再判断下一位,依次类推,直到完成最高位加1,逢2向右进位的运算。

I=J 时不需要交换,只对I<J 时的情况进行数据交换即可,数据倒序程序框图如如2。

7、蝶形运算的规律
序列经过时域抽选后,存入数组中,如果蝶形运算的两个输入数据相距B 个点,应用原位计算,蝶形运算可表示成如下形式:
8、 DIT-FFT 程序框图
~
根据DIT-FFT 原理和过程,DIT-FFT 的完整程序框图如图2:
(1)倒序:输入自然顺序序列x(n),根据倒序规律,进行倒序处理;
(2)循环层1:确定运算的级数,L=1~M (N=M
2);确定一蝶形两输入数据距离B=1
-L 2
(3)循环层2:确定L 级的B=1
-L 2
个旋转因子;旋转因子指数p=J×L
-M 2
,J=0~B-1;
XL-1(J)
X L-1 (J+B)
XL (J)= XL-1(J)+ WNp X L-1
(J+B)
X L (J) = X L-1(J)W N p X L-1
(J+B)
p=J×2M-L , J=0,1,2,… ,2L-1-1
(4)循环层3:对于同一旋转因子,用于同一级L -M 2个蝶形运算中:k 的取值从J 到N-1,步长为L 2 (使用同一旋转因子的蝶形相距的距离) (5)完成一个蝶形运算。

开 始
送入x (n ),M
N =2
M 倒 序
L =1 , M J=0 , B - 1
P =2
M -L J k = J , N -1 , 2
L p
N p N W B k X k X B k X W B k X k X k X )()()()()()(+-⇐+++⇐输 出
结 束
B 2 L -1
图2 数据倒序程序框图 图3 DIT-FFT 的完整程序框图
三、程序源代码
/
设计函数myDitFFT(xn)完成一个序列的DIT-FFT 运算:
function y=myDitFFT(xn) M=nextpow2(length(xn)); N=2^M;
disp('调用fft函数运算的结果:'),
fftxn=fft(xn,N);
if length(xn)<N
xn=[xn,zeros(1,N-length(xn))];
end
for m=0:N/2-1;%旋转因子指数范围
}
WN(m+1)=exp(-j*2*pi/N)^m;%计算旋转因子end
disp('输入到各存储单元的数据:'),disp(xn);
%数据倒序操作
J=0;%给倒序数赋初值
for I=0:N-1;%按序交换数据和算倒序数
if I<J;%条件判断及数据交换
T=xn(I+1);xn(I+1)=xn(J+1);xn(J+1)=T;
end
%
%算下一个倒序数
K=N/2;
while J>=K;
J=J-K;K=K/2;
end
J=J+K;
end
disp('倒序后各存储单元的数据:'),
disp(xn);
% 分级按序依次进行蝶形运算
·
for L=1:M;%分级计算
disp('运算级次:'),disp(L);
B=2^(L-1);
for R=0:B-1;%各级按序蝶算
P=2^(M-L)*R;
for K=R:2^L:N-2;%每序依次计算
T=xn(K+1)+xn(K+B+1)*WN(P+1);
xn(K+B+1)=xn(K+1)-xn(K+B+1)*WN(P+1);
xn(K+1)=T;
end

end
disp('本级运算后各存储单元的数据:'),disp(xn);
end
在主函数中调用myDitFFT(xn)函数实现DIT-FFT并和直接DFT运算结果做对比:
xn=[0,1,2,3,4,5,6,7];
myDitFFT(xn);
调用fft函数运算的结果:
1 至7 列
`
+ + + + + - -
8 列
-
调用myDitFFT(xn)函数运行的结果:
输入到各存储单元的数据:
0 1 2 3 4 5 6 7 倒序后各存储单元的数据:
0 4 2 6 1 5 3 7 (
运算级次:
1
本级运算后各存储单元的数据:
4 -4 8 -4 6 -4 10 -4 运算级次:
2
本级运算后各存储单元的数据:
1 至7 列
+ + + - + + +
8 列
[
-
运算级次:
3
本级运算后各存储单元的数据:
1 至7 列
+ + + + + - -
8 列
-
经对比可知DIT-FFT与直接DFT的运行结果完全相同。

四、总结
经过验证可发现DIT-FFT较直接DFT运算有着明显的优势,我们可以将这个函数运用在多个领域以简化运算,例如计算离散时间序列的卷积或计算IDFT时都可以应用到DIT-FFT算法,我感受到数字信号处理中科学思想的魅力。

由于对设计思路的缺乏,我在设计程序时,在网络上查找了很多有关DIT-FFT的资料,经过学习他人的解决思路最后才整理出DIT-FFT的程序,在有些地方我自己理解的还不是很透彻,比如在实现数据倒序的程序我认为比较困难;当然即使自己想不到能学习一下别人的思路也是很好的,这个程序的代码量并不大,我自身的能力还很低,要在以后的学习中不断进步才能完成更加复杂的任务。

这次课程设计让我对快速傅里叶变换有了更多的了解,也认识到了科学计算方法的重要性,我感到很充实。

参考文献——
百度百科;
按时间抽取的基2FFT算法分析及MATLAB实现[J].电子技术,2011(2)
数字信号处理(第四版)西安电子科技大学出版社高希全丁玉美编)。

相关文档
最新文档