快速傅里叶变换实验报告

  • 格式:doc
  • 大小:2.28 MB
  • 文档页数:14

下载文档原格式

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

快速傅里叶变换实验报告

班级:

姓名:

学号:

快速傅里叶变换

一.实验目的

1.在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解;

2.熟悉并掌握按时间抽取FFT 算法的程序;

3.了解应用FFT 进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT 。

二.实验内容

1.仔细分析教材第六章‘时间抽取法FFT ’的算法结构,编制出相应的用FFT 进行信号分析的C 语言(或MATLAB 语言)程序;

2.用FFT 程序分析正弦信号

()sin(2)[()(*)],(0)1y t f t u t u t N T t u π=---∞<<+∞=设

分别在以下情况进行分析并讨论所得的结果:

a ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.000625s

b ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.005s

c ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.0046875s

d ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.004s

e ) 信号频率

f =50Hz ,采样点数N=64,采样间隔T=0.000625s

f ) 信号频率f =250Hz ,采样点数N=32,采样间隔T=0.005s

g ) 将c ) 信号后补32个0,做64点FFT

三.实验要求

1.记录下实验内容中各种情况下的X (k)值,做出频谱图并深入讨论结果,说明参数的变化对信号频谱产生哪些影响。频谱只做模特性,模的最大值=1,全部归一化;

2.打印出用C 语言(或MATLAB 语言)编写的FFT 源程序,并且在每一小段处加上详细的注释说明;

3.用C 语言(或MATLAB 语言)编写FFT 程序时,要求采用人机界面形式:

N , T , f 变量均由键盘输入,补零或不补零要求设置一开关来选择。

四.实验分析

对于本实验进行快速傅里叶变换,依次需要对信号进行采样,补零(要求补零时),码位倒置,蝶形运算,归一化处理并作图。

此外,本实验要求采用人机界面形式,N,T,F 变量由键盘输入,补零或不补零设置一开关来选择。 1.采样

本实验进行FFT 运算,给出的是正弦信号,需要先对信号进行采样,得到有限长序列()n x , N n ......2,1,0= Matlab 实现:

t=0:T:T*(N-1); x=sin(2*pi*f*t); 2.补零

根据实验要求确定补零与否,可以用if 语句做判断,若为1,再输入补零个数, 并将补的零放到采样得到的序列的后面组成新的序列,此时新的序列的元素个数等于原采样点个数加上补零个数,并将新的序列个数赋值给N 。 Matlab 实现:

a=input('是否增加零点? 是请输入1 否请输入0\n');

if (a)

ZeroNum=input('请输入增加零点的个数:\n'); else

ZeroNum=0; end

if (a)

x=[x zeros(1, ZeroNum)];%%指令zeros(a,b)生成a 行b 列全0矩阵,在单行矩阵x 后补充0 end

N=N+ZeroNum;

3.码位倒置

本实验做FFT 变换的级数为M ,N M 2log =

做序列数对应的二进制数的码位倒置,dec2bin()函数将十进制数转换为二进制数,fliplr()将二进制数进行码位倒置,bin2dec()将二进制数转换为十

进制数,并将按码位倒置得到的序列赋值为()n

A,N

=

n......

2,1,0

Matlab实现:

M=log2(N); %% M位二进制数

for t=1:1:N

s=dec2bin(t-1,M); %%将十进制数转换为二进制数,M表示二进制码位数的上限

s=fliplr(s); %%将二进制数进行码位倒置

s=bin2dec(s); %%将二进制数转换为十进制数

b=s+1; %%二进制数从0开始,而矩阵中元素序数从1开始,故需+1 A(b)=x(t);

end

4.蝶形运算

用三层for循环来实现:1.实现FFT每一级运算,共M级,此处for循环用来控制级数;2.实现分组,此处for循环用来控制旋转因子;3.实现每一组中FFT运算,此处for循环用来控制进行蝶形运算的两点之间的距离。

最终得到的()k

A即为FFT变换的结果。

Matlab实现:

for L=1:1:M

for J=0:1:(2^(L-1)-1)

for k=(J+1):2^L:N

T=A(k)+A(k+2^(L-1))*exp((-i*2*pi*J*2^(M-L))/N);

A(k+2^(L-1))=A(k)-A(k+2^(L-1))*exp((-i*2*pi*J*2^(M-L))/N);

A(k)=T;

end

end

end%%A(k)即为FFT变换结果

5.归一化处理及作图

实验要求对FFT运算结果进行归一化处理,对FFT运算结果序列()k

A均取绝对值得序列()k

B中所有元素均除以m,即得B,并取出绝对值中最大值m,序列()k

到归一化处理后的序列。用stem函数即可实现作图。

Matlab实现:

%%归一化处理

B=abs(A);%%将矩阵A中元素均取绝对值,得矩阵B m=max(B);%%取矩阵B中的最大值