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

合集下载

按时间抽取的基二FFT运算

按时间抽取的基二FFT运算

7
思考题
§3.3.1 按时间抽取的FFT
FFT算法比DFT算法快在哪里?
基二按时间抽取FFT流图的画法和运算量
8
三、N点按时间抽取基二FFT算法运算量
§3.3.1 按时间抽取的FFT
一个基本蝶形运算的复乘次数:1次,复加次数:2次
基二按时间抽取FFT流图的画法和运算量
9
三、N点按时间抽取基二FFT算法运算量
基二按时间抽取FFT流图的画法和运算量
14
基二按时间抽取FFT运算
谢谢
§3.3.1 按时间抽取的FFT
15
基二按时间抽取FFT流图的画法和运算量
3
§3.3.1 按时间抽取的FFT
本节授课内容:
1、复习基本蝶形运算 2、演示N=8点的按时间抽取的基二FFT运算的算法过程 3、学习按时间抽取的基二FFT的运算量(即复乘复加 次数) 4、了解FFT的一些实际应用
重点、难点:
按时间抽取的基二FFT运算量的分析与计算
11
三、N点按时间抽取基二FFT算法运算量
§3.3.1 按时间抽取的FFT
基二按时间抽取FFT流图的画法和运算量
12
基二按时间抽取FFT运算
§3.3.1 按时间抽取的FFT
单元小结
13
四、作业要求
§3.3.1 按时间抽取的FFT
1. 3-13 , 3-22(可参考P107页例题)
2. teamwork的报告,题目自拟或上述应用 中的FFT应用分析
4
一、复习基本蝶形运算
§3.3.1 按时间抽取的FFT
基二按时间抽取FFT流图的画法和运算量
5
一、复习基本蝶形运算
§3.3.1 按时间抽取的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算法
W0 8 W1 8 W2 8 W3 8
X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7)
因为4点 还是比较麻烦, 因为 点DFT还是比较麻烦,所以再继续分解。 还是比较麻烦 所以再继续分解。 若将N/2(4点)子序列按奇 偶分解成两个 点 子序列按奇 偶分解成两个N/4点(2点)子 子序列按奇/偶分解成两个 若将 点 点子 分解成奇、 序列。即对将x 和 序列。即对将 1(r)和x2(r)分解成奇、偶两个 分解成奇 偶两个N/4点(2点) 点 点 点的子序列。 点的子序列。
n=0
nk x ( n )W N
=
N / 2 −1 r =0
2 x ( 2r )W N rk + ∑
N / 2 −1 r =0
( x ( 2r + 1)W N2 r +1) k ∑
=
N / 2 −1 r =0
2 k x1 (r )WN rk + WN ∑
N / 2 −1 r =0
2 x2 (r )WN rk ∑
后半部分
k = X 1 (k ) − W N X 2 (k )
k = 0,1, L , N 2 − 1
k X (k ) = X 1 (k ) + W N X 2 (k )
前半部分
k X ( N / 2 + k ) = X 1 (k ) − W N X 2 (k )
k = 0,1, L , N 2 − 1
N=8点的直接 点的直接DFT的计算量为: 的计算量为: 点的直接 的计算量为 复乘: 复乘:N2次 = 64次 次 复加: 复加:N(N-1)次 = 8×7=56次 次 × 次
X(k) = X1(k) +Wk X2(k) N X(k + N/ 2) = X1(k) −W X2(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、运算结构

范例FFT算法程序及分析

范例FFT算法程序及分析

FFT 算法程序及分析摘 要:《FFT 的算法程序分析》主要分析了按时间抽取(DIT)的快速傅立叶变换的基2FFT 算法,通过对基2FFT 算法的原理的分析及与DFT 算法运算量的比较,进一步推导出了基rFFT 算法,重点是基rFFT 算法的推导。

在具体的实例中,我们重点分析了FFT 过程中幅值大小与FFT 选用点数N 的关系,验证FFT 变换的可靠性,考察在FFT 中数据样本的长度与DFT 的点数对频谱图的影响。

关键字: 基2FFT 算法,基rFFT 算法,样本长度,选用点数要求:● 学习书上第六节的内容,自己编程实现FFT 算法 . ● 给出典型信号的时域和频域图,并加以分析。

● 可尝试实现分段卷积程序。

● 论文内容含原程序、运行结果,理论分析和典型信号时域图。

一.快速傅立叶变换(FFT )简介离散傅立叶变换(DFT )是信号分析与处理中的一种重要的变换。

因直接计算DFT 的计算量与变换区间长度N 的平方成正比,当N 较大时,计算量太大。

所以在快速傅立叶变换(FFT )出现以前,直接用DFT 算法进行频谱分析和信号的实时处理是不切实际的。

1965年,库利(J.W.Cooley )和图基(J.W.Tukey )在《计算数学》杂志上发表了“机器计算傅立叶级数的一种算法”的文章,这是一篇关于计算DFT 的一种快速有效的计算方法的文章。

它的思路建立在对DFT 运算内在规律的认识之上。

这篇文章的发表使DFT 的计算量大大减少,并导致了许多计算方法的发现。

这些算法统称为快速傅立叶变换(Fast Fourier Transform),简称FFT.1984年,法国的杜哈梅尔(P.Dohamel )和霍尔曼(H.Hollmann )提出的分裂基快速算法,使运算效率进一步提高。

快速傅立叶变换(FFT )不是一种新的变换,而是离散傅立叶变换(DFT )的一种快速算法。

FFT 分成两大类,即按时间抽取(decimation —in —time,缩写为DIT )法和按频率抽取(decimation —in —frequency ,缩写为DIF)法。

FFT快速傅里叶变换(蝶形算法)详解解析

FFT快速傅里叶变换(蝶形算法)详解解析

l 0
l0
N 41
N 41
x3(l)WNlk 4 WNk 2 x4 (l)WNlk 4
l0
l0
X 3(k ) WNk / 2 X 4 (k )
k=0,1,…,
N 1 4
17

X1

N 4
k


X 3 (k ) WNk/ 2 X 4 (k )
k=0,1,…,
FFT并不是一种与DFT不同的变换,而是 DFT的一种快速计算的算法。
3
5.2 直接计算DFT的问题及改进的途径
DFT的运算量
设复序列x(n) 长度为N点,其DFT为
N 1
X (k) x(n)WNnk n0
k=0,,…,N-1
(1)计算一个X(k) 值的运算量
复数乘法次数: N
N
N2
N
计算量
2 log2 N 之比M
N
N2
N 2
log 2
N
计算量 之比M
2
4
1
4 16
4
8 64
12
16 256
32
32 1028 80
4.0 128
16 384
448 36.6
4.0 256 65 536 1 024 64.0
5.4 512 262 144 2 304 113.8
8.0 1024 1 048 576 5 120 204.8
j
0,1,2,
,2L1
1
2L 2M 2LM N 2LM
W W e e W r
j
j 2 j N 2 L M
j 2 j2M L N

按时间抽选的基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实现。

  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 运算流图中,每个蝶形都要乘以旋转因子pW N ,p 称为旋转因子的指数。

例如N =8 =32 时各级的旋转因子:第一级:L=1, 有1个旋转因子:pW N =J/4W N =J2L W J=0第二级:L=2,有2个旋转因子:p W N =J /2W N =J2L W J=0,1第三级:L=3,有4个旋转因子:p W N =J W N =J2L W J=0,1,2,3 对于N =M 2的一般情况,第L 级共有1-L 2个不同的旋转因子:pW N =J 2L W J=0,1,2,… ,1-L 2-1L2=M2×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=M2);确定一蝶形两输入数据距离B=1-L 2XL -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(3)循环层2:确定L 级的B=1-L 2个旋转因子;旋转因子指数p=J ×L -M 2,J=0~B-1; (4)循环层3:对于同一旋转因子,用于同一级L -M 2个蝶形运算中:k 的取值从J 到N-1,步长为L 2 (使用同一旋转因子的蝶形相距的距离) (5)完成一个蝶形运算。

开 始送入x (n ),MN =2M 倒 序L =1 , M J=0 , B - 1P =2M -L J k = J , N -1 , 2L pN 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)<Nxn=[xn,zeros(1,N-length(xn))]; endfor m=0:N/2-1;%旋转因子指数范围WN(m+1)=exp(-j*2*pi/N)^m;%计算旋转因子enddisp('输入到各存储单元的数据:'),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;endJ=J+K;enddisp('倒序后各存储单元的数据:'),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;endenddisp('本级运算后各存储单元的数据:'),disp(xn);end在主函数中调用myDitFFT(xn)函数实现DIT-FFT并和直接DFT运算结果做对比:xn=[0,1,2,3,4,5,6,7];myDitFFT(xn);调用fft函数运算的结果:1 至 7 列28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i8 列-4.0000 - 9.6569i调用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 列12.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i8 列-4.0000 - 4.0000i运算级次:3本级运算后各存储单元的数据:1 至 7 列28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i8 列-4.0000 - 9.6569i经对比可知DIT-FFT与直接DFT的运行结果完全相同。

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

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

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

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

相关文档
最新文档