北京理工大学数字信号处理实验一 基2-FFT算法的实现

合集下载

数字信号处理实验报告-FFT算法的MATLAB实现

数字信号处理实验报告-FFT算法的MATLAB实现

数字信号处理 实验报告实验二:FFT 算法的MATLAB 实现一、实验目的通过本实验的学习,掌握离散傅立叶变换的理论,特别是FFT 的基本算法以及其在在数字信号处理中的应用。

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

题二:一被噪声污染的信号,很难看出它所包含的频率分量,如一个由50Hz 和120Hz 正弦信号构成的信号,受均值随机噪声的干扰,数据采样率为1000Hz ,对这污染信号进行傅立叶变换,以检查所包含的频率分量题三:调用原始语音信号mtlb ,对其进行FFT 变换后去掉幅值小于1的FFT 变换值,最后重构语音信号。

(要求有四幅语音信号的频谱图在同一图形窗口以便比较:分别是1、原始语音信号;2、FFT 变换;3去掉幅值小于1的FFT 变换值;4、重构语音信号)三、实验原理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 x2、基2的FFT 算法四、实验条件(1)微机(2)MATLAB 编程工具五、用matlab 程序实现:实验一: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');实验二clc;fs=1000;N=1024;n=0:N-1;t=n/fs;x=sin(2*pi*50*t)+sin(2*pi*120*t)+rand(1,N);y=fft(x,N);mag=abs(y);f=n*fs/N;subplot(1,2,1),plot(f,mag);xlabel('频率/Hz');ylabel('振幅');title('N=1024');subplot(1,2,2),plot(f(1:N/2),mag(1:N/2)); xlabel('频率/Hz');ylabel('振幅');title('N=1024');实验三:clc;load mtlbN=1500;subplot(2,2,1)plot([1:N],mtlb(1:N));title('原始语音信号');y=fft(mtlb(1:N));subplot(2,2,2)plot([1:N],y);title('原始语音信号FFT变换');y(y<1)=0;subplot(2,2,3)plot([1:N],y);title('去掉幅值小于1的FFT变换值');subplot(2,2,4)plot([1:N],ifft(y));title('重构语音信号');六、实验心得:(1)通过这次实验,掌握离散傅立叶变换的理论,特别是FFT的基本算法以及其在在数字信号处理中的应用。

实验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 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/2rkrk NN W W =。

实验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计算线性卷积一、实验目的1.掌握利用FFT计算线性卷积的原理及具体实现方法。

2.加深理解重叠相加法和重叠保留法。

3.考察利用FFT计算线性卷积各种方法的适用范围。

二、实验设备与环境计算机、MATLAB软件环境三、实验基础理论1.线性卷积与圆周卷积设为L点序列,为M点序列,和的线性卷积为的长度为L+M-1。

和的N点圆周卷积为圆周卷积与线性卷积相等而不产生交叠的必要条件为圆周卷积定理:根据DFT的性质,和的N点圆周卷积的DFT等于它们DFT的乘积2.快速卷积快速卷积算法用圆周卷积实现线性卷积,根据圆周卷积定理利用FFT算法实现圆周卷积。

可以将快速卷积的步骤归纳如下:(1)为了使线性卷积可以利用圆周卷积来计算,必须选择;同时为了能使用基2-FFT 完成卷积运算,要求N =。

采用补零的办法是和的长度均为N 。

(2)计算和的N 点FFTFFT −−−→(3)组成卷积(4)利用IFFT 计算IDFT ,得到线性卷积(k)()IFFT Y y n −−−→3.分段卷积我们考察单位取样响应为的线性系统,输入为,输出为,则当输入序列时再开始进行卷积,会使输出相对输入有较大的延时,再者如果序列太长,需要大量的存储单元。

为此,我们把,分别求出每段的卷积,合在一起其到最后的总输出。

这种方法称为分段卷积。

分段卷积可细分为重叠相加法和重叠保留法。

重叠保留法:设的长度为,的长度为M 。

我们把序列分成多段N 点序列,每段与前一段重叠M-1个样本。

由于第一段没有前一段保留信号,为了修正,我们在第一个输入段前面填充M-1个零。

计算每一段的圆周卷积,则其每段卷积结果的前M-1个样本不等于线性卷积值,不是正确的样本值。

所以我们将每段卷积结果的前M-1个样本舍去,只保留后面的N-M+1个正确输出样本,把这些输出样本合起来得到总的输出。

利用FFT 实现重叠保留法的步骤如下:(1)在前面填充M-1个零,扩大以后的序列为1ˆ(){0,0,0,()}M x n x n -=个(2)将分为若干N 点子段,设L=N-M+1为每一段的有效数据长度,则第i 段〖ˆ(m)x1,0,01iL m iL N i n N ≤≤+-≥≤≤- (3)计算每一段与的N 点圆周卷积,利用FFT 计算圆周卷积:FFT−−−→(k)()IFFT i i Y y n −−−→(4)舍去每一段卷积结果的前M-1个样本,连接剩下样本,得到卷积结果。

按时间抽取的基2FFT算法分析及MATLAB实现

按时间抽取的基2FFT算法分析及MATLAB实现

按时间抽取的基2FFT算法分析及MATLAB实现基2FFT算法是一种快速傅里叶变换(Fast Fourier Transform,FFT)的算法,在信号处理、图像处理等领域有着广泛的应用。

该算法通过将N个输入值分解成两个长度为N/2的DFT(离散傅里叶变换)来实现快速的计算。

本文将对基2FFT算法进行分析,并给出MATLAB实现。

基2FFT算法的主要思路是将输入序列分解成奇偶两个子序列,然后分别对这两个子序列进行计算。

具体步骤如下:1.将输入序列拆分成奇数位和偶数位两个子序列。

比如序列x[0],x[1],x[2],x[3]可以拆分成x[0],x[2]和x[1],x[3]两个子序列。

2. 对两个子序列分别进行DFT计算。

DFT的定义为:X[k] = Σ(x[n] * exp(-i * 2π * k * n / N)),其中k为频率的索引,N为序列长度。

3.对得到的两个DFT结果分别进行合并。

将奇数位子序列的DFT结果和偶数位子序列的DFT结果合并成一个长度为N的DFT结果。

4.重复以上步骤,直到计算结束。

基2FFT算法的时间复杂度为O(NlogN),远远小于直接计算DFT的时间复杂度O(N^2)。

这是因为基2FFT算法将问题的规模逐步减半,从而实现了快速的计算。

下面是MATLAB中基2FFT算法的简单实现:```matlabfunction X = myFFT(x)N = length(x);if N == 1X=x;%递归结束条件return;endeven = myFFT(x(1:2:N)); % 偶数位子序列的FFT计算odd = myFFT(x(2:2:N)); % 奇数位子序列的FFT计算W = exp(-1i * 2 * pi / N * (0:N/2-1)); % 蝶形因子temp = W .* odd; % 奇数位子序列的DFT结果乘以蝶形因子X = [even + temp, even - temp]; % 合并得到一个长度为N的DFT结果end```上述代码中,函数myFFT为基2FFT算法的MATLAB实现。

基2fft算法

基2fft算法

基2fft算法基2fft算法是离散傅里叶变换的一种实现方式。

离散傅里叶变换在数字信号处理中应用广泛,可以将一个信号从时域转换到频域,方便对信号进行各种分析和处理。

基2fft算法通过快速傅里叶变换的方式,实现了对离散信号的快速变换。

基2fft算法的核心思想是分治算法,即将一个大问题分解成多个子问题,然后分别解决,最终合并得到整个问题的解。

对于基于基2fft算法的离散傅里叶变换来说,它将一个长度为N的离散信号分成两半,然后对每一半进行离散傅里叶变换,再将结果通过一定的合并算法得到整个信号的变换结果。

具体来说,基2fft算法实现离散傅里叶变换的过程分为以下几个步骤:1.将输入的离散信号分成两半,每一半作为一个子问题进行处理。

2.对每一个子问题递归地应用基2fft算法,将其分成两半,直到问题规模为1,此时变换结果就是其自身。

3.将每个子问题的变换结果合并起来得到整个信号的变换结果。

合并的方式根据具体实现有所不同,但通常都是利用旋转因子和蝴蝶操作将前一半和后一半的变换结果组合起来。

基2fft算法的主要优点是运算速度快,复杂度为O(NlogN)。

这意味着对于比较大的信号,基2fft算法比暴力算法要快很多。

此外,基2fft算法还具有灵活性和扩展性,可以通过调整参数来实现不同的变换需求。

然而,基2fft算法也有一些限制和缺点。

首先,基2fft算法要求信号的长度是2的幂次方,这在某些情况下可能不太方便。

其次,由于涉及到递归和分治操作,基2fft算法的实现和调试可能比较困难。

最后,如果信号的长度较小,基2fft算法可能比暴力算法更慢,因为其内部有一些额外的操作会增加运行时间。

总之,基2fft算法是一种非常重要的数字信号处理算法,它通过分治和合并的方式实现了对离散信号的快速变换。

尽管基2fft算法有一些限制和缺点,但在实际应用中,它仍然是一个非常有用的工具,可以帮助我们更好地分析和处理数字信号。

实验2-matlab中基2-DIT-FFT的实现

实验2-matlab中基2-DIT-FFT的实现

电 子 科 技 大 学实 验 报 告学生姓名: 学 号:2010013080 指导教师一、实验室名称:数字信号处理实验室 二、实验项目名称: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 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/2rkrkNN W W =。

北京理工大学 数字信号处理 实验报告 程序

北京理工大学 数字信号处理 实验报告 程序

数字信号处理实验报告1.深入掌握应用DFT分析信号的频谱的理论方法,针对该问题进行一次全面综合练习,完成一个完整的信号分析软件实现方法和流程,这种全面完整的综合练习可以帮助学生深入理解和消化基本理论,锻炼学生独立解决问题的能力,培养学生的创新意识,为今后的科研和工作打下良好的实践基础。

2.综合利用数字信号处理的理论知识完成数字滤波器的设计与实现,完成一个完整的数字滤波器设计软件的实现方法和流程。

这种全面完整的综合练习可以帮助学生深入理解和消化基本理论,锻炼学生独立解决问题的能力,培养学生的创新意识,为今后的科研和工作打下良好的实践基础。

二、实验设备与环境计算机、MATLAB软件环境三、实验内容1.基于Matlab GUI的离散傅里叶变换分析2.基于Matlab GUI的数字滤波器分析设计1.基于Matlab GUI的离散傅里叶变换分析信号: t=1:100;x=2*sin(t/25*2*pi)+5*sin(t/5*2*pi);说明:输入信号从Matlab Command Windows中生成,通过变量名导入本软件,并可输出DFT变换后的结果,默认名为DFT_输入变量名。

2.基于Matlab GUI的数字滤波器分析设计IIR 低通:(巴特沃兹)IIR高通:(切比雪夫I)IIR带通:(切比雪夫II)IIR带阻:(椭圆滤波器)FIR低通:(矩形窗)FIR高通:(汉宁窗)FIR带通:(布莱克曼窗)FIR带阻:(凯瑟窗)五、程序界面设计及程序源代码1.基于Matlab GUI的离散傅里叶变换分析界面设计:程序代码:function varargout =SignalDFTSoftware(varargin)% SIGNALDFTSOFTWARE MATLAB code for SignalDFTSoftware.fig% SIGNALDFTSOFTWARE, by itself, creates a new SIGNALDFTSOFTWARE or raises the existing% singleton*.%% H = SIGNALDFTSOFTWARE returns the handle to a new SIGNALDFTSOFTWARE or the handle to% the existing singleton*.%%SIGNALDFTSOFTWARE('CALLBACK',hObject,even tData,handles,...) calls the local% function named CALLBACK in SIGNALDFTSOFTWARE.M with the given input arguments.%%SIGNALDFTSOFTWARE('Property','Value',...) creates a new SIGNALDFTSOFTWARE or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before SignalDFTSoftware_OpeningFcn gets called.An% unrecognized property name or invalid value makes property application% stop. All inputs are passed to SignalDFTSoftware_OpeningFcn via varargin. %% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one% instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help SignalDFTSoftware% Last Modified by GUIDE v2.5 26-Nov-2011 12:55:11% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name',mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn',@SignalDFTSoftware_OpeningFcn, ...'gui_OutputFcn',@SignalDFTSoftware_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin&&ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1}); endif nargout[varargout{1:nargout}] =gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before SignalDFTSoftware is made visible.function SignalDFTSoftware_OpeningFcn(hObjec t, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% varargin command line arguments to SignalDFTSoftware (see VARARGIN)% Choose default command line output for SignalDFTSoftwarehandles.output = hObject;% Update handles structure guidata(hObject, handles);% UIWAIT makes SignalDFTSoftware wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.function varargout =SignalDFTSoftware_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% Get default command line output from handles structurevarargout{1} = handles.output;% --- If Enable == 'on', executes on mouse press in 5 pixel border.% --- Otherwise, executes on mouse press in 5 pixel border or over random.function random_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to random (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% --- Executes on button press in random. function random_Callback(hObject, eventdata, handles)% hObject handle to random (see GCBO)% eventdata reserved - to be defined in a future version of MATLABglobal x;global x_flag;x=rand(1,50)*20-10;x_flag=1;if(x_flag)plot(handles.TD,0:(length(x)-1),x);end% --- Executes on button press in Delete.function Delete_Callback(hObject, eventdata, handles)% hObject handle to Delete (see GCBO)% eventdata reserved - to be defined in a future version of MATLABglobal x;global X;global x_flag;global X_flag;x=0;X=0;x_flag=0;X_flag=0;plot(handles.TD,0,0);plot(handles.FD,0,0);% --- If Enable == 'on', executes on mouse press in 5 pixel border.% --- Otherwise, executes on mouse press in 5 pixel border or over Delete.function Delete_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to Delete (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% --- If Enable == 'on', executes on mouse press in 5 pixel border.% --- Otherwise, executes on mouse press in 5 pixel border or over Analyse.function Analyse_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to Analyse (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% --- Executes on button press in Analyse. function Analyse_Callback(hObject, eventdata, handles)% hObject handle to Analyse (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB global x;global X;global x_flag;global X_flag;if(x_flag)X=fft(x);X_flag=1;endif(X_flag)stem(handles.FD,linspace(0,2*pi,length(X)),abs( X));xlim(handles.FD,[0,2*pi])end% --- Executes on button press in Export. function Export_Callback(hObject, eventdata, handles)% hObject handle to Export (see GCBO)% eventdata reserved - to be defined in a future version of MATLABglobal X;global X_flag;if(X_flag)assignin('base',get(handles.edit4,'String'),X); end% --- Executes during object creation, after setting all properties.function text1_CreateFcn(hObject, eventdata, handles)% hObject handle to text1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns calledglobal x_flag;global X_flag;global x;global X;x_flag=0;X_flag=0;x=0;X=0;function name_Callback(hObject, eventdata, handles)% hObject handle to name (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% Hints: get(hObject,'String') returns contents of name as text% str2double(get(hObject,'String')) returns contents of name as a double% --- Executes during object creation, after setting all properties.function name_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end% --- Executes on button press in import. function import_Callback(hObject, eventdata, handles)global x;global x_flag;global signal_name;signal_name=get(,'String');x='empty';set(,'String','Notexist,Retry!');x=evalin('base',signal_name);set(,'String','Succeed');x_flag=1;if(x_flag)plot(handles.TD,0:(length(x)-1),x);endset(handles.edit4,'String',strcat('DFT_',signal_na me));function edit4_Callback(hObject, eventdata, handles)function edit4_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endglobal signal_name;2.基于Matlab GUI的数字滤波器分析设计界面设计:程序设计:function varargout = filter(varargin)%EDIT By Yu Yizhe%V1.0%2011/11/20%all right reserve% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @filter_OpeningFcn, ...'gui_OutputFcn', @filter_OutputFcn, ...'gui_LayoutFcn', [], ...'gui_Callback', []);if nargin&&ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1}); endif nargout[varargout{1:nargout}] =gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before filter is made visible. function filter_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% varargin unrecognizedPropertyName/PropertyValue pairs from the% command line (see VARARGIN)% Choose default command line output for filter handles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes filter wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned tothe command line.function varargout = filter_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% Get default command line output from handles structurevarargout{1} = handles.output;function text1_CreateFcn(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;ch1=1;ch2=1;ch31=1;ch32=1;function IIRtype_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;ch31=get(hObject,'Value');function IIRtype_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction e11_Callback(hObject, eventdata, handles)function e11_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e12_Callback(hObject, eventdata, handles)function e12_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e21_Callback(hObject, eventdata, handles)function e21_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e22_Callback(hObject, eventdata, handles)function e22_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e31_Callback(hObject, eventdata, handles)function e31_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e32_Callback(hObject, eventdata, handles)function e32_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e41_Callback(hObject, eventdata, handles)function e41_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction e42_Callback(hObject, eventdata, handles)function e42_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction generate_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;global typech;global w1p;global w1s;global w2p;global w2s;global rp;global rs;if ch1==1typech=ch1*100+ch2*10+ch31;elseif ch2==2typech=ch1*100+ch2*10+ch32;endw1p=str2num(get(handles.e11,'String'));w1s=str2num(get(handles.e12,'String'));w2p=str2num(get(handles.e21,'String'));w2s=str2num(get(handles.e22,'String'));rp=str2num(get(handles.e41,'String'));rs=str2num(get(handles.e42,'String')); Generate(handles);function FIRtype_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;ch32=get(hObject,'Value');function FIRtype_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction poptype_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;ch2=get(hObject,'Value');reprint(handles);function poptype_CreateFcn(hObject, eventdata, handles)if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); endfunction iirchoose_ButtonDownFcn(hObject, eventdata, handles)function firchoose_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;if(get(handles.firchoose,'Value')==0)set(handles.iirchoose,'Value',1);set(handles.FIRtype,'Visible','off');set(handles.IIRtype,'Visible','on');ch1=1;endif(get(handles.firchoose,'Value')==1)set(handles.iirchoose,'Value',0);set(handles.FIRtype,'Visible','on');set(handles.IIRtype,'Visible','off');ch1=2;endreprint(handles);function firchoose_ButtonDownFcn(hObject, eventdata, handles)function iirchoose_Callback(hObject, eventdata, handles)global ch1;global ch2;global ch31;global ch32;if(get(handles.iirchoose,'Value')==0)set(handles.firchoose,'Value',1);set(handles.FIRtype,'Visible','on');set(handles.IIRtype,'Visible','off');ch1=2;endif(get(handles.iirchoose,'Value')==1)set(handles.firchoose,'Value',0);set(handles.FIRtype,'Visible','off');set(handles.IIRtype,'Visible','on');ch1=1;endreprint(handles);function reprint(handles)global ch1;global ch2;global ch31;global ch32;temp=ch1*10+ch2;tempswitch tempcase {11,12}set(handles.add1,'Visible','off');set(handles.add2,'Visible','off');set(handles.e21,'Visible','off');set(handles.e22,'Visible','off');set(handles.pr,'Visible','on'); case{13,14}set(handles.add1,'Visible','on');set(handles.add2,'Visible','on');set(handles.e21,'Visible','on');set(handles.e22,'Visible','on');set(handles.pr,'Visible','on'); case{21,22},set(handles.add1,'Visible','off');set(handles.add2,'Visible','off');set(handles.e21,'Visible','off');set(handles.e22,'Visible','off');case{23,24},set(handles.add1,'Visible','on');set(handles.add2,'Visible','on');set(handles.e21,'Visible','on');set(handles.e22,'Visible','on');otherwisefprintf('switch error\n');endfunction Generate(handles)global ch1;global ch2;global ch31;global ch32;global typech;global w1p;global w1s;global w2p;global w2s;global rp;global rs;N=0;Wn=0;Wp=0;Wst=0;Rp=0;As=0;ftype='a';b=0;a=0;switch ch2case 1,ftype='low';case 2,ftype='high';case 3,ftype='bandpass';case 4,ftype='stop';endswitch ch2case {1,2}Wp=w1p;Wst=w1s;Rp=rp;As=rs;case {3,4}Wp=[w2p w1p];Wst=[w2s w1s];Rp=rp;As=rs;endswitch ch1 %IIR case 1,switch ch31case 1,[N,Wn]=buttord(Wp,Wst,Rp,As);[b,a]=butter(N,Wn,ftype); case 2,[N,Wn]=cheb1ord(Wp,Wst,Rp,As);[b,a]=cheby1(N,Rp,Wn,ftype);case 3,[N,Wn]=cheb2ord(Wp,Wst,Rp,As);[b,a]=cheby2(N,As,Wn,ftype); case 4,[N,Wn]=ellipord(Wp,Wst,Rp,As);[b,a]=ellip(N,Rp,As,Wn,ftype);endprint4(a,b,handles);case 2 %FIR tranbw=0;N=0;hw=0;Wn=(Wp+Wst)/2;switch ch32case 1, %Rectangular tranbw=1.8;N=ceil(tranbw/abs(w1s-w1p))+1;hw=boxcar(N);case 2, %Hanning tranbw=6.2;N=ceil(tranbw/abs(w1s-w1p))+1;hw=hanning(N);case 3, %Hamming tranbw=6.6;N=ceil(tranbw/abs(w1s-w1p))+1;hw=hamming(N);case 4, %Blackman tranbw=11;N=ceil(tranbw/abs(w1s-w1p))+1;hw=blackman(N);case 5, %KaiserN=(rs-7.95)/2.285/abs(w1s-w1p)+1;N=ceil(N);if (rs>=50)BTA=0.1102*(rs-8.7); elseif(rs>21)BTA=0.5842*(rs-21)^0.4+0.07886*(rs-21);elseBTA=0.5;endhw=kaiser(N,BTA);endh=fir1(N-1,Wn,ftype,hw');print4(h,N,handles);endfunction print4(a,b,handles)global ch1;if(ch1==1) %IIRw=[0:500]*pi/500;axes(handles.axes1);H=freqz(b,a,w);plot(handles.axes1,w/pi,abs(H)); xlabel('\Omega(\pi)');ylabel('|H(j\Omega)|');%axis ([0,0.5,0,1]);axes(handles.axes2);plot(handles.axes2,w/pi,20*log10((abs(H))/max(a bs(H))));xlabel('\Omega(\pi)');ylabel('|H(j\Omega)|,dB');% axis([0,0.5,-30,0]);axes(handles.axes3);plot(handles.axes3,w/pi,angle(H)/pi); xlabel('\Omega(\pi)');ylabel('Phase of H(j\Omega)(\pi)');%axis([0,0.5,-1,1]);t=0:30;axes(handles.axes4);h=impulse(b,a,t);stem(handles.axes4,t,h);xlabel('n');ylabel('Impulse Response');elseif(ch1==2) %FI RN=b;h=a;[H,w]=freqz(h,1);axes(handles.axes1);plot(handles.axes1,w/pi,abs(H)); xlabel('\Omega(\pi)');ylabel('|H(j\Omega)|');%axis ([0,0.5,0,1]);axes(handles.axes2);plot(handles.axes2,w/pi,20*log10((abs(H))/max(a bs(H))));xlabel('\Omega(\pi)');ylabel('|H(j\Omega)|,dB');% axis([0,0.5,-30,0]);axes(handles.axes3);plot(handles.axes3,w/pi,angle(H)/pi); xlabel('\Omega(\pi)');ylabel('Phase ofH(j\Omega)(\pi)');%axis([0,0.5,-1,1]);t=0:N-1;axes(handles.axes4);stem(handles.axes4,t,h);xlabel('n');ylabel('Impulse Response');end六、实验总结这次的数字信号处理实验非常有意义,让我学会了用计算机进行数字信号处理,计算各种参数,绘制出信号的波形,频谱。

基-2FFT算法的软件实现

基-2FFT算法的软件实现
{
real=r;
img=0;
}
Plural()
{
real=0;
img=0;
}
friend Plural*fft(float X[],int n); //fft();
friend Plural operator *(Plural p1,Plural p2);//重载乘法运算符
friend Plural operator -(Plural p1,Plural p2);//重载减法运算符
总的复数加法次数为
(2.7)
(2.8)
N=8点DIT-FFT的运算流图如图2.3(a)所示。根据WkN/m=WkmN,将图2.3(a)转换成如图2.3(b)所示的标准形式的运算流图
图2.3N=8点DIT-FFT的运算流图
(2)算法效率
由图2.3可见,N=2M时,DIT-FFT运算流图由M级蝶形构成,每级有N/2个蝶形。因此,每级需要N/2次复数乘法运算和N次复数加法运算,M级形共需复数乘法次数CM(2)和复数加法次数CA(2)分别为
三、实验仪器
计算机
四、实验要求及内容
用所学过的编程语言,自行设计出一个按时间抽取的、输入倒位序、输出顺序的基-2 FFT算法程序。
五、实验报告
(1)简述实验目的及原理;
(2)画出程序流程框图;
(3)主要给出实验内容的程序(要求程序模块化并加注释)。
程序流程框图
实验的程序
#include<iostream.h>
图2.5形成例序的树状图(N=23)
形成倒序J后,将原存储器中存放的输入序列重新按倒序排列。设原输入序列x(n)先按自然顺序存入数组A中。例如,对N=8,A(0),A(1),A(2),…,A(7)中依次存放着x(0),x(1),…,x(7)。对x(n)的重新排序(倒序)规律如图2.6所示。

北理工数字信号处理实验一

北理工数字信号处理实验一

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

2、编程实现基2-FFT算法。

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

实验设备与环境
计算机、MATLAB软件环境
实验原理
FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform)。

FFT算法可分为按时间抽取算法和按频率抽取算法,先简要介绍FFT的基本原理。

从DFT运算开始,说明FFT的基本原理。

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

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

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

结果如下:
验证如下:
2.编程实现序列长度为N=8的按频率抽取的基2-FFT算法。

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

心得与体会
通过本次实验,我加深了对课堂上所学的FFT运算的理解,掌握了如何用matlab实现基2-FFT 算法。

过程中在编程上有一些不熟练,经过老师同学的帮助,最终得以完成。

北京理工大学数字信号处理实验报告

北京理工大学数字信号处理实验报告

本科实验报告实验名称: 数字信号处理实验实验1 利用DFT 分析信号频谱一、实验目的1.加深对DFT 原理的理解。

2.应用DFT 分析信号频谱。

3.深刻理解利用DFT 分析信号频谱的原理,分析现实过程现象及解决办法。

二、实验原理1、DFT 和DTFT 的关系有限长序列()x n 的离散时间傅里叶变换()j X e ω在频率区间(02)ωπ≤≤的N个等分点{(0),(1),(),(1)}x x x k x N-……上的N 个取样值可以由下式表示:2120()|()()01(21)N jkn j Nk k X e x n eX k k N πωωπ--====≤≤--∑由上式可知,序列()x n 的N 点DFT ()X k ,实际上就是()x n 序列的DTFT 在N 个等间隔频率点{(0),(1),(),(1)}X X X k X N -……上样本()X k 。

2、利用DFT 求DTFT方法1:由()X k 恢复出()j X eω的方法如图2.1所示:图 2.1.由 N 点DFT 恢复频谱DTFT 的流程由图2.1所示流程图可知:01()()()(22)j j nkn j n N n n k X e x n eX k W e N ωωω∞∞∞---=-∞=-∞=⎡⎤==-⎢⎥⎣⎦∑∑∑ 由式2-2可以得到12()()()(23)Nj k kx e X k N ωπφω==--∑其中()x φ为内插函数12sin()2()(24)sin()2N j N e N ωωφωω--=•-方法2:然而在实际MATLAB 计算中,上诉插值公式不见得是最好的方法。

由于DFT是DTFT 的取样值,其相邻的两个频率样本点的间距为2Nπ,所以如果我们增加数据的长度N ,使得得到的DFT 谱线就更加精细,其包络就越接近DTFT 的结果,这样可以利用DFT 来近似计算DTFT 。

如果没有更多的数据,可以通过补零来增加数据长度。

基-2FFT算法的软件实现

基-2FFT算法的软件实现

实验二 基-2FFT 算法的软件实现一、实验目的1、 加深对DFT 算法原理和基本性质的理解;2、 熟悉FFT 算法的流程;3、 了解FFT 算法的应用。

二、基本原理1、 DFT 算法原理 (见教材第三章)2、按时间抽取(DIT )的-2FFT 算法(1)算法原理序列x (n )的N (N =2-M )点DFT 为kn N N n N Wn x n x DFT k X ∑-===1)()]([)(点,k =0, 1, …, N -1 (2.1)将式(2.1)按n 的奇偶性分解为)12(12/212/)12()2()()()(+-=-===∑∑∑∑++=+=l k NN n l k NN n kn Nn kn Nn Wl x Wl x Wn x Wn x k X 奇数偶数奇数偶数(2.2)令)2()(1l x l x =, )12()(2+=l x l x ,因为klN lk NW W 2/2=, 所以式(2.2)可写成)12(2/122/12/012)()()(+--=-=∑∑+=l k N M n k NklN N l Wl x WWl x k X 奇数(2.3)式(2.3)说明,按n 的奇偶性将x (n )分解为两个N /2长的序列x 1(l )和x 2(l ),则N 点DFT 可分解为两个N /2点DFT 来计算。

用X 1(k )和X 2(k )分别表示12,...,1,0 )()]([)(12/02/12/11-===∑-=Nk Wl x l x DFT k X N l kl N N 点 (2.4) 12,...,1,0 )()]([)(12/02/22/22-===∑-=Nk W l x l x DFT k X N l kl N N 点 (2.5)将(2.4)式和(2.5)式代入(2.31)式,并利用kN Nk N W W -=+2和X 1(k )、 X 2(k )的隐含周期性可得到:12,...1,0)()()2()()()(2121-=⎪⎭⎪⎬⎫-=++=N k k X W k X N k X k X W k X k X kN kN (2.6) 这样,将N 点DFT 的计算分解为计算两个N/2点离散傅立叶变换X 1(k )和X 2(k ),再计算(2.6)式。

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 个蝶形。

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

按时间抽取的基2FFT算法分析与MATLAB实现

按时间抽取的基2FFT算法分析与MATLAB实现

按时间抽取的基2FFT算法分析与MATLAB实现基2FFT算法(Fast Fourier Transform)是一种高效的离散傅里叶变换(DFT)算法,其时间复杂度为O(NlogN),其中N为输入数据的大小。

该算法利用了DFT的对称性质以及分治的思想,通过将一个大规模的DFT问题分解为若干个规模较小的DFT问题来加快计算速度。

基2FFT算法的实现步骤如下:1.输入N个复数序列x(n),其中n取值范围为0到N-12.如果N为1,直接返回x(n)。

3. 将x(n)分为两个子序列,分别为x_odd(n)和x_even(n),其中x_odd(n)包含所有奇数索引的元素,x_even(n)包含所有偶数索引的元素。

4. 对x_odd(n)和x_even(n)分别进行基2FFT变换,递归地计算它们的DFT结果。

5. 根据DFT的对称性,计算出x(k)的前半部分和后半部分的值,其中k为频率索引,取值范围为0到N/2-1、具体计算方法是将x_odd(k)和x_even(k)与旋转因子W_N^k相乘,可通过以下公式计算:x(k) = x_even(k) + W_N^k * x_odd(k)x(k+N/2) = x_even(k) - W_N^k * x_odd(k)其中W_N^k = e^(-j*2*pi*k/N)为旋转因子。

6.返回x(k)作为输出结果。

基2FFT算法的MATLAB实现如下:```matlabfunction X = myfft(x)N = length(x);if N == 1X=x;%如果序列长度为1,直接返回原始序列returnendx_even = myfft(x(1:2:end)); % 奇数索引的元素序列x_odd = myfft(x(2:2:end)); % 偶数索引的元素序列W_N = exp(-2i * pi / N); % 计算旋转因子X = zeros(1, N); % 保存DFT结果for k = 0:N/2-1X(k+1) = x_even(k+1) + W_N^k * x_odd(k+1);X(k+1+N/2) = x_even(k+1) - W_N^k * x_odd(k+1); endend```该实现使用了递归的方式计算DFT,首先对输入序列进行分解,然后递归地计算子序列的DFT结果,并根据对称性将结果合并到一起。

基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF)

基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF)
按k的奇偶将X ( k )分成两部分,进行变量置换 当k 偶数时,频率的偶数部分 N W 1, 令k 2k ',k ' 0,1, 1 2 N / 2 1 N X ( k ) [ x(n) x(n )] N W nk k 0,2,4,6 , N 1 2 n 0 令k 2k ' 代入 X ( 2k ' )
N / 2 1 N k 2 N

n 0
N N 2 nk ' [ x(n) x(n )] N k ' 0,1, , 1 W 2 2 ( e
j 2 2 nk ' N
2 nk ' 又 WN nk ' WN / 2
e
j
2 nk ' N /2
nk ' WN / 2)
(6)DIF与DIT比较1
• • • • 相同之处: (1)DIF与DIT两种算法均为原位运算。 (2)DIF与DIT运算量相同。 它们都需要 N N mF log 2 次复乘 2 N aF N log 2 次复加
DIF 与DIT 是两种等价的FFT算法
(6)DIF与DIT比较2
• 不同之处: (1)DIF与DIT两种算法结构倒过来。 DIF为输入顺序,输出乱序。运算完毕再运行 “二进制倒读”程序。 DIT为输入乱序,输出顺序。先运行“二进制 倒读”程序,再进行求DFT。 (2)DIF与DIT根本区别:在于蝶形结不同。 DIT的复数相乘出现在减法之前。 DIF的复数相乘出现在减法之后。
n 0 0 2
1
代入上面流图可知:
0 2 0 2 0 2
X 3 (0) x(0)W x(4)W x(0)W x(4)W 这里用到对称性 W

FFT算法研究及基2-FFT算法的C语言实现

FFT算法研究及基2-FFT算法的C语言实现

FFT算法研究及基2-FFT算法的C语⾔实现毕业设计 [论⽂]题⽬:FFT算法研究及基2-FFT算法的C语⾔实现学院:电⽓与信息⼯程学院专业:电⽓⼯程及其⾃动化姓名:XXX学号:XXXXXX指导⽼师:XXX完成时间:2015年06⽉01⽇摘要离散傅⽴叶变换(DFT)常常⽤于计算信号处理。

DFT算法可以得到信号的频域特性,因为该算法在计算上是密集的,长时间的使⽤时,计算机不能实时进⾏信号处理。

所以DFT被发现之后的相当长时间内是没被应⽤到实际的项⽬。

到了⼆⼗世纪六⼗年代中期⼀种新的计算⽅法被研究者发现出来,它就是FFT。

FFT 并不是⼀种新的获取频域特征的⽅式,⽽是离散傅⾥叶变换的⼀种快速实现算法。

数字信号处理在当今科技发展中发展很迅速,不但是在传统的通信领域,其他⽅⾯也经常⽤到。

利⽤快速傅⾥叶变换,实现了信号频域的变换处理。

对于信号的处理,往往会和数学中的算法联系到⼀起。

如果处理得当,将会对⽓象,地理信息等的发展,起到举⾜轻重的作⽤,同时对世界其他领域的发展有很⼤的促进作⽤。

关键词: FFT算法,C语⾔,编译实现AbstractDiscrete Fourier Transform (DFT) is often used to calculate the signal processing to obtain frequency domain signals. DFT algorithm can get the frequency domain characteristics of the signal, because the algorithm is computationally intensive, long-time use, the computer is not conducive to real-time signal processing. So DFT since it was discovered in a relatively long period of time is not to be applied to the actual projects until a new fast discrete Fourier calculation method --FFT is found in discrete Fourier transform was able to actually project has been widely used. FFT is not a new way to get the frequency domain, but the discrete Fourier transform of a fast algorithm.Fast Fourier Transform (FFT) is a digital signal processing important tool that the time domain signal into a frequency-domain signal processing. matched filtering has important applications. FFT is a discrete Fourier transform (DFT) is a fast algorithm, it can be a signal from the time domain to the frequency domain. Some signals in the time domain is not easy to observe the characteristics of what is, but then if you change the signal from the time domain to the frequency domain, it is easy to see out of. This design is required to be familiar with the basic principles of FFT algorithm, based on the preparation of C language program to achieve FFT algorithm real number sequence. Keywords: FFT algorithm, C language compiler to achieve⽬录摘要 ................................................................................................................................. I Abstract ............................................................................................................................. I I ⽬录............................................................................................................................. I II 1 引⾔ . (4)1.1 课题背景 (4)1.2 FFT算法的现状 (4)1.3 研究内容 (2)1.4 论⽂的研究成果 (2)2 数字信号处理综述 (3)2.1 数字信号理论 (3)2.2 数字信号处理的实现 (4)2.3 数字信号处理的应⽤及特点 (4)3 基本理论 (6)3.1 FFT算法的基本概念 (6)3.1.1离散傅⾥叶变换(DFT) (6)3.1.2 快速傅⾥叶变换(FFT) (7)3.2 FFT算法的分类 (8)3.2.1按时间抽取(DIT)的FTT (8)3.2.2 按频率抽取(DIF)的FTT (12)3.2.3 快速傅⾥叶分裂基FFT算法 (15)3.2.4 N为组合数的FFT——混合基算法 (18)3.3 傅⾥叶变换的应⽤ (20)4 基-2FFT算法的C语⾔实现及仿真 ........................................ 错误!未定义书签。

【免费下载】基 2FFT算法的软件实现

【免费下载】基 2FFT算法的软件实现

图 2.3 N=8 点 DIT-FFT 的运算流图
(2)算法效率
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配0料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高高与中中带资资负料料荷试试下卷卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并中3试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

基2DIT-FFT的MATLAB实现

基2DIT-FFT的MATLAB实现

基2FFT算法
(3)第二次分解: • 将x1(r)按r取奇、偶可分解成2个长度为N/4的子序列 x3(l)= x1(2l)、 x4(l) = x1(2l+1), 根据上面推导可得:X1 (k)= X3(k)+ WN/2kX4(k),k=0,1,…,N/2-1
X 1 (k ) X 3 (k ) WN 2 k X 4 (k ), k 0,1, N 4 1; K N X 1 k X 3 (k ) WN 2 X 4 (k ), k 0,1,, N 4 1; 2
e e
2 2 j j mm ) ( lN N N
e W
2 j m m N N
m N 2 N
m WN
对称性: 3、FFT算法思想
W
m N
N m N
W
N m * N
W
m N
W
m WN
不断地把长序列的DFT分解成几个短序列的DFT,并利用旋转因子的周期
(1)倒序:输入自然顺序序列x(n),根据倒序规 律,进行倒序处理;
倒 序
L=1 , M
(2) 循 环 层 1: 确 定 运 算 的 级 数 , L=1M
(N=2M);确定一蝶形两输入数据距离B=2L-1 (3)循环层2:确定L级的(B=)2L-1 个旋转因子; 旋转因子指数p=2M-LJ,J=0B-1; (4)循环层3:对于同一旋转因子,用于同一级 2M-L 个蝶形运算中:k的取值从J到N-1,步长 为2L (使用同一旋转因子的蝶形相距的距离)
1、直接DFT运算N点运算:
复加次数: 2 ×N/2×M= N×log2N。 可见FFT大大减少了运算次数,提高了运算速度。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1 基2-FFT算法实现姓名:明眸皓齿王师傅班级:*******学号:**********实验时间:第十周周三下午第二大节一、实验目的1.掌握基2-FFT的原理及具体实现方法。

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

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

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

三.实验原理FFT是EDF的一种快速算法,能使DFT的计算大大简化,运算时间缩短。

FFT利用了W N nk的三个固有特性。

即对称性,周期性和可约性,将长序列的DFT分解为短序列的DFT,合并了DFT运算中的某些项,从而减少了DFT的运算量。

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

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

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

另外,蝶形运算中的复系数W N nk可以存储为能及时查阅的系数表,这样可以借阅运算量,但是需要N/2哥复数存储器。

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

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

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

代码:x=[0 1 2 3 4 5 6 7]m=3 %序列长度为2的3次方N=8xx=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; %求倒序列y=x(xx)for mm=1:m %对x做基2分解Nz=2^mmu=1WN=exp(-i*2*pi/Nz)for j=1:Nz/2for k=j:Nz:Nkk=k+Nz/2t=y(kk)*u %蝶形运算乘项y(kk)=y(k)-ty(k)=y(k)+tendu=u*WNendend得结果:x = 0 1 2 3 4 5m =3N =8y =0 4 2 6 1 5 3 7Nz =2u =1WN =-1.0000 - 0.0000ikk =2t =4y =0 -4 2 6 1 5 3 7y =4 -4 2 6 15 3 7kk =4t =6y =4 -4 2 -4 15 3 7y =4 -4 8 -4 15 3 7kk =6t =5y =4 -4 8 -4 1 -4 3 7y =4 -4 8 -4 6 -4 3 78t =7y =4 -4 8 -4 6 -4 3 -4y =4 -4 8 -4 6 -4 10 -4u =-1.0000 - 0.0000iNz =4u =1WN =0.0000 - 1.0000ikk =3t =8y =4 -4 -4 -4 6 -4 10 -4y =12 -4 -4 -4 6 -4 10 -4kk =7t =10y =12 -4 -4 -4 6 -4 -4 -4y =12 -4 -4 -4 16 -4 -4 -4u =0.0000 - 1.0000ikk =4t =-0.0000 + 4.0000iColumns 1 through 512.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000iColumns 6 through 8-4.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 + 0.0000iy =Columns 1 through 512.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000iColumns 6 through 8-4.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 + 0.0000ikk =8t =-0.0000 + 4.0000iy =Columns 1 through 512.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000iColumns 6 through 8-4.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 - 4.0000iy =Columns 1 through 512.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000iColumns 6 through 8-4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000iu =-1.0000 - 0.0000iNz =8u =1WN =0.7071 - 0.7071i5t =16y =Columns 1 through 512.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000iu =0.7071 - 0.7071ikk =6t =-0.0000 + 5.6569iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 + 0.0000i -4.0000 - 4.0000iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 + 0.0000i -4.0000 - 4.0000iu =0.0000 - 1.0000i7t =-0.0000 + 4.0000iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 4.0000iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 4.0000iu =-0.7071 - 0.7071i8t =-0.0000 + 5.6569iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 - 4.0000i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569iy =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569iu =-1.0000 - 0.0000i在原来的基础上加入yy1=fft(x)得与MATLAB运算中的fft函数比较结果:y =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569iy1 =Columns 1 through 528.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000iColumns 6 through 8-4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569i作图比较(左边为基2—FFT算法的结果,右边为fft函数的结果):实部:n=1:8subplot(121)stem(n,y,'filled')subplot(122)stem(n,y1,'filled')虚部:subplot(121)stem(y,'filled')subplot(122)stem(y1,'filled')由上图知实验结果一致2.编程实现序列长度为N=8的按频率抽取的基2-FFT算法。

相关文档
最新文档