快速傅立叶变换及matlab代码

更新时间:2023-12-23 06:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 快速傅立叶变换

( 信息工程专业 )

一 实验目的

1 在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解; 2 熟悉并掌握按时间抽取FFT算法的程序;

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

二 实验内容

1 仔细分析教材第六章‘时间抽取法FFT ’的算法结构,编制出相应的用FFT

进行信号分析的C语言(或MATLAB 语言)程序;

2 用FFT程序计算有限长度正弦信号

y(t)?sin(2?ft),0?t?N*T

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

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 变量均由键盘输入,补零或不补零要求设置一开关来选择。

参考结果 1. a)的参考结果

2. c)的参考结果

clc; clear;

f=input('作者:,学号:\\n请输入信号频率: f\\n'); N=input('请输入采样点数: N\\n'); T=input('请输入间隔时间: T\\n');

flag=input('是否增加零点? 是=1 否=0\\n'); if(flag)

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

ZeroNum=0; end

%采样

t=0:T:T*(N-1); A=sin(2*pi*f*t);

%画出采样信号 %figure;

%subplot(2,1,1); %stem(t,A); %xlabel('t'); %ylabel('sin');

%添零创建新的采样数组 if (flag)

A=[A zeros(1, ZeroNum)]; end

N=N+ZeroNum;

%码位倒置变址 NV2=N/2; NM1=N-1; J=1; I=1;

while I<=NM1 if I

T=A(J); A(J)=A(I); A(I)=T; end

K=NV2; while K

end J=J+K; I=I+1; end

%计算每两个采样点的dft for i=1:2:N-1

B(i)=A(i)+A(i+1); B(i+1)=A(i)-A(i+1); end

?t蝶形运算过程 for n=1:1:log2(N)-1 m=1;

while m

for k=m:1:m+2^n-1

a=B(k)+B(k+2^n)*exp(-j*2*pi*(k-m)/2^(n+1)); b=B(k)-B(k+2^n)*exp(-j*2*pi*(k-m)/2^(n+1)); B(k)=a;

B(k+2^n)=b; end

m=m+2^(n+1); end end

%计算fft变换后的幅值 for i=1:1:N

C(i)=abs(B(i)); end

%求得幅值最大值 maxC=0;

for i=1:1:N

maxC=max(maxC,C(i)); end

%归一化处理 for i=1:1:N

F(i)=C(i)/maxC; end

%画图

%subplot(2,1,2); figure;

for i=0:1:N-1

stem(i,F(i+1)); hold on; end

xlabel('n'); ylabel('|F|');

本文来源:https://www.bwwdw.com/article/h3g5.html

Top