基4fft原理及matlab实现

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

基4FFT原理及MATLAB实现

一.时域抽取法基4FFT基本原理:

有限长序列错误!未找到引用源。的N点DFT为:

错误!未找到引用源。 k=0,1,2…,N-1 设序列错误!未找到引用源。长度为N,且满足错误!未找到引用源。,M为自然数,可把错误!未找到引用源。按下列方法分解为4个长为N/4的子序列:错误!未找到引用源。 r=0,1,…,N/4-1

错误!未找到引用源。 r=0,1,…,N/4-1 错误!未找到引用源。 r=0,1,…,N/4-1

错误!未找到引用源。 r=0,1,…,N/4-1 则错误!未找到引用源。的DFT为X(k)=错误!未找到引用源。+错误!未找到引用源。

=错误!未找到引用源。

=错误!未找到引用源。

因为:错误!未找到引用源。

所以:原式可表示为:

X(k)=错误!未找到引用源。

=错误!未找到引用源。 k=0,1,…,N/1

其中:错误!未找到引用源。分别为错误!未找到引用源。的N/4点DFT,即:错误!未找到引用源。=错误!未找到引用源。

错误!未找到引用源。=

错误!未找到引用源。

错误!未找到引用源。=

错误!未找到引用源。

错误!未找到引用源。=

错误!未找到引用源。

由于错误!未找到引用源。均以N/4为周期,且有:

错误!未找到引用源。,错误!未找到引用源。,错误!未找到引用源。,错误!未找到引用源。

所以:

X(k)=错误!未找到引用源。 k=0,1,…,N/4-1

X(k+ N/4)=错误!未找到引用源。 k=0,1,…,N/4-1

X(k+ 2N/4)=错误!未找到引用源。 k=0,1,…,N/4-1

X(k+ 3N/4)=错误!未找到引用源。 k=0,1,…,N/4-1

二.运算规律及编程思想:

1.按照上述分解法,再对错误!未找到引用源。进行反复分解,直到每个序列的长度等于4为止,这个4点的DFT的数学表达式为:

错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。

2.旋转因子错误!未找到引用源。与运算级数的关系(参考《数字信号处理(第三版)》西安电子科技大学出版社第115页)如下:

其中,L表示运算级数(L=1,2,…,M)(M=错误!未找到引用源。)(J=0,1,2,…,错误!未找到引用源。)

错误!未找到引用源。 ,(错误!未找到引用源。0,1,2…,错误!未找到引用源。)

3.序列的倒序:

与基2FFT的倒序相似(参考《数字信号处理(第三版)》西安电子科技大学出版社第116页)

由于错误!未找到引用源。,因此顺序数可用M位4进制数(错误!未找到引用源。)表示。M次时域抽取如下:

第一次按最低位错误!未找到引用源。的0,1,2,3将x(n)分解为4组,第二次又按次低位错误!未找到引用源。的0,1,2,3值分别对上面所得的4组分组;以此类推,第M次按错误!未找到引用源。位分解,最后得到4进制倒序数。最终可以得到这样的规律:只要将顺序数(错误!未找到引用源。)的4进制数倒置,就能得到对应的4进制倒序数(错误!未找到引用源。)。

4.运算流程图:

开始

N点采样数据x输入

clc;

clear;

a=0:255;

x=sin(2*pi/3*a)+sin(2*pi/4*a)+sin(2*pi/5*a)+sin(2*pi/6*a); %测试信号subplot(2,1,1),plot(x);

axis([0 256 -3 3]),title(' 时域信号波形');

subplot(2,2,3),plot(abs(fft(x)));

axis([0 256 0 200]),title('系统FFT 计算出的频谱');

N=256;

L=log(N)/log(4); %4点DFT 分解级数Wn=exp(-2j*pi/N); %旋转因子

temp=zeros(1,N); % 定义中间临时数组n=0:N-1;

screen=ones(1,N);

n=bitor(bitand(n,screen*hex2dec('cccc'))/4,bitand(n,screen*hex2dec('3333'))*4); n=bitor(bitand(n,screen*hex2dec('f0f0'))/16,bitand(n,screen*hex2dec('0f0f'))*16 );

n=bitor(bitand(n,screen*hex2dec('ff00'))/256,bitand(n,screen*hex2dec('00ff'))*2 56);

n=n/4^(8-L)+1;

for n1=1:N

temp(n(n1))=x(n1);

end

x=temp;

for l=1:L % 运算级循环

group_cont_2=4^(L-l); % 第l 级数据分组数

group_cont_1=4^(L-l+1); %第l-1 级数据分组数

group_interval_2=4^l; % 第l 级组间数据间隔个数,也是组内数据个数

group_interval_1=4^(l-1); %第l-1 级组间数据间隔个数,也是组内数据个数 G=group_cont_2-1; %分组上限

K=group_interval_1-1; % 组内数据上限

for g=0:G %每一级中包含的组循环,遍历每一组,计算各组中的数据 for k0=0:K %遍历每一组中的所有数据,计算次级数据

k=k0+g*group_interval_2+1; % 每组数据中第一个数据序号

m=group_cont_2*k0; % 每一级所乘旋转因子的指数因子

k1=k;

k2=k1+group_interval_1;

k3=k2+group_interval_1;

k4 =k3+group_interval_1;

X1=x(k1);

X2=Wn^m*x(k2);

相关文档
最新文档