快速傅里叶变化算法及应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速傅里叶变化算法及应用
课程数字信号处理实验
系(院)物理与电子科学系
专业
班级
学生姓名
学号
一、 离散傅里叶变换的性质
离散傅里叶变换(DFT ),是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT )频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT ,也应当将其看作经过周期延拓成为周期信号再作变换。在实际应用中通常采用快速傅里叶变换以高效计算DFT 。
离散傅里叶变换具有下列性质: 1) 线性
{}{}{}][DFT ][DFT ][][DFT 2121k x b k x a k bx k ax +=+
需将较短序列补零后,再按长序列的点数做DFT 2) 循环位移(Circular shift of a sequence)
][])[(][k R n k x k y N N += 3) 对称性 (symmetry)
周期共轭对称(Periodic conjugate symmetry)定义为
][*][])[(*][k N x k R k x k x N N -=-=
周期共轭反对称(Periodic conjugate antisymmetry)定义为
][*][])[(*][k N x k R k x k x N N --=--=
4) 循环卷积定理
][])[(])[(][*][210121k R n k x n x k x k x N N N n N ⎭
⎬⎫
⎩⎨⎧-=∑-=
二、快速傅里叶变换的算法原理
1. 将长序列DFT 分解为短序列的DFT
2. 利用旋转因子的周期性、对称性、可约性。将时域序列逐次分解为一组子序列,利用旋转因子的特性,由子序列的DFT 来实现整个序列的DFT 。
其中:快速傅里叶变换分为两种,分为基2时间抽取算法和基2频率抽取算法 1) 基2时间抽取(Decimation in time)FFT 算法
⎩⎨
⎧+=]
12[]
2[][r x r x k x 其中:r=0,1,2…
12
-N
2) 基2频率抽取(Decimation in frequency)FFT 算法
⎩⎨
⎧+=]
12[]
2[][m X m X m X
三、FFT 的特点和规律
1) FFT 算法特点:(r
N 2=)
(1)共需r 次迭代;
(2)第)1(r L L ≤≤次迭代对偶结点的偶距为L
L r L L N K 2/2==--,因此一组结点覆盖
的序号个数是
12)(2-=
-L L L N K K 。
(3)第)1(r L L ≤≤次迭代结点的组数为[]1
2)(2/-=-L L L K K N 。
(4)
L
P
N W 可以预先计算好,而且L P 的变化范围是
12~
0-N 。
2) FFT 算法流程:(r
N 2=)
(1)初始化:
1
0),()(0-≤≤←N n n x n x ;
(2)第)1(r L L ≤≤次迭代:
(a )下标控制变量初始化0=L K ; (b )“结点对”的个数初始化0=num ; (c )
DO N
num WHILE L )2(<
四、蝶形运算的MATALAB 的程序设计
下面以16点为例:
disp('请输入一个16点序列'); for ii=1:16 %自由输入序列 x(ii) = input(['x(',num2str(ii),')=']); end
%整体运用原位计算
m=nextpow2(x);N=2^m; % 求x 的长度对应的2的最低幂次m if length(x) x=[x,zeros(1,N-length(x))]; % 若x的长度不是2的幂,补零到2的整数幂 end nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; % 求1:2^m数列序号的倒序 y=x(nxd); % 将x倒序排列作为y的初始值 for mm=1:m % 将DFT作m次基2分解,从左到右,对每次分解作DFT运算,共做m 级蝶形运算,每一级都有2^(mm-1)个蝶形结 Nz=2^mm;u=1; % 旋转因子u初始化为WN^0=1 WN=exp(-i*2*pi/Nz); % 本次分解的基本DFT因子WN=exp(-i*2*pi/Nz) for j=1:Nz/2 % 本次跨越间隔内的各次蝶形运算,在进行第mm级运算时需要2^(mm-1)个蝶形 for k=j:Nz:N % 本次蝶形运算的跨越间隔为Nz=2^mm kp=k+Nz/2; % 蝶形运算的两个因子对应单元下标的关系 t=y(kp)*u; % 蝶形运算的乘积项 y(kp)=y(k)-t; % 蝶形运算 y(k)=y(k)+t; % 蝶形运算 end u=u*WN; % 修改旋转因子,多乘一个基本DFT因子WN end end y y1=fft(x) 五、快速傅里叶变换MATALAB程序设计 function samples(f,Fs,M) N=2^M; % fft点数=取样总点数 Ts=1/Fs; % 取样时间间隔 T=N*T s; % 取样总时间=取样总点数*取样时间间隔 n=0:N-1; t=n*Ts; Xn=cos(2*f*pi*t);