您的当前位置:首页正文

DSP实验报告_matlab

2021-04-10 来源:爱go旅游网
按时间抽取的基 2-FFT算法实现

一、 实验目的

1. 掌握按时间抽取的基 2-FFT 的原理及具体实现方法。 2. 编程实现按时间抽取的基 2-FFT 算法。 3. 加深理解按时间抽取 FFT 算法的特点

二、 实验内容

1. 编程实现序列长度为 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; for m=1:3 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;

1

%求数列序号的倒序

%做 3级蝶形运算,每级 2^(3-m)组 %定义旋转因子

y=x(nxd); %将 x的倒序序列给 y Nz=2^m; %蝶形运算间隔序号数 Nz

%修改旋转因子

进行试验 请输入一个 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

输出图像:

200150100X(k)500-50-1001234k5678200150100X(k)500-50-1001234k5678具体数据:

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,完全一样,确认实验结果无误,完成题目要求

2. 将第 1 题的 FFT 程序推广到N=2v的情况,要求利用原位运算。 程序代码

disp ('请输入序列的长度( 2的指数) '); w= input(['2^']); v=2^w;

2

disp ('请输入序列 '); for ii=1:v end

nxd=bin2dec(fliplr(dec2bin([0:(v-1)])))+1; %求数列序号的倒序 y=x(nxd); for m=1:w

%将 x的倒序序列给 y

%做 3级蝶形运算,每级 2^(3-m)组 %蝶形运算间隔序号数 Nz %定义旋转因子

%每组需要 Nz/2个蝶形运算 %蝶形运算第一个因数 %蝶形运算的二个因数 %蝶形运算乘积项 %蝶形运算

%蝶形运算每级 2^m个 %修改旋转因子

%用户输入一个 N=2^v的序列

x(ii)= input(['x(',num2str(ii),')=']);

Nz=2^m; WN=exp(-1i*2*pi/Nz); u=WN^0; for j=1: Nz/2

for k=j:Nz:v kp=k+Nz/2; t=y(kp)*u;

y(kp)=y(k)-t; y(k)=y(k)+t; end u=u*WN; end end

y1=fft(x);

%结果核对

%绘出通过程序变换后的谱线 %绘出通过函数调用后的谱线

subplot(211); subplot(212);

stem(1:v,y);xlabel('k');ylabel('y(k)');grid off; stem(1:v,y1);xlabel('k');ylabel('y1(k)');grid off;

进行试验

请输入序列的长度( 2的指数) 2^4 请输入序列 x(1)=2 x(2)=56 x(3)=89 x(4)=2 x(5)=34 x(6)=5 x(7)=5

3

x(8)=67 x(9)=4 x(10)=3 x(11)=22 x(12)=4 x(13)=5 x(14)=67 x(15)=5 x(16)=5

输出图像:

400300200y(k)1000-100-20002468k10121416400300200y1(k)1000-100-20002468k10121416

具体数据:

Y= 3.7500 0.6002 - 0.6126i 0.0448 - 0.4514i -1.0825 - 1.4911i -0.7600 - 0.5300i 0.0950 - 1.1236i -0.7048 + 1.5686i 0.3073 + 0.9150i -0.4300 0.3073 - 0.9150i -0.7048 - 1.5686i 0.0950 + 1.1236i -0.7600 + 0.5300i -1.0825 + 1.4911i 0.0448 + 0.4514i 0.6002 + 0.6126i

Y1= 3.7500 0.6002 - 0.6126i 0.0448 - 0.4514i -1.0825 - 1.4911i -0.7600 - 0.5300i 0.0950 - 1.1236i -0.7048 + 1.5686i 0.3073 + 0.9150i -0.4300 0.3073 - 0.9150i -0.7048 - 1.5686i 0.0950 + 1.1236i -0.7600 + 0.5300i -1.0825 + 1.4911i 0.0448 + 0.4514i 0.6002 + 0.6126i

对比Y与Y1,完全一样,确认实验结果无误,完成题目要求

4

三、 实验分析

结合实验过程及结果,总结按时间抽取的基 2-FFT 算法的特点。

原位运算:FFT的每级运算都是由N个复数经N/2个蝶形运算变成了另外N个复数据。因此,如果所有的WkN的值预先置存,那么除了运算的工作单元外,只用N个空间进行存储就够了。单元中的数据,一经取用即可抹去,不影响以后的计算,以后的计算结果,原位置换原来的数据。节省存储单元,降低设备成本。

序号规律:FFT的输出端的X(k)的次序正好是顺序排列的,即X(0),X(1),…X(k)。但这时输入的x(n)却不能按自然顺序存入空间。将序号转换成相应位数的二进制数,将得到的二进制数反序,再转换回十进制数,所得的序列即为x(n)的乱序序列。

运算间距与WkN的变化规律:由实验所见,每列的蝶形类型比前一列增加一倍,参加蝶形运算的两个数据点的间距也增大一倍。例如,N=2v的一般情况,第一列只有一种类型的蝶形运算,系数是W0N。以后每列蝶形类型比前一列增加一倍,到第v列时是N/2个类型,系数是W0N, W1N…WN/2-1N。而之前第v-1列是N/4个类型,系数为W0N, W2N, W4N….

5

因篇幅问题不能全部显示,请点此查看更多更全内容