DSP实验报告_matlab
按时间抽取的基 2-FFT算法实现
实验目的
掌握按时间抽取的基 2-FFT 的原理及具体实现方法。
编程实现按时间抽取的基 2-FFT 算法。
加深理解按时间抽取 FFT 算法的特点
实验内容
编程实现序列长度为 N = 8的按时间抽取的基 2-FFT 算法。给定一个 8 点序列,采用编写的程序计算其 DFT,并与 MATLAB 中 fft 函数计算的结果相比较,以验证结果的正确性。
程序代码
disp ('请输入一个 N=8的序列 ');
for ii=1:8 %用户输入一个 N=8的序列
x(ii)= input(['x(',num2str(ii),')=']);
end
nxd=bin2dec(fliplr(dec2bin([0:7])))+1; %求数列序号的倒序
y=x(nxd); %将 x的倒序序列给 y
for m=1:3 %做 3级蝶形运算,每级 2^(3-m)组
Nz=2^m; %蝶形运算间隔序号数 Nz
WN=exp(-1i*2*pi/Nz); %定义旋转因子
u=WN^0;
for j=1: Nz/2 %每组需要 Nz/2个蝶形运算
for k=j:Nz:8 %蝶形运算第一个因数
kp=k+Nz/2; %蝶形运算的二个因数
t=y(kp)*u; %蝶形运算乘积项
y(kp)=y(k)-t; %蝶形运算
y(k)=y(k)+t; %蝶形运算每级 2^m个
end
u=u*WN; %修改旋转因子
end
end
y1=fft(x); %结果核对
subplot(211); %绘出通过程序变换后的谱线
stem(1:8,y);xlabel('k');ylabel('X(k)');grid off;
subplot(212); %绘出通过函数调用后的谱线
stem(1:8,y1);xlabel('k');ylabel('X(k)');grid off;
进行试验
请输入一个 N=8的序列
x(1)=2
x(2)=67
x(3)=3
x(4)=3
x(5)=45
x(6)=44
x(7)=21
x(8)=1
输出图像:
具体数据:
Y=1.8600 -0.2815 + 0.0032i 0.2300 - 1.0700i -0.5785 - 0.3568i -0.4400 -0.5785 + 0.3568i 0.2300 + 1.0700i -0.2815 - 0.0032i
Y1=1.8600 -0.2815 + 0.0032i 0.2300 - 1.0700i -0.5785 - 0.3568i -0.4400 -0.5785 + 0.3568i 0.2300 + 1.0700i -0.2815 - 0.0032i
对比Y与Y1,完全一样,确认实验结果无误,完成题目要求
将第 1 题的 FFT 程序推广到N=2v的情况,要求利用原位运算。
程序代码
disp ('请输入序列的长度( 2的指数) ');
w= input(['2^']);
v=2^w;
disp ('请输入序列 ');
for ii=1:v %用户输入一个 N=2^v的序列
x(ii)= input(['x(',num2str(ii),')=']);
end
nxd=bin2dec(fliplr(dec2bin([0:(v-1)])))+1; %求数列序号的倒序
y=x(nxd); %将 x的倒序序列给 y
for m=1:w %做 3级蝶形运算,每级 2^(3-m)组
Nz=2^m; %蝶形运算间隔序号数 Nz
WN=exp(-1i*2*pi/N