按时间抽取的基2FFT算法分析及MATLAB实现
时间抽取的基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 算法利用了旋转因子的三个性质:周期性、对称性和可约性。
Matlab实现DFT和FFT
一个 N 点 DFT 分解为两个 N/2 点的 DFT,继续分解,迭代下去,其运算
量约为
N log 2 N 2
四、涉及实验的相关情况介绍(包含使用软件或实验设备等情况) 计算机一台 Matlab 6.1 以上 五、实验记录(程序相关的图形、相关数据记录及分析)
根据上述两个步骤的实验结果, 比较 DFT 与 FFT 在算法与结果上的 相同与差异。 DFT 与 FFT 在结果上相同。Xk 相同,产生的图像也相同。 FFT 是 DFT 的一种快速算法,对于 16 点的 FFT,我们需要 M==4 阶运算,每一阶有八个蝴蝶因子,在每个蝴蝶因子中需要 1 次复数乘法与 两次复数加法, 因为每个蝴蝶因子都一样, 所以 FFT 通过重复运算大大简
三实验原理时间抽取dit基2fft算法一个n点dft分解为两个n2点的dft继续分解迭代下去其运算量约为四涉及实验的相关情况介绍包含使用软件或实验设备等情况计算机一台matlab61以上五实验记录程序相关的图形相关数据记录及分析根据上述两个步骤的实验结果比较dft与fft在算法与结果上的相同与差异
数字信号处理 课程实验报告
化了算法与复杂度。 对于 16 点的 DFT,需要复数乘法 162=256 次, FFT 需要复数乘法。 六、实验总结及展望 1.熟练 MATLAB 的用法,通过用 MATLAB 实现 DFT 与 FFT,我熟练了 MATLAB 的基本函数与用法,会通过矩阵、数组进行的复杂运算,并且 更加熟练了用图形展示实验结果。 2. 通过固定参数以及多组实验比较的方法,深入了解了 DFT 与 FFT 在算 法与结果上的差异与相同, 我们可以看出 FFT 算法都同等程度的减小了直 接 DFT 的运算量,提高了变换的效率,并且它的计算效率会随着点数 N 的增大而成几何倍数的增加。
基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算法是一种快速傅里叶变换算法,它通过将傅里叶变换的计算复杂度从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算法
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)
按时间抽选的基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算法是一种快速傅里叶变换(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页]
数字图像处理与机器视觉——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 运算的复杂度将以指数规律降低。
MATLAB辅助DSP实现基2时域抽取法FFT
[3] 万山明.TMS320F281xDSP 原理 及 应 用 实 例[M].北 京 : 北 京 航 天 大 学出版社, 2007.
The Application of MATLAB to Realizing the N=2m Decimation in Time FFT in DSP
N=512;
x=0.075*cos (2*pi* (0:N- 1) /100);
subplot (2,1,1) ;
plot (x (1:N)) ;
ylabel (' 原始信号 ')
N=0:N- 1;
X=fft (x)
subplot (2,1,2) ;
134
·制 造 业 信 息 化·
原始信号
0.1 0.05
DFT 的线性组合。然后再把 N/2 点 DFT 一分为二, 表示
为两个 N/4 点的 DFT。如此重复下去, 直至分解成两点
DFT 的运算, 两点 DFT 实际上只是加减运算。这就是基
2 时域抽取 FFT 算法的原理 [1]。
1.2 MATLAB 设计仿真
现 就 使 用 MATLAB 软 件 来 实 现 如 下 所 示 的 时 域 信
0 - 0.05 - 0.1
0Hale Waihona Puke 100 200300
400 500 600
FFT 频 谱
20
15
10
5
0
0
100 200
300
400 500 600
图 1 FFT 仿真图
Fig.1 Simulation gr aph of the FFT plot(N,abs(X));
二按时间抽选的基2FFT算法教学课件
时间抽选基2FFT 算法的教学过程
教学内容和目标
教学内容:介绍基 2FFT算法的基本原 理、实现方法和应 用领域
教学目标:使学生掌 握基2FFT算法的基本 原理和实现方法,能 够运用基2FFT算法解 决实际问题
教学方法:采用案 例教学法,通过具 体的案例讲解基 2FFT算法的应用
教学评价:通过课 堂讨论、作业和考 试等方式对学生的 学习效果进行评价
添加标题
反馈方式:及时反馈,提供详细的 错误分析和改进建议
反馈频率:定期进行反馈,确保学 生能够及时了解自己的学习情况
时间抽选基2FFT 算法的应用案例
信号处理领域的应用
语音识别:用于语音信号的处理和分析 图像处理:用于图像信号的处理和分析 雷达信号处理:用于雷达信号的处理和分析
通信信号处理:用于通信信号的处理和分析
实验结果分析:对实验结果进行分析,得出 结论,提出改进意见或建议
实验步骤和操作流程
准备数据:收集需要处理的数据,并进行预处理 选择算法:选择合适的基2FFT算法 初始化参数:设置算法的参数,如抽样频率、抽样点数等 执行算法:运行基2FFT算法,对数据进行处理 结果分析:分析处理后的数据,得出结论 优化算法:根据结果,对算法进行优化和改进
图像分割:利用 FFT算法对图像 进行分割,提取 和传 输
医疗领域: 用于医学 图像处理 和分析
航空航天 领域:用 于卫星通 信和导航
军事领域: 用于雷达 信号处理 和通信
工业领域: 用于自动 化控制和 检测
科研领域: 用于科学 研究和数 据分析
基于时间抽选的基2FFT 算法教学课件
汇报人:
目录
添加目录标题
01
FFT算法简介
02
十一、按频率抽取基2-FFT原理及实现
DFTmat_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
DFTmat(x);
DFTmat_time(n)=etime(clock,t);
end
subplot(2,1,2);plot(k,DFTmat_time,'--');
end
figure(1);
subplot(2,1,1);plot(k,ditfft_time,'--');
ylabel('t/s');title('DIT-FFT执行时间');
subplot(2,1,2);plot(k,diffft_time,'--');
ylabel('t/s');title('DIF-FFT执行时间');%结果11-1
t=clock;
ditfft(x);
ditfft_time(n)=etime(clock,t);
end
k=1:Nmax;
diffft_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
diffft(x);
diffft_time(n)=etime(clock,t);
DFTfor_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
DFTfor(x);
DFTfor_time(n)=etime(clock,t);
(完整word版)按时间抽取的基2FFT算法分析
第四章 快速傅里叶变换有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley 和Tukey 提出了计算离散傅里叶变换(DFT )的快速算法,将DFT 的运算量减少了几个数量级。
从此,对快速傅里叶变换(FFT )算法的研究便不断深入,数字信号处理这门新兴学科也随FFT 的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2DIT 和基2DIF 。
FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。
DFT 的定义式为)(k X =)()(10k R W n x N N n knN∑-= 在所有复指数值knN W 的值全部已算好的情况下,要计算一个)(k X 需要N 次复数乘法和N -1次复数加法。
算出全部N 点)(k X 共需2N 次复数乘法和)1(-N N 次复数加法。
即计算量是与2N 成正比的。
FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而减少运算量。
N W 因子具有以下两个特性,可使DFT 运算量尽量分解为小点数的DFT运算:(1) 周期性:k N n N kn N nN k N W W W )()(++== (2) 对称性:k N N k NW W -=+)2/(利用这两个性质,可以使DFT 运算中有些项合并,以减少乘法次数。
例子:求当N =4时,X(2)的值)()]3()1([)]2()0([)()]3()1([)]2()0([)3()2()1()0()()2(04240464442404324对称性-=周期性W x x x x W x x W x x W x W x W x W x W n x X n n +++++=+++==∑=通过合并,使乘法次数由4次减少到1次,运算量减少。
MATLAB编写的fft2程序更新版
快速傅立叶变换(时域抽取基二fft )1. 编程思想根据快速傅立叶变换的信号流图可知,可将整个过程中所有的数据组成一个二维数组data(N,M+1),数组共有N 行,M+1列(傅立叶变换分为M=log2(N)级,再加上第一级倒序数组输入,则共有M+1列)。
除第一列单独赋值外,其余列则按照共同的规律来赋值。
这里则详细说明其的规律性。
(1)对于第k 列(k>1):可分为2^(M+1-k)个计算单元,各计算单元间相互独立进行离散傅里叶变换。
(2)对于第k 列的第Mblock 个计算单元该单元总共含有2^(k-1)个数,数据的起始项是:data( (1+(Mblock-1)*2^(k-1)),k ),结束项是data( ( (Mblock)*2^(k-1)),k )(3)每个计算单元又可分为2^(k-2)个计算组,即蝶形单元对于每个组可以运用蝶形运算则第k 列的第Mblock 个计算单元的第grop 个计算组的两个元素的下表分别为: (Mblock-1)*2^(k-1)+grop 与(Mblock-1)*2^(k-1)+grop+2^(k-2)碟形单元所出现的系数为:121--grop k W然后根据蝶形运算便可进行程序的编写。
通过上述方法在MA TLAB 下编程,大概在35行左右,还包括倒序的程序在里面。
%DIT(时间抽取的基二FFT 算法程序)%程序输入为x(n),输出为y(n),要求n 是2的整数次幂function y=b2fft(x)N=length(x);L=log2(N);rev_x=zeros(1,N);for m=0:N-1bit_str=dec2bin(m); %将i 变成2进制数,为倒序操作做准备 dec2bin()将十进制数变成二进制数,结果为一字符串if length(bit_str)<LZ=zeros(1,(L-length(bit_str))); %保证倒序操作的成功,要求二进制位数始终是 N Z_str=num2str(Z); %将数字变为字符串bit_str=[Z_str,bit_str];endit_str=fliplr(bit_str); %fliplr 其作用是将一个数组的行倒置,而列的顺序则不变,倒置的意思是倒序显示rev_x(m+1)=x(bin2dec(it_str)+1);enddata=zeros(N,L+1);%进行第一级赋值data(:,1)=rev_x;%进行第K级赋值for k=2:L+1 %多少级(第一级为倒序后的数组)for Mblock=1:2^(L+1-k) %每级多少个块for grop=1:2^(k-2) %每个块分成多少个组coeff=cos(2*pi*(grop-1)/(2^(k-1)))-sin(2*pi*(grop-1)/(2^(k-1)))*i;data((Mblock-1)*2^(k-1)+grop,k)=data((Mblock-1)*2^(k-1)+grop,k-1)+coeff*data((Mblock-1)*2^(k-1)+grop+2^( k-2),k-1);data((Mblock-1)*2^(k-1)+grop+2^(k-2),k)=data((Mblock-1)*2^(k-1)+grop,k-1)-coeff*data((Mblock-1)*2^(k-1)+g rop+2^(k-2),k-1);endendend%输出L+1级数据,为傅立叶变换后的数据y=data(:,L+1);。
数字信号处理2按时间抽选的基2FFT算法
x3 (0)W20 x3 (0)W20
W20 x3(1) W21x3(1)
x(0) x(0)
WN0 x(4) WN0 x(4)
N / 41
1
X 4 (k)
x4 (l)WNlk/ 4 x4 (l)WNlk/ 4
l 0
l 0
k 0,1
X
4
(0)
X 4 (1)
2020/4/21
x4 x4
课件
23
2020/4/21
课件
24
X 2 (k
N 4
)
X 5 (k )
WNk/ 2 X 6 (k )
k 0,1,..., N 1 4
其中:
X5(k) DFT[x5(l)] DFT[x2(2l)] l 0,1,..., N / 4 1 X 6 (k) DFT[x6 (l)] DFT[x2(2l 1)]
统一系数:WNk /2 WN2k
k
X2
k
N 2
X2
k
又WNk
N 2
WNN / 2WNk
WNk
X
X (k
(k
) N) 2
X1(k ) WNk X 2 (k X1(k ) WNk X 2
) (k
)
k 0,1,..., N / 2 1
2020/4/21
课件
3
2020/4/21
课件
4
分解后的运算量:
复数乘法 复数加法
N 1
N 1
N 1
X k x nWNnk x nWNnk x nWNnk
n0
n0
n0
n为偶数 n为奇数
N / 21
N / 21
x
快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码
function y=MyFFT_FB(x,n)%MYFFT_TB:My Fast Fourier Transform Frequency Based%按频率抽取基2-fft算法%input:% x -- 输入的一维样本% n -- 变换长度,缺省时 n=length(x) 当n小于x数据长度时,x数据被截断到第n个数据% 当n大于时,x数据在尾部补0直到 x 含n个数据%output:% y -- 1*n的向量,快速傅里叶变换结果%variable define:% N -- 一维数据x的长度% xtem -- 临时储存x数据用% m,M -- 对N进行分解 N=2^m*M,M为不能被2整除的整数% two_m -- 2^m% adr -- 变址,1*N的向量% l -- 当前蝶形运算的级数% W -- 长为 N/2的向量,记录 W(0,N),W(1,N),...W(N/2-1,N)% d -- 蝶形运算两点间距离% t -- 第l级蝶形运算含有的奇偶数组的个数% mul -- 标量,乘数% ind1,ind2 -- 标量,下标% tem -- 标量,用于临时储存%参考文献:% 81c 输入参数个数检查msg=nargchk(1,2,nargin);error(msg);%% 输入数据截断或加0N=length(x);if nargin==2if N<n % 加0xtem=x;x=zeros(1,n);x(1:N)=xtem;N=n;else % 截断xtem=x;x=xtem(1:n);N=n;endend%% 对N进行分解 N=2^m*M[m,M]=factorize(N);two_m=N/M;%% 变换if m~=0%% 如果N可以被2整除adr=address(m,M,two_m);y=x; % 蝶形运算级数 l=m 时%% 计算W向量W=exp(-2*pi*i* ( 0:N/2-1 ) /N);%% 蝶形运算d=N/2;t=1;for l=1:m% 加for ii=0:t-1ind1=ii*2*d+1;ind2=ind1+d;for r=0:d-1tem=y(ind1)+y(ind2);y(ind2)=y(ind1)-y(ind2);y(ind1)=tem;ind1=ind1+1;ind2=ind2+1;endend% 乘for r=0:d-1mul=W(r*t+1);for ii=0:t-1y(ii*2*d+d+1+r) = y(ii*2*d+d+1+r)*mul;endendd=d/2;t=t*2;end%% 直接傅里叶变换if M~=1 % N 分解含有非2因数M时,对y中每M个数据做直接傅里叶变换 for ii=1:two_my((ii-1)*M+1 : ii*M ) = DDFT( y((ii-1)*M+1 : ii*M ) );end%% 变址输出y=y(adr+1);else%% 如果N 不能被2整除y=DDFT(x);endend%% 内嵌函数 ====================================================== function y=DDFT(x)%% 直接离散傅里叶变换%input:% x -- 样本数据,N维向量%output:% y -- N维向量%参考文献:% 结构动力学,克拉夫,P82% variable define% s -- sum,用于求和N=length(x);y=zeros(size(x));for n=1:Ns=0;for m=1:Ns=s+x(m)*exp( -i*2*pi*(m-1)*(n-1)/N );endy(n)=s;endendfunction [m,M]=factorize(N)%% 对N分解m=0;while trueif mod(N,2)==0m=m+1;N=N/2;elsebreak;endendendfunction adr=address(m,M,two_m)%% 变址% b -- 2^m * m 的矩阵,用来存储二进制数据% ds -- 数,公差adr=zeros(two_m,M);b=de2bi(0:two_m-1,m);%转换为2进制注:matlab中二进制[0 1 1]=6 b=b(:,end:-1:1);% 逆序adr(:,1)=bi2de(b);%2进制转换为10进制if M~=1ds=two_m;adr=adr(:,1)*ones(1,M);adr=adr+ds*ones(size(adr,1),1)*(0:M-1);adr=reshape(adr',1,[]);endend。
(完整word版)按时间抽取的基2FFT算法分析
第四章 快速傅里叶变换有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley 和Tukey 提出了计算离散傅里叶变换(DFT )的快速算法,将DFT 的运算量减少了几个数量级。
从此,对快速傅里叶变换(FFT )算法的研究便不断深入,数字信号处理这门新兴学科也随FFT 的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2DIT 和基2DIF 。
FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。
DFT 的定义式为)(k X =)()(10k R W n x N N n knN∑-= 在所有复指数值knN W 的值全部已算好的情况下,要计算一个)(k X 需要N 次复数乘法和N -1次复数加法。
算出全部N 点)(k X 共需2N 次复数乘法和)1(-N N 次复数加法。
即计算量是与2N 成正比的。
FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而减少运算量。
N W 因子具有以下两个特性,可使DFT 运算量尽量分解为小点数的DFT运算:(1) 周期性:k N n N kn N nN k N W W W )()(++== (2) 对称性:k N N k NW W -=+)2/(利用这两个性质,可以使DFT 运算中有些项合并,以减少乘法次数。
例子:求当N =4时,X(2)的值)()]3()1([)]2()0([)()]3()1([)]2()0([)3()2()1()0()()2(04240464442404324对称性-=周期性W x x x x W x x W x x W x W x W x W x W n x X n n +++++=+++==∑=通过合并,使乘法次数由4次减少到1次,运算量减少。
基于Matlab的时间抽取基2FFT算法
基于Matlab的时间抽取基2FFT算法基于Matlab的时间抽取基2FFT算法function y=myditfft(x)%本程序对输入序列实现DIT-FFT基2算法,点数取大于等于长度的2的幂次%------------------------------------% Leo's fft program(改编网上的一个程序)%------------------------------------m=log2(2^nextpow2(length(x))); %求的x 长度对应的2的最低幂次mN=2^m;if length(x)<Nx=[x,zeros(1,N-length(x))]; %若长度不是2的幂,补0到2的整数幂endx;%--------------------------------------------------------------------------%对输入序列进行倒序%如果输入序列的自然顺序号I用二进制数(例如n2n1n0)表示%则其倒位序J对应的二进制数就是(n0n1n2),这样,在原来自然顺序时应该放x(I)的%单元,现在倒位序后应放x(J)。
%--------------------------------------------------------------------------%以下程序相当于以下程序:%nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; %求1:2^m数列的倒序%y=x(nxd);%将倒序排列作为初始值%--------------------------------------------------------------------------NV2=N/2;NM1=N-1;I=0;J=0;while I<NM1if I<JT=x(J+1);x(J+1)=x(I+1);x(I+1)=T;endK=NV2;while K<=JJ=J-K;K=K/2;endJ=J+K;I=I+1;endx;%--------------------------------------------------------------------------%以下程序解释:%第一级从x(0)开始,跨接一阶蝶形,再取每条对称%第二级从x(0)开始,跨接两阶蝶形,再取每条对称%第m级从x(0)开始,跨接2^(m-1)阶蝶形,再取每条对称....%--------------------------------------------------------------------------formm=1:m%将DFT做m次基2分解,从左到右,对每次分解作DFT运算 Nmr=2^mm;u=1;%旋转因子u初始化WN=exp(-j*2*pi/Nmr);%本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)forn=1:Nmr/2 %本次跨越间隔内的各次碟形运算fork=n:Nmr:N %本次碟形运算的跨越间隔为Nmr=2^mmkp=k+Nmr/2;%确定碟形运算的对应单元下标(对称性)t=x(kp)*u;%碟形运算的乘积项x(kp)=x(k)-t;%碟形运算的加法项x(k)=x(k)+t;endu=u*WN;%修改旋转因子,多乘一个基本DFT因子WNend。
实验2-matlab中基2-DIT-FFT的实现
电 子 科 技 大 学实 验 报 告学生姓名: 学 号:2010013080 指导教师一、实验室名称:数字信号处理实验室 二、实验项目名称:FFT 的实现 三、实验原理:一.FFT 算法思想:1.DFT 的定义:对于有限长离散数字信号{x[n]},0 ≤ n ≤ N-1,其离散谱{x[k]}可以由离散付氏变换(DFT )求得。
DFT 的定义为:21[][]N jnk Nn X k x n eπ--==∑,k=0,1,…N-1通常令2jNN eW π-=,称为旋转因子。
2.直接计算DFT 的问题及FFT 的基本思想:由DFT 的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次加法。
因此,对于一些相当大的N 值(如1024)来说,直接计算它的DFT 所作的计算量是很大的。
FFT 的基本思想在于,将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。
例如,若N 为偶数,将原有的N 点序列分成两个(N/2)点序列,那么计算N 点DFT 将只需要约[(N/2)2 ·2]=N 2/2次复数乘法。
即比直接计算少作一半乘法。
因子(N/2)2表示直接计算(N/2)点DFT 所需要的乘法次数,而乘数2代表必须完成两个DFT 。
上述处理方法可以反复使用,即(N/2)点的DFT 计算也可以化成两个(N/4)点的DFT (假定N/2为偶数),从而又少作一半的乘法。
这样一级一级的划分下去一直到最后就划分成两点的FFT 运算的情况。
3.基2按时间抽取(DIT )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。
将长度为2L N =的序列[](0,1,...,1)x n n N =-,先按n 的奇偶分成两组:12[2][][21][]x r x r x r x r =+=,r=0,1,…,N/2-1DFT 化为:1/21/212(21)0/21/21221200/21/211/22/2[]{[]}[][2][21][][][][]N N N nk rk r kNNNn r r N N rk k rk NNN r r N N rk k rk N NN r r X k DFT x n x n Wx r Wx r W x r W Wx r W x r WWx r W ---+===--==--=====++=+=+∑∑∑∑∑∑∑上式中利用了旋转因子的可约性,即:2/2rkrkNN W W =。
按时间抽取的基2FFT算法分析与MATLAB实现
按时间抽取的基2FFT算法分析与MATLAB实现基2FFT算法(Fast Fourier Transform)是一种高效的离散傅里叶变换(DFT)算法,其时间复杂度为O(NlogN),其中N为输入数据的大小。
该算法利用了DFT的对称性质以及分治的思想,通过将一个大规模的DFT问题分解为若干个规模较小的DFT问题来加快计算速度。
基2FFT算法的实现步骤如下:1.输入N个复数序列x(n),其中n取值范围为0到N-12.如果N为1,直接返回x(n)。
3. 将x(n)分为两个子序列,分别为x_odd(n)和x_even(n),其中x_odd(n)包含所有奇数索引的元素,x_even(n)包含所有偶数索引的元素。
4. 对x_odd(n)和x_even(n)分别进行基2FFT变换,递归地计算它们的DFT结果。
5. 根据DFT的对称性,计算出x(k)的前半部分和后半部分的值,其中k为频率索引,取值范围为0到N/2-1、具体计算方法是将x_odd(k)和x_even(k)与旋转因子W_N^k相乘,可通过以下公式计算:x(k) = x_even(k) + W_N^k * x_odd(k)x(k+N/2) = x_even(k) - W_N^k * x_odd(k)其中W_N^k = e^(-j*2*pi*k/N)为旋转因子。
6.返回x(k)作为输出结果。
基2FFT算法的MATLAB实现如下:```matlabfunction X = myfft(x)N = length(x);if N == 1X=x;%如果序列长度为1,直接返回原始序列returnendx_even = myfft(x(1:2:end)); % 奇数索引的元素序列x_odd = myfft(x(2:2:end)); % 偶数索引的元素序列W_N = exp(-2i * pi / N); % 计算旋转因子X = zeros(1, N); % 保存DFT结果for k = 0:N/2-1X(k+1) = x_even(k+1) + W_N^k * x_odd(k+1);X(k+1+N/2) = x_even(k+1) - W_N^k * x_odd(k+1); endend```该实现使用了递归的方式计算DFT,首先对输入序列进行分解,然后递归地计算子序列的DFT结果,并根据对称性将结果合并到一起。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 =M2的一般情况,第L 级共有1-L 2个不同的旋转因子:p W N =J 2L W J=0,1,2,… ,1-L 2-1L 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=M2);确定一蝶形两输入数据距离B=1-L 2p=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)数字信号处理(第四版)西安电子科技大学出版社高希全丁玉美编。