实验2_FFT的实现

合集下载

实验二 DFT(FFT)的应用—利用FFT实现快速卷积

实验二 DFT(FFT)的应用—利用FFT实现快速卷积

姓名:高铭遥 班级:16131701 学号:1120171450 成绩:实验二 DFT/FFT 的应用-利用FFT 实现快速卷积[实验目的]1.深刻理解DFT/FFT 的概念和性质,进一步掌握圆周卷积和线性卷积两者之间的关系。

2.掌握DFT/FFT 的应用。

理解FFT 在实现数字滤波(或快速卷积)中的重要作用,更好地利用FFT 进行数字信号处理。

[实验内容及要求]1.给定两个序列()[]2,1,1,2x n =,()[]1,1,1,1h n =--。

首先直接在时域计算两者的线性卷积;然后用FFT 快速计算二者的线性卷积,验证结果。

(1)线性卷积 程序代码:figure(1);N1=4; N2=4; xn=[2,1,1,2]; hn=[1,-1,-1,1];N=N1+N2-1;%卷积后的序列长度 yn=conv(xn,hn);%线性卷积 x=0:N-1;stem(x,yn);title('线性卷积'); 运行结果:(2)FFT 卷积快速卷积 程序代码: figure(1); n=0:1:3; m=0:1:3;N1=length(n);%xn 的序列长度 N2=length(m);%hn 的序列长度 xn=[2,1,1,2]; hn=[1,-1,-1,1];姓名:高铭遥 班级:16131701 学号:1120171450 成绩:N=N1+N2-1;%卷积后的序列长度XK=fft(xn,N);%xn 的离散傅里叶变换 HK=fft(hn,N);%hn 的离散傅里叶变换 YK=XK.*HK;yn=ifft(YK,N);%逆变换if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列 yn=real(yn); endx=0:N-1;stem(x,yn);title('FFT 卷积'); 运行结果:结果分析:对比(1)和(2)直接线性卷积和FFT 快速卷积的结果可以验证,用FFT 线性卷积的结果是与直接卷积的结果相同的,FFT 可以实现快速卷积,提高运算速度。

实验二FFT实现信号频谱分析

实验二FFT实现信号频谱分析

0
2
4
6
4
2
0
-2
-4
-6
-4
-20246四、试验环节
4. 试验内容2旳程序运营成果如下图所示:
60
30
40
20
20
10
0
0
-10 -5
0
5
10
-40 -20
0
20 40
30
80
60 20
40 10
20
0
-40 -20
0
20 40
0
-40 -20
0
20 40
四、试验环节
|X(k)| x(n)
5. 试验内容 3旳程序运营成果如下图所示:
fft 计算迅速离散傅立叶变换
fftshift
ifft
调整fft函数旳输出顺序,将零频 位置移到频谱旳中心
计算离散傅立叶反变换
fft函数:调用方式如下
y=fft(x):计算信号x旳迅速傅立叶变换y。当x旳长度为 2旳幂时,用基2算法,不然采用较慢旳分裂基算法。
y=fft(x,n):计算n点FFT。当length(x)>n时,截断x,不 然补零。
【例2-11】产生一种正弦信号频率为60Hz,并用fft函数 计算并绘出其幅度谱。
fftshift函数:调用方式如下 y=fftshift(x):假如x为向量,fftshift(x)直接将x旳左右两 部分互换;假如x为矩阵(多通道信号),将x旳左上、右 下和右上、左下四个部分两两互换。 【例2-12】产生一种正弦信号频率为60Hz,采样率为1000Hz, 用fftshift将其零频位置搬到频谱中心。
以上就是按时间抽取旳迅速傅立叶变换

实验二的应用FFT对信号进行频谱分析

实验二的应用FFT对信号进行频谱分析

实验二的应用FFT对信号进行频谱分析引言:频谱分析是通过将连续信号转换为离散信号,根据信号在频域上的强度分布来分析信号的频谱特性。

其中,FFT(Fast Fourier Transform,快速傅里叶变换)是一种常见的频谱分析算法,可以高效地计算离散信号的傅里叶变换。

实验目的:本实验旨在使用FFT算法来对一个信号进行频谱分析,从而了解FFT 的原理和应用。

实验器材:-计算机-MATLAB软件实验步骤:1.准备信号数据:首先,需要准备一个信号数据用于进行频谱分析。

可以通过MATLAB 自带的函数生成一个简单的信号数据,例如生成一个正弦信号:```Fs=1000;%采样频率T=1/Fs;%采样时间间隔L=1000;%信号长度t=(0:L-1)*T;%时间向量S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); % 生成信号,包含50Hz和120Hz的正弦波成分```其中,Fs为采样频率,T为采样时间间隔,L为信号长度,t为时间向量,S为生成的信号数据。

2.进行FFT计算:利用MATLAB提供的fft函数,对准备好的信号数据进行FFT计算,得到信号的频谱:```Y = fft(S); % 对信号数据进行FFT计算P2 = abs(Y/L); % 取FFT结果的模值,并归一化P1=P2(1:L/2+1);%取模值前一半P1(2:end-1) = 2*P1(2:end-1); % 对非直流分量进行倍频处理f=Fs*(0:(L/2))/L;%计算对应的频率```其中,Y为FFT计算的结果,P2为对应结果的模值,并进行归一化处理,P1为P2的前一半,f为对应的频率。

3.绘制频谱图:使用MATLAB的plot函数,将频率和对应的功率谱绘制成频谱图:```plot(f,P1)title('Single-Sided Amplitude Spectrum of S(t)')xlabel('f (Hz)')ylabel(',P1(f),')```实验结果与分析:上述实验步骤通过MATLAB实现了对一个信号的频谱分析并绘制成频谱图。

实验二用FFT做谱分析实验报告

实验二用FFT做谱分析实验报告

实验二用FFT做谱分析实验报告一、引言谱分析是信号处理中一个重要的技术手段,通过分析信号的频谱特性可以得到信号的频率、幅度等信息。

傅里叶变换是一种常用的谱分析方法,通过将信号变换到频域进行分析,可以得到信号的频谱信息。

FFT(快速傅里叶变换)是一种高效的计算傅里叶变换的算法,可以大幅减少计算复杂度。

本实验旨在通过使用FFT算法实现对信号的谱分析,并进一步了解信号的频谱特性。

二、实验目的1.理解傅里叶变换的原理和谱分析的方法;2.学习使用FFT算法对信号进行谱分析;3.通过实验掌握信号的频谱特性的分析方法。

三、实验原理傅里叶变换是将信号从时域转换到频域的一种数学变换方法,可以将一个非周期性信号分解为一系列正弦和余弦函数的叠加。

FFT是一种计算傅里叶变换的快速算法,能够在较短的时间内计算出信号的频谱。

在进行FFT谱分析时,首先需要对信号进行采样,然后利用FFT算法将采样后的信号转换到频域得到信号的频谱。

频谱可以用幅度谱和相位谱表示,其中幅度谱表示信号在不同频率下的幅度,相位谱表示信号在不同频率下的相位。

四、实验装置和材料1.计算机;2.信号发生器;3.数字示波器。

五、实验步骤1.连接信号发生器和示波器,通过信号发生器产生一个周期为1s的正弦信号,并将信号输入到示波器中进行显示;2.利用示波器对信号进行采样,得到采样信号;3.利用FFT算法对采样信号进行频谱分析,得到信号的频谱图。

六、实验结果[插入频谱图]从频谱图中可以清晰地看到信号在不同频率下的幅度和相位信息。

其中,频率为2Hz的分量的幅度最大,频率为5Hz的分量的幅度次之。

七、实验分析通过对信号的频谱分析,我们可以得到信号的频率分量和其对应的幅度和相位信息。

通过分析频谱图,我们可以得到信号中各个频率分量的相对强度。

在本实验中,我们可以看到频率为2Hz的分量的幅度最大,频率为5Hz的分量的幅度次之。

这说明信号中存在2Hz和5Hz的周期性成分,且2Hz的成分更为明显。

实验二 FFT实现信号频谱分析

实验二 FFT实现信号频谱分析

在t<0时,xa(t)=0。
3. 已知序列
x(n) 2sin(0.48 n) cos(0.52 n) 0 n 99
试绘制x(n)及它的离散傅立叶变换|X(k)|图。
四、实验步骤
1. 复习DFT的定义、性质和用DFT做谱分析的有关内容。
2. 复习FFT算法原理与编程思想,并对照DFT-FFT运算流图 和程序框图,读懂FFT程序。下图给出了主程序框图,供 参考 开始
【例2-11】产生一个正弦信号频率为60Hz,并用fft函数 计算并绘出其幅度谱。
fftshift函数:调用方式如下 y=fftshift(x):如果x为向量,fftshift(x)直接将x的左右两 部分交换;如果x为矩阵(多通道信号),将x的左上、右 下和右上、左下四个部分两两交换。 【例2-12】产生一个正弦信号频率为60Hz,采样率为1000Hz, 用fftshift将其零频位置搬到频谱中心。
三、实验内容
1. 考虑长度为5的有限序列,设采样周期为 0.5s。
x(0) 1, x(1) 3, x(2) 5, x(3) 1, x(4) 1 要求用FFT来计算其频谱时间信号的频谱 。
xa (t ) e0.01t cos 2t 2e0.015t sin 2.1t t 0
2、MATLAB函数傅里叶变换函数
常用的FFT及反变换函数如下表所示。 函数 说明 计算快速离散傅立叶变换 调整fft函数的输出顺序,将零频位置移 到频谱的中心
fft
fftshift
ifft
计算离散傅立叶反变换
fft函数:调用方式如下
y=fft(x):计算信号x的快速傅立叶变换y。当x的长度为 2的幂时,用基2算法,否则采用较慢的分裂基算法。 y=fft(x,n):计算n点FFT。当length(x)>n时,截断x,否 则补零。

实验二 FFT算法的MATLAB实现

实验二	FFT算法的MATLAB实现

班级:学号:姓名实验二FFT算法的MATLAB实现(一)实验目的:(1)掌握用matlab进行FFT在数字信号处理中的高效率应用。

(2)学习用FFT对连续信号和时域离散信号进行谱分析。

(二)实验内容及运行结果:题1:若x(n)=cos(nπ/6)是一个N=12的有限序列,利用MATLAB计算它的DFT 并进行IDFT变换同时将原图与IDFT变换后的图形进行对比。

当求解IFFT变换中,采样点数少于12时,会产生什么问题。

程序代码:N=12;n=0:11;Xn=cos(n*pi/6);k=0:11;nk=n'*k;WN=exp(-j*2*pi/N)WNnk=WN.^nkXK=Xn*WNnk;figure(1)stem(Xn)figure(2)stem(abs(XK))运行结果:IFFT变换中,当采样点数少于12时图像如下图显示:分析:由图像可以看出,当采样点数小于12时,x(n)的频谱不变,周期为6,而XK 的频谱图发生改变。

题2:对以下序列进行谱分析132()()103()8470x n R n n n x n nn =+≤≤⎧⎪=-≤≤⎨⎪⎩其他n选择FFT 的变换区间N 为8和16点两种情况进行频谱分析,分别打印其幅频特性曲线并进行对比、分析和讨论。

㈠ 程序代码:x=ones(1,3);nx=0:2; x1k8=fft(x,8);F=(0:length(x1k8)-1)'*2/length(x1k8); %进行对应的频率转换 stem(f,abs(x1k8));%8点FFT title('8点FFTx_1(n)'); xlabel('w/pi'); ylabel('幅度');N=8时:x=ones(1,3);nx=0:2;x1k16=fft(x,16);f=(0:length(x1k16)-1)'*2/length(x1k16); %进行对应的频率转换stem(f,abs(x1k16));%16点FFTtitle('16点FFTx_1(n)');xlabel('w/pi');ylabel('幅度');N=16时:分析:对x1进行分析,两图像相似,N越大图像分辨率越高。

实验1 基2-FFT算法实现(1)

实验1 基2-FFT算法实现(1)

实验1基2-FFT算法实现一、实验目的1.掌握基2-FFT的原理及具体实现方法。

2.编程实现基2∙FFT算法。

3.加深理解FFT算法的特点。

二、实验设备与环境计算机、MAT1AB软件环境。

三、实验基础理论FFT是DFT的一种快速算法,能使DFT的计算大大简化,运算时间缩短。

FFT利用了第人的三个固有特性,即对称性、周期性和可约性,将长序列的DFT分解为短序列的DFT,合并了DFT运算中的某些项,从而减少了DFT的运算量。

FFT算法基本上可以分为两大类,即按时间抽取法和按频率抽取法。

在实现FFT算法时,要重点考虑两个问题,注意数据的读取和存储:(1)输入输出的排序;(2)碟形运算的实现。

按时间抽取算法中输入反序输出顺序,按频率抽取算法中输入顺序输出反序;运算过程中的每一级都由N/2个碟形运算构成,每一个碟形运算单元中,两个节点变量运算后得到的结果为下一列相同位置的节点变量,而和其他节点变量无关,可以采用原位运算,节省存储单元。

另外,碟形运算中的复系数除比可以存储为能及时查阅的系数表,这样可以节约计算量,但是需要N/2个复数存储器。

MAT1AB中提供了用于计算FFT的函数fft,可将实验中所得到的结果与利用MAT1AB中fft函数计算的结果相比较,以此验证结果的正确性。

四、实验内容1编程实现序列长度为N=8的按时间抽取的基2-FFT算法。

给定一个8点序列,采用编写的程序计算其DFT,并与MAT1AB中fft函数计算的结果相比较,以验证结果的正确性。

2.编程实现序列长度为N=8的按频率抽取的基2∙FFT算法。

给定一个8点序列,采用编写的程序计算其DFT,并与MAT1AB中fft函数计算的结果相比较,以验证结果的正确性。

3.将上述FFT程序推广到序列长度为N=2v的情况,要求利用原位运算。

五、实验代码及分析4.实验代码:»x=[1+2j0.5+3j5+4j-2+3j6-3j5+1j9-1-2j];>>n=bin2dec(f1ip1r((dec2bin([1ι8]-1,3))))+1;>>xθ=x;>>for1=1:3form=1:2A(1-1)fork=1:2A(3-1)t=xO(k+(m-1)*2A(4-1)+2A(3-1));x0(k+(m-1)*2^(4-1)+2^(3-1))=(x0(k+(m-1)*2^(4-1))-t)∙exp(-2*1j*pi*(k-1)∕(8∕2^(1-1)));xO(k+(m-1)*2A(4-1))=xO(k+(m-1)*2A(4-1))+t;endendend>>y1=fft(x)>>fori=1:8yθ(i)=xθ(n(i));end>>yθyi=Co1umns1through523.5000+8.0000i 1.4749+10.7678i-4.0000-13.5000i-1.5754+7.0104i18.5000-2.0000iCo1umns6through8-3.4749+7.2322i-10.0000+3.5000i-16.4246-5.0104iyθ=Co1umns1through523.5000+8.0000i 1.4749+10.7678i-4.0000-13.5000i-1.5754+7.0104i18.5000-2.0000iCo1umns6through8-3.4749+7.2322i-10.0000+3.5000i-16.4246-5.0104i分析:yθ和y1两者结果完全相同,说明结果正确。

实验二 应用FFT对信号

实验二 应用FFT对信号

实验二应用FFT对信号进行频谱分析一、实验目的1.加深对离散信号的DTFT和DFT的及其相互关系的理解。

2.在理论学习的基础上,通过本次实验,加深对快速傅立叶变换的理解,熟悉FFT算法及其程序的编写。

3.熟悉应用FFT对典型信号进行频谱分析的方法。

4.了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。

二、实验原理与方法一个连续信号x a(t)的频谱可以用他的傅立叶变换表示为:X a^(jΩ)= (2-1)如果对该信号进行理想采样,可以得到采样序列:x(n)=X a(nT) (2-2) 同样可以对该序列进行Z变换,其中T为采样周期:X(z)= (2-3) 当Z=e jω的时候,我们就得到了序列的傅立叶变换:X(e jω)= (2-4)其中称为数字频率,它和模拟域频率的关系为:(2-5)有下式的对应关系。

X(e jω)= (2-6) 即序列的频谱是采样信号频谱的周期延拓。

从上式可以看出,只要分析采样序列的频谱,就可以得到相应的连续信号频谱,就可以得到相应的连续信号的频谱。

注意:这里的信号必须是带限信号,采样也必须满足Nyquist 定理。

在各种信号序列中,有限长序列在数字信号处理中占有很重要的地位。

无限长的序列也往往可以用有限长序列来逼近。

对于有限长的序列我们可以使用离散傅里叶变换(DFT),这一变换可以很好地反映序列的频域特性,并且容易利用快速算法在计算机上实现当序列的长度是N时,我们定义离散傅里叶变化为:X(k)=DFT[x(n)]=(2-7)其中,它的反变换定义为:x(n)=IDFT[X(k)]=(2-8)根据(2-3)和(2-7)令Z=,则有:=(2-9)可以得到,是Z平面单位圆上幅角为的点,就是将单位圆进行N等分以后第K个点。

所以,X(k)是Z 变换在单位圆上的等距采样,或者说是序列福利叶变换的等距采样。

时域采样在满足Nyquist定理时,就不会发生频率混淆;同样地,在频率域进行采样的时候,只要采样间隔足够小,也不会发生时域序列的混淆。

FFT算法(用matlab实现)

FFT算法(用matlab实现)

数字信号处理实验报告 实验二 FFT 算法的MATLAB 实现(一)实验目的:理解离散傅立叶变换时信号分析与处理的一种重要变换,特别是FFT 在数字信号处理中的高效率应用。

(二)实验原理:1、有限长序列x(n)的DFT 的概念和公式:⎪⎪⎩⎪⎪⎨⎧-≤≤=-≤≤=∑∑-=--=101010)(1)(10)()(N k kn N N n kn N N n W k x N n x N k W n x k x)/2(N j N eW π-=2、FFT 算法调用格式是 X= fft(x) 或 X=fft(x,N)对前者,若x 的长度是2的整数次幂,则按该长度实现x 的快速变换,否则,实现的是慢速的非2的整数次幂的变换;对后者,N 应为2的整数次幂,若x 的长度小于N ,则补零,若超过N ,则舍弃N 以后的数据。

Ifft 的调用格式与之相同。

(三)实验内容1、题一:若x(n)=cos(n*pi/6)是一个N=12的有限序列,利用MATLAB 计算它的DFT 并画出图形。

源程序: clc; N=12; n=0:N-1; k=0:N-1;xn=cos(n*pi/6); W=exp(-j*2*pi/N); kn=n'*kXk=xn*(W.^kn) stem(n,Xk); xlabel('k'); ylabel('Xk'); grid on ;也可用FFT 算法直接得出结果,程序如下: clc; N=12; n=0:N-1;xn=cos(n*pi/6);Xk=fft(xn,N); stem(n,Xk); xlabel('k'); ylabel('Xk'); grid on ;实验结果:24681012kX k分析实验结果:用DFT 和用FFT 对序列进行运算,最后得到的结果相同。

但用快速傅立叶变换的运算速度可以快很多。

2、题二:一被噪声污染的信号,很难看出它所包含的频率分量,如一个由50Hz 和120Hz 正弦信号构成的信号,受均值随机噪声的干扰,数据采样率为1000Hz ,通过FFT 来分析其信号频率成分,用MA TLAB 实现。

实验2-FFT的实现

实验2-FFT的实现

实 验 报 告学生姓名: 学 号: 指导教师:一、实验室名称:数字信号处理实验室 二、实验项目名称:FFT 的实现 三、实验原理:一.FFT 算法思想:1.DFT 的定义:对于有限长离散数字信号{x[n]},0 ≤ n ≤ N-1,其离散谱{x[k]}可以由离散付氏变换(DFT )求得。

DFT 的定义为:21[][]N jnk Nn X k x n eπ--==∑,k=0,1,…N-1通常令2jNN eW π-=,称为旋转因子。

2.直接计算DFT 的问题及FFT 的基本思想:由DFT 的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次加法。

因此,对于一些相当大的N 值(如1024)来说,直接计算它的DFT 所作的计算量是很大的。

FFT 的基本思想在于,将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。

例如,若N 为偶数,将原有的N 点序列分成两个(N/2)点序列,那么计算N 点DFT 将只需要约[(N/2)2 ·2]=N 2/2次复数乘法。

即比直接计算少作一半乘法。

因子(N/2)2表示直接计算(N/2)点DFT 所需要的乘法次数,而乘数2代表必须完成两个DFT 。

上述处理方法可以反复使用,即(N/2)点的DFT 计算也可以化成两个(N/4)点的DFT (假定N/2为偶数),从而又少作一半的乘法。

这样一级一级的划分下去一直到最后就划分成两点的FFT 运算的情况。

3.基2按时间抽取(DIT )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。

将长度为2L N =的序列[](0,1,...,1)x n n N =-,先按n 的奇偶分成两组:12[2][][21][]x r x r x r x r =+=,r=0,1,…,N/2-1DFT 化为:1/21/212(21)0/21/21221200/21/211/22/2[]{[]}[][2][21][][][][]N N N nk rk r kNNNn r r N N rk k rkNNNr r N N rk k rkN NN r r X k DFT x n x n Wx r Wx r W x r W Wx r W x r WWx r W ---+===--==--=====++=+=+∑∑∑∑∑∑∑上式中利用了旋转因子的可约性,即:2/2rkrkNN W W =。

fft实验分析实验报告

fft实验分析实验报告

fft实验分析实验报告FFT实验分析实验报告一、引言傅里叶变换(Fourier Transform)是一种重要的信号分析工具,它能够将一个信号分解成不同频率的成分。

快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效的计算傅里叶变换的算法。

本实验旨在通过实际操作,探究FFT在信号分析中的应用。

二、实验设备与方法1. 实验设备:本实验使用的设备包括示波器、信号发生器和计算机。

2. 实验方法:(1)将信号发生器的输出接入示波器的输入端。

(2)调节信号发生器的参数,如频率、振幅等,产生不同的信号。

(3)通过示波器观察信号的波形,并记录相关数据。

(4)将示波器与计算机通过USB接口连接,将示波器上的数据传输到计算机上。

(5)使用计算机上的软件进行FFT分析,得到信号的频谱信息。

三、实验结果与分析1. 实验一:正弦波信号的FFT分析(1)设置信号发生器的频率为1000Hz,振幅为5V,产生一段正弦波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,正弦波信号的频谱图呈现出单个峰值,且峰值位于1000Hz处。

这说明FFT能够准确地分析出信号的频率成分,并将其可视化展示。

2. 实验二:方波信号的FFT分析(1)设置信号发生器的频率为500Hz,振幅为5V,产生一段方波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,方波信号的频谱图呈现出多个峰值,且峰值位于500Hz的倍数处。

这说明方波信号由多个频率成分叠加而成,FFT能够将其分解出来,并显示出各个频率成分的强度。

3. 实验三:复杂信号的FFT分析(1)设置信号发生器的频率为100Hz和200Hz,振幅分别为3V和5V,产生一段复杂信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

FFT实验(含FFT实现程序)

FFT实验(含FFT实现程序)

实验报告实验名称:快速傅里叶变换一实验目的1在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解;2熟悉并掌握按时间抽取FFT算法的程序;3了解应用FFT进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT。

二实验内容1仔细分析教材第六章‘时间抽取法FFT的FORTRAN程序’,编制出相应的用FFT进行信号分析的C 语言程序或Matlab程序;2用FFT程序分析正弦信号,分别在以下情况进行分析并讨论所得的结果:a)信号频率F=50Hz,采样点数N=32,采样间隔T=0.000625sb)信号频率F=50Hz,采样点数N=32,采样间隔T=0.005sc)信号频率F=50Hz,采样点数N=32,采样间隔T=0.0046875sd)信号频率F=50Hz,采样点数N=32,采样间隔T=0.004se)信号频率F=50Hz,采样点数N=64,采样间隔T=0.000625sf)信号频率F=250Hz,采样点数N=32,采样间隔T=0.005sg)将c)信号后补32个0,做64点FFT三实验结果1在Matlab下编写如下的程序清单如下:% MyFft.m%-------用户界面,等待输入数据--------%------------------------------------index = input('请输入信号频率,采样点数,采样周期F,N,T: ','s');index = str2num(index);F = index(1); % 信号频率N = index(2); % 采样点数T = index(3); % 采样周期%-------------原始数据定义-----------%------------------------------------x0 = sin(2*pi*F*(0:N-1)*T);%-------------是否补零---------------%------------------------------------REPLY = input('是否补零? Y/N: ', 's');if REPLY == 'Y'COUNTS = input('补零后总点数: ', 's');N = str2num(COUNTS);x0(length(x0)+1:N) = 0;end%--------------码位倒置--------------%------------------------------------revi = bitrevorder(1:N);x(1:N) = x0(revi(1:N));%--------------fft运算---------------%------------------------------------L = log2(N); % L表示蝶形算法的层数for i = 1:Lgrp(i) = pow2(L-i); % grp 为各层分组数wdt(i) = pow2(i-1); % wdt 为各层两点蝶形元素的距离for j = 1:grp(i)for k = 1:wdt(i)real = cos(2*pi*(k-1)*grp(i) / N);imag = -sin(2*pi*(k-1)*grp(i) / N);w = complex(real,imag);temp = x(k + wdt(i) + (j-1)*N/grp(i)) * w;x(k + wdt(i) + (j-1)*N/grp(i)) = x(k + (j-1)*N/grp(i)) - temp;x(k + (j-1)*N/grp(i)) = x(k + (j-1)*N/grp(i)) + temp;endendend%--------------频率特性--------------%------------------------------------mag = abs(x);maxmag = max(mag);mag = mag/maxmag;f = (0:N-1)*(1/N/T);subplot(2,1,1);stem(0:N-1,mag);grid;axis([0,32,0,1])grid;xlabel('K(Frequency)')ylabel('|X|(normalized)')')title('FFT Magnitude Parta)a),b),c),d) FFT结果如下:b)e),f),g) FFT结果如表3 作出各种情况下的幅频特性如图: a)F =50Hz , N=32, T=0.000625sb) F =50Hz , N=32, T=0.005sc) F =50Hz , N=32, T=0.0046875sK(Frequency)|X |(n o r m a l i z e d )0.51Frequency in pi units|X |(n o r m a l i z e d )DTFT Magnitude PartK(Frequency)|X |(n o r m a l i z e d )00.20.40.60.81 1.2 1.4 1.6 1.820.51Frequency in pi units|X |(n o r m a l i z e d )DTFT Magnitude Partd) F =50Hz , N=32, T=0.004se) F =50Hz , N=64, T=0.000625sK(Frequency)|X |(n o r m a l i z e d )0.51Frequency in pi units|X |(n o r m a l i z e d )DTFT Magnitude Part051015202530K(Frequency)|X |(n o r m a l i z e d )0.51Frequency in pi units|X |(n o r m a l i z e d )DTFT Magnitude Partf) F =250Hz , N=32, T=0.005sg) 将c ) 信号后补32个0,做64点FFTK(Frequency)|X |(n o r m a l i z e d )0.51Frequency in pi units|X |(n o r m a l i z e d)DTFT Magnitude PartK(Frequency)|X |(n o r m a l i z e d )0.51Frequency in pi units|X |(n o r m a l i z e d )DTFT Magnitude Part四 结果分析1采样要满足Nyquist 采样定理,才有可能得到良好的频域特性,在以上各项中,仅有f )没有满足采样条件,但是由于采样的原因,实际上在FFT 中并未反映出来(即栅栏效应),但是DTFT 中这样的欠采样影响是明显的(即频谱发生了混淆)。

电子科技大学 DSP 实验二 FFT的实现

电子科技大学 DSP 实验二 FFT的实现

电子科技大学实验报告一、实验室名称:数字信号处理实验室 二、实验项目名称:FFT 的实现 三、实验原理:一.FFT 算法思想:1.DFT 的定义:对于有限长离散数字信号{x[n]},0 ≤n ≤N-1,其离散谱{x[k]}可以由离散付氏变换(DFT )求得。

DFT 的定义为:21[][]N jnk Nn X k x n eπ--==∑,k=0,1,…N-1通常令2jNN eW π-=,称为旋转因子。

2.直接计算DFT 的问题及FFT 的基本思想:由DFT 的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次加法。

因此,对于一些相当大的N 值(如1024)来说,直接计算它的DFT 所作的计算量是很大的。

FFT 的基本思想在于,将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。

例如,若N 为偶数,将原有的N 点序列分成两个(N/2)点序列,那么计算N 点DFT 将只需要约[(N/2)2 ·2]=N 2/2次复数乘法。

即比直接计算少作一半乘法。

因子(N/2)2表示直接计算(N/2)点DFT 所需要的乘法次数,而乘数2代表必须完成两个DFT 。

上述处理方法可以反复使用,即(N/2)点的DFT 计算也可以化成两个(N/4)点的DFT (假定N/2为偶数),从而又少作一半的乘法。

这样一级一级的划分下去一直到最后就划分成两点的FFT 运算的情况。

3.基2按时间抽取(DIT )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。

将长度为2L N =的序列[](0,1,...,1)x n n N =-,先按n 的奇偶分成两组:12[2][][21][]x r x r x r x r =+=,r=0,1,…,N/2-1DFT 化为:1/21/212(21)0/21/21221200/21/211/22/2[]{[]}[][2][21][][][][]N N N nkrk r kNNNn r r N N rk k rk NNN r r N N rk k rk N NN r r X k DFT x n x n Wx r Wx r W x r W Wx r W x r WWx r W ---+===--==--=====++=+=+∑∑∑∑∑∑∑上式中利用了旋转因子的可约性,即:2/2rk rk NN W W=。

综合实验DSP实验二报告(FFT实现)

综合实验DSP实验二报告(FFT实现)

实验二FFT实现一、实验目的进一步熟悉CCS v5的开发环境,掌握调试的要素,并理解FFT的过程。

二、程序功能1、基本功能本程序的基本要求是:将FFT结果写入SDRAM后,并读取出来。

2、拓展功能(1)其他点数的FFT;(2)FFT后再进行IFFT,验证是否与原数据一致。

三、程序基本信息(一)、程序模块描述:1、FFT程序(实现基本功能):(1)FFT部分:○1主函数(main):初始化输入序列、旋转因子、FFT点数,负责其它功能函数的调用,并完成一些基本操作。

○2void DSP_radix2(int n, short *restrict xy, const short *restrict w):完成FFT 运算(基2频域抽选)。

参数说明:n是输入序列的长度,short xy是输入序列(复数),const short w为旋转因子。

○3 void bitrev_index(short *index, int n):计算得到重新排序表,n 为序列长度。

○4 void DSP_bitrev_cplx(int *x, short *index, int nx):根据bitrev_index计算的排序表,把FFT输出的复数序列x重新排序为自然顺序。

DSP_bitrev_cplx:(2)SDRAM配置与写入部分:主函数(main):负责其它功能的调用,执行SDRAM写入、读取和检测,并点亮对应的LED。

EMIFA_config(&MyEmifaConfig):实现对EMIFA总线的12个接口寄存器的配置。

具体配置信息在MyEmifaConfig结构体中。

#pragma DATA_SECTION(sdram_data,".off_ram");数据段定义,定义要写入的数据位置,需要在CMD文件中建立对应的section。

C641x_SDRAM.cmd文件;描述物理存储器的管理、分配和使用情况,用于DSP 代码的定位。

十一、按频率抽取基2-FFT原理及实现

十一、按频率抽取基2-FFT原理及实现
ylabel('t/s');title('DFTfor执行时间');
DFTmat_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
DFTmat(x);
DFTmat_time(n)=etime(clock,t);
end
subplot(2,1,2);plot(k,DFTmat_time,'--');
end
figure(1);
subplot(2,1,1);plot(k,ditfft_time,'--');
ylabel('t/s');title('DIT-FFT执行时间');
subplot(2,1,2);plot(k,diffft_time,'--');
ylabel('t/s');title('DIF-FFT执行时间');%结果11-1
t=clock;
ditfft(x);
ditfft_time(n)=etime(clock,t);
end
k=1:Nmax;
diffft_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
diffft(x);
diffft_time(n)=etime(clock,t);
DFTfor_time=zeros(1,Nmax);
forn=1:Nmax
x=rand(1,n);
t=clock;
DFTfor(x);
DFTfor_time(n)=etime(clock,t);

fft算法实验报告

fft算法实验报告

4.myfft 程序和 matlab 程序 fft 函数的性能比较: 采用和 3 相同点方法,比较两个函数运行 100 次的时间。 100次t 程序 Myfft Matlab中的fft函数
3.032695 0.239575 3.024423 0.249747 3.045666 0.246446 3.069280 0.254197 3.085829 0.252704
图 1 8 点序列基 2—FFT 算法蝶形图
当需要进行变换的序列长度不是 2 的整数次方时,可以用末尾补零的方法,使其长 度延长至 2 的整数次方。IFFT 一般可以通过 FFT 程序完成。比较式(1)和(2) ,只要对
X (k ) 取共轭,进行 FFT 运算,然后再取共轭,并乘以因子 1/N,就可以完成 IFFT。
3. 对所编写的 FFT 程序进行性能评估。 评价一个算法的性能,主要从时间复杂度和空间复杂度两方面进行评价。随着硬 件设备的发展,空间复杂度对算法性能的影响越来越小,算法的时间复杂度变得更加 重要。而时间复杂度主要依赖于算法的运算次数,众所周知,基 2-FFT 算法的复数乘 法次数为
1 Nlog 2 N 。所以,从算法的时间复杂度上来看,基 2-FFT 算法肯定优于直 2
运算时间
400
300
200
100
0 0 5 10 15 20
log2(N)
图4 myfft和fft函数执行时间的比较
由此可以看出,自己编写的myfft函数性能明显比matlab中的fft函数差:对于特定长度的 序列后者的运算时间比前者短得多,而且,随着N增大,myfft函数的运算时间的增长速度 也比fft函数快得多。因为matlab中的fft函数是用更底层的C语言写的,并且进行了非常好 的优化,所以这个结果也并不意外。 实验总结

实验二_应用FFT对信号进行频谱分析

实验二_应用FFT对信号进行频谱分析

1. 三、实验内容和结果:高斯序列的时域和频域特性:高斯序列的时域表达式:2(),015()0,n p q a e n x n -⎧⎪≤≤=⎨⎪⎩其它固定参数p=8,改变参数q 的值, 记录时域和频域的特性如下图。

图 1i. 结论: 从时域图中可以看到, q 参数反应的是高斯序列能量的集中程度: q 越小, 能量越集中, 序列偏离中心衰减得越快, 外观上更陡峭。

同时, 随着q 的增大, 时域序列总的能量是在增大的。

频域上, 对应的, 随着q 的增加, 由于时域序列偏离中心的衰减的缓慢, 则高频分量也就逐渐减, 带宽变小: 时域上总的能量增大, 故也可以看到低频成分的幅度都增大。

固定参数q, 改变参数p, 记录时域和频域的特性如下图 2.图 22. 结论: p 是高斯序列的对称中心, p 的变化在时域表现为序列位置的变化。

由于选取的矩形窗函数一定, p 值过大时, 会带来高斯序列的截断。

并且随着p 的增大, 截断的越来越多。

对应地, 看频域上的变化: 截断的越多, 高频的成分也在增多, 以至发生谱间干扰, 泄露现象变得严重。

从图中可以看到, 在p=13时, 已经有混叠存在。

当p=14时, 混叠进一步加大, 泄露变得更明显。

衰减正弦序列的时域和幅频特性:sin(2),015()0,n b e fn n x n απ-⎧≤≤=⎨⎩其它改变参数f, 记录时域和幅频特性如下图3.图 33. 结论: 随着f 的增大, 时域上可以看到, 序列的变化明显快多了。

从幅度谱上看, 序列的高频分量逐渐增多, 低频分量逐渐减小, 以至于发生严重的频谱混叠。

当f 增大到一定的程度, 从图中可以看到, f=0.4375和f=0.5625时的幅度谱是非常相似的, 此时已经很难看出其幅度谱的区别。

三角序列的时域表达式和对应的时域和幅频特性如图 4:c 1,03()8,470,n n x n n n n +≤≤⎧⎪=-≤≤⎨⎪⎩其它图 4结论: 随着fft 取点数的增多, 能够看到的幅度谱的频率分量变得丰富, 得到的是高密度更高的谱, 也就是减轻了栅栏效应。

fft算法实现(实验二)

fft算法实现(实验二)

实验项目:FFT 算法的实现实验课程:数字信号处理3.实验原理与方法设序列x (n )的长度为N ,且满足N =2M ,M 为自然数。

按n 的奇偶把x (n )分解为两个N /2点的子序列则x (n )的DFT 为因为所以其中X1(k )和X 2(k )分别为x 1(r )和x 2(r )的N/2点DFT 。

X (k )又可表示为12()(2)0112()(21)0112N x r x r r N x r x r r ==-=+=-,,,,,,,,/21/212(21)0/21/2122120()()()(2)(21)()()kn kn NNn n N N kr k r N N r r N N kr k kr NNNr r X k x n Wx n Wx r W x r W x r WWx r W==--+==--===+=++=+∑∑∑∑∑∑偶数奇数2π2πjj 222/2eekr kr kr kr N NNN WW--===/21/211/22/212()()() ()() 0,1,2,,-1 N N kr r kr N NN r r k N X k x r WWx r W X k W X k k N --===+=+=∑∑1210)()()(21-=+=N k k X W k X k X kN ,,,,这样,就将N 点DFT 分解为两个N /2点DFT 的运算了。

与第一次分解相同,将x 1(r )和x 2(r )还可以继续分解为两个N /4点DFT 的运算。

依次类推,经过M 次分解,最后将N 点DFT 分解成N 个1点DFT 和M 级蝶形运算,而1点DFT 就是时域序列本身。

仔细观察上图,还可以归纳出一些对编程有用的运算规律:第L 级中,每个蝶形的两个输入数据相距B =2L -1个点;每级有B 个不同的旋转因子;同一旋转因子对应着间隔为2L 点的2M -L 个蝶形。

总结上述运算规律,便可采用下述运算方法。

实验二 FFT算法程序的编制

实验二 FFT算法程序的编制

实验二FFT算法程序的编制实验目的:通过编写FFT快速算法程序,弄清楚快速算法原理。

实验任务:1.用C或者matlab编写基2 FFT快速算法,输入点数是2的幂次方,序列视作既包含实部也包含虚部。

要求一个函数计可以做正变换,也可以做反变换。

2.编写输入序列,先进行正反向变换,得到离散频谱,再将离散频谱加载到输入端进行验证,从输出端获取序列,和原来的序列进行比较,看看是否相等。

序列可随意设为2的幂次项!实验报告要求:1.正反向变换有什么不同,在程序中如何体现这一部分。

2.一个完整的计算过程有多少个基本蝶形运算?3.程序中有哪些地方可以使用一些方法,进一步减少计算量?如果使用C语言,编写程序X(k)=X(k)+X(k+B)W需要多少个乘法和加法?实现pN4.如果在DSP,ARM,单片机等处理器上实现1024点的FFT计算,输入为1024点实数,这些处理器的开发环境提供了数学函数库,可以计算正余弦表,假设一个正弦值占用4个字节,每次乘,加的结果也各占4个字节,考虑原位计算,使用C语言编程一共需要多少存储器才能计算?提示:1.matlab函数形式如下:function XK=myFFT(xn,N,dir)function 说明定义的是一个函数,XK是返回值,在我们基2快速算法中,返回的是变换后的实部和虚部,因为MATLAB是定义在复数域上,所以这样做是可以的,但是在C语言是要分开处理的。

xn是输入序列,长度不需要我们定义(在本算法中,实际上长度为N)。

myFFT就是我们定义的函数,函数要单独存在名为myFFT.m的文件中,必须的!N是点数,dir是方向,可以设成时域—>频域用dir=1,相反,则用dir=-1,内部设一个变量:wN=dir*2*pi/N;2.在上面的函数定义之后,直接书写语句,函数没有明显的结束标记,可以通过return;语句说明退出函数。

如:function [rK,iK]=myFFT(xrk,xik,N,dir)rK=zeros(1,N);iK=zeros(1,N);if length(xrk)~=length(xik)return;endreturn; %这条语句说明函数结束。

实验二FFT频谱分析及应用

实验二FFT频谱分析及应用

实验二:FFT频谱分析及应用一、实验内容(1)模拟信号x=2*sin(4*pi*t)+5*cos(8*pi*t);以t=0.01*n进行采样,求出N=40点FFT的幅度频谱,提高到N=128,再求该信号的幅度频谱;(2)一个连续信号含三个频谱分量,经采样得到以下序列x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);k=0:N/2;w=2*pi/N*k,分别求N=64,N=128时其频谱特性。

二、实验代码代码一:模拟信号x=2*sin(4*pi*t)+5*cos(8*pi*t);以t=0.01*n进行采样,求出N=40点FFT的幅度频谱clc;N=40;n=0:N-1;t=0.01*n;x=2*sin(4*pi*t)+5*cos(8*pi*t);k=0:N/2;w=2*pi/N*k;X=fft(x,N);magX=abs(X(1:N/2+1));subplot(2,1,1);stem(n,x,'.');title('single x(n)');subplot(2,1,2);plot(w/pi,magX);title('FFT N=40');xlabel('f (unit:pi)');ylabel('|X|');grid代码二:模拟信号x=2*sin(4*pi*t)+5*cos(8*pi*t);以t=0.01*n进行采样,N=128点FFT的幅度频谱:N=128;n=0:N-1;t=0.01*n;x=2*sin(4*pi*t)+5*cos(8*pi*t);k=0:N/2;w=2*pi/N*k;X=fft(x,N);magX=abs(X(1:N/2+1));subplot(2,1,1);stem(n,x,'.');title('single x(n)');subplot(2,1,2);plot(w/pi,magX);title('FFT N=128');xlabel('f (unit:pi)');ylabel('|X|');grid代码三:一个连续信号含三个频谱分量,经采样得到以下序列x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);k=0:N/2;w=2*pi/N*k,N=64时其频谱特性clc;N=64;n=0:N-1;df=1/16;x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n); k=0:N/2;w=2*pi/N*k;X=fft(x,N);magX=abs(X(1:N/2+1));subplot(2,1,1);stem(n,x,'.');title('single x(n)');subplot(2,1,2);plot(w/pi,magX);title('FFT N=64');xlabel('f (unit:pi)');ylabel('|X|');gridclc;N=64;n=0:N-1;df=1/64;x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n); k=0:N/2;w=2*pi/N*k;X=fft(x,N);magX=abs(X(1:N/2+1));subplot(2,1,1);stem(n,x,'.');title('single x(n)');subplot(2,1,2);plot(w/pi,magX);title('FFT N=64');xlabel('f (unit:pi)');ylabel('|X|');grid代码四:一个连续信号含三个频谱分量,经采样得到以下序列x=sin(2*pi*0.15*n)+cos(2*pi*(0.15+df)*n)+cos(2*pi*(0.15+2*df)*n);k=0:N/2;w=2*pi/N*k,N=128时其频谱特性。

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

电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:一、实验室名称:数字信号处理实验室 二、实验项目名称:FFT 的实现 三、实验原理:一.FFT 算法思想:1.DFT 的定义:对于有限长离散数字信号{x[n]},0 ≤ n ≤ N-1,其离散谱{x[k]}可以由离散付氏变换(DFT )求得。

DFT 的定义为:21[][]N jnk Nn X k x n eπ--==∑,k=0,1,…N-1通常令2jNN eW π-=,称为旋转因子。

2.直接计算DFT 的问题及FFT 的基本思想:由DFT 的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次加法。

因此,对于一些相当大的N 值(如1024)来说,直接计算它的DFT 所作的计算量是很大的。

FFT 的基本思想在于,将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。

例如,若N 为偶数,将原有的N 点序列分成两个(N/2)点序列,那么计算N 点DFT 将只需要约[(N/2)2 ·2]=N 2/2次复数乘法。

即比直接计算少作一半乘法。

因子(N/2)2表示直接计算(N/2)点DFT 所需要的乘法次数,而乘数2代表必须完成两个DFT 。

上述处理方法可以反复使用,即(N/2)点的DFT 计算也可以化成两个(N/4)点的DFT (假定N/2为偶数),从而又少作一半的乘法。

这样一级一级的划分下去一直到最后就划分成两点的FFT 运算的情况。

3.基2按时间抽取(DIT )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。

将长度为2L N =的序列[](0,1,...,1)x n n N =-,先按n 的奇偶分成两组:12[2][][21][]x r x r x r x r =+=,r=0,1,…,N/2-1DFT 化为:1/21/212(21)0/21/21221200/21/211/22/2[]{[]}[][2][21][][][][]N N N nk rk r kNNNn r r N N rk k rkNNNr r N N rk k rkN NN r r X k DFT x n x n Wx r Wx r W x r W Wx r W x r WWx r W ---+===--==--=====++=+=+∑∑∑∑∑∑∑上式中利用了旋转因子的可约性,即:2/2rkrkNN W W =。

又令/21/2111/222/2[][],[][]N NrkrkNN r r X k x r WX k x r W--====∑∑,则上式可以写成: 12[][][]kN X k X k W X k =+(k=0,1,…,N/2-1)可以看出,12[],[]X k X k 分别为从[]X k 中取出的N/2点偶数点和奇数点序列的N/2点DFT 值,所以,一个N 点序列的DFT 可以用两个N/2点序列的DFT 组合而成。

但是,从上式可以看出,这样的组合仅表示出了[]X k 前N/2点的DFT 值,还需要继续利用12[],[]X k X k 表示[]X k 的后半段本算法推导才完整。

利用旋转因子的周期性,有:(/2)/2/2rkr k N N N W W +=,则后半段的DFT 值表达式:/21/21()211/21/2100[][][][]2N N N r k rk N N r r N X k x r W x r W X k --+==+===∑∑,同样,22[][]2N X k X k += (k=0,1,…,N/2-1),所以后半段(k=N/2,…,N-1)的DFT 值可以用前半段k 值表达式获得,中间还利用到()22NNk k k NNW W W W +==-,得到后半段的[]X k 值表达式为:12[][][]kN X k X k W X k =-(k=0,1,…,N/2-1)。

这样,通过计算两个N/2点序列12[],[]x n x n 的N/2点DFT 12[],[]X k X k ,可以组合得到N 点序列的DFT 值[]X k ,其组合过程如下图所示:1[]X k 12[][]kN X k W X k +2[]X k nkN W -1 12[][]k N X k W X k -比如,一个N = 8点的FFT 运算按照这种方法来计算FFT 可以用下面的流程图来表示:x(0)x(1)x(2)x(3)x(4)x(5)x(6)x(7)X(7)X(6)X(5)X(4)X(3)X(2)X(1)X(0)4.基2按频率抽取(DIF )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。

在把[]X k 按k 的奇偶分组之前,把输入按n 的顺序分成前后两半:1/211/2/21/21()200/212[]{[]}[][][][][]2[[][]],0,1,...,12N N N nknk nkNNN n n n N N N N n k nk N Nn n N N k nk N N n X k DFT x n x n Wx n Wx n W N x n W x n W N x n x n W W k N ---===--+==-====+=++=++=-∑∑∑∑∑∑因为21N NW=-,则有2(1)N k k NW=-,所以:/21[][[](1)[]],0,1,...,12N knkN n N X k x n x n W k N -===+-+=-∑按k 的奇偶来讨论,k 为偶数时:/2120[2][[][]],0,1,...,12N rn N n N X r x n x n W k N -==++=-∑k 为奇数时:/21(21)0[21][[][]],0,1,...,12N r nN n N X r x n x n W k N -+=+=-+=-∑前面已经推导过2/2rkrk NN W W =,所以上面的两个等式可以写为:/21/20[2][[][]],0,1,...,/212N rnN n N X r x n x n W r N -==++=-∑/21/20[21]{[[][]]},0,1,...,/212N n nr N N n N X r x n x n W W r N -=+=-+=-∑ 通过上面的推导,[]X k 的偶数点值[2]X r 和奇数点值[21]X r +分别可以由组合而成的N/2点的序列来求得,其中偶数点值[2]X r 为输入x[n]的前半段和后半段之和序列的N/2点DFT 值,奇数点值[21]X r +为输入x[n]的前半段和后半段之差再与nN W 相乘序列的N/2点DFT 值。

令1[][][]2N x n x n x n =++,2[][[][]]2nN N x n x n x n W =-+,则有:/21/211/22/20[2][],[21][],0,1,...,12N N rnrnN N n n NX r x n WX r x n W r --===+==-∑∑这样,也可以用两个N/2点DFT 来组合成一个N 点DFT ,组合过程如下图所示:[]x n [][]2Nx n x n ++[]2N x n + -1 n N W [[][]]2nN N x n x n W -+二.在FFT 计算中使用到的MATLAB 命令:函数fft(x)可以计算R 点序列的R 点DFT 值;而fft(x,N)则计算R 点序列的N 点DFT ,若R>N ,则直接截取R 点DFT 的前N 点,若R<N ,则x 先进行补零扩展为N 点序列再求N 点DFT 。

函数ifft(X)可以计算R 点的谱序列的R 点IDFT 值;而ifft(X,N)同fft(x,N)的情况。

四、实验目的:离散傅氏变换(DFT )的目的是把信号由时域变换到频域,从而可以在频域分析处理信息,得到的结果再由逆DFT 变换到时域。

FFT 是DFT 的一种快速算法。

在数字信号处理系统中,FFT 作为一个非常重要的工具经常使用,甚至成为DSP 运算能力的一个考核因素。

本实验通过直接计算DFT ,利用FFT 算法思想计算DFT ,以及使用MATLAB 函数中的FFT 命令计算离散时间信号的频谱,以加深对离散信号的DFT 变换及FFT 算法的理解。

五、实验内容:a) 计算实数序列5()cos,025616x n n n π=≤≤的256点DFT 。

b) 计算周期为1kHz 的方波序列(占空比为50%,幅度取为+/-512,采样频率为25kHz ,取256点长度) 256点DFT 。

六、实验器材(设备、元器件):安装MATLAB 软件的PC 机一台,DSP 实验演示系统一套。

七、实验步骤:(1) 先利用DFT 定义式,编程直接计算2个要求序列的DFT 值。

(2) 利用MATLAB 中提供的FFT 函数,计算2个要求序列的DFT 值。

(3) (拓展要求)不改变序列的点数,仅改变DFT 计算点数(如变为计算1024点DFT 值),观察画出来的频谱与前面频谱的差别,并解释这种差别。

通过这一步骤的分析,理解频谱分辨力的概念,解释如何提高频谱分辨力。

(4) 利用FFT 的基本思想(基2-DIT 或基2-DIF ),自己编写FFT 计算函数,并用该函数计算要求序列的DFT 值。

并对前面3个结果进行对比。

(5) (拓展要求)尝试对其他快速傅立叶变换算法(如Goertzel 算法)进行MATLAB 编程实现,并用它来计算要求的序列的DFT 值。

并与前面的结果进行对比。

(6) (拓展要求)在提供的DSP 实验板上演示要求的2种序列的FFT算法(基2-DIT ),用示波器观察实际计算出来的频谱结果,并与理论结果对比。

八、实验数据及结果分析:注:本次实验在寝室电脑上完成,所用MATLAB版本为MATLAB R2010b 程序:(2)对要求的2种序列进行基2-DIT和基2-DIF FFT算法程序序列生成的代码同(1)。

这里给出FFT算法的程序:(3)对要求的2种序列用MATLAB中提供的FFT函数进行计算的程结果:(1)对2种要求的序列直接进行DFT计算的频域波形50100150200250300-1-0.500.51Time index nA m p l i t u d e Sinusoidal, time-domain sequenceFrequency index kM a g n i t u d eMagnitude of DFT samples(direct method)050100150200250300-1000-50005001000Time index nA m p l i t u d ePeriodic square wave, time-domain sequence4Frequency index kM a g n i t u d eMagnitude of DFT samples(direct method)(2) 对2种要求的序列进行基2-DIT 和基2-DIF FFT 算法频域波形(3) 对2种要求的序列用MATLAB 中提供的FFT 函数计算的频域波形。

相关文档
最新文档