基于matlab的FFT算法程序设计
- 格式:doc
- 大小:79.00 KB
- 文档页数:8
基于MATLAB的FFT算法的设计FFT(快速傅里叶变换)是一种用于计算离散傅里叶变换(DFT)的高效算法。
在信号处理和图像处理领域,FFT广泛应用于频域分析、滤波、相关性分析等。
MATLAB提供了方便且高效的FFT算法实现,使得用户可以轻松地进行信号处理和频谱分析。
本文将从基本概念、算法原理和实例应用三个方面介绍MATLAB中的FFT算法设计。
一、基本概念1.傅里叶变换:傅里叶变换是一种将信号从时域(时序)转换到频域(频率)的方法,它将信号表示成一系列正弦和余弦函数的叠加。
2.离散傅里叶变换(DFT):DFT是傅里叶变换在离散时序中的应用,将离散的时域信号转换到离散的频域。
3.快速傅里叶变换(FFT):FFT是一种使用分治法思想的DFT算法,通过将DFT的计算任务分解成更小的子任务并递归计算,以大幅度提高计算效率。
二、算法原理FFT算法基于分治法思想,将DFT计算任务分解成多个规模更小的DFT计算,然后通过递归计算子任务并合并结果得到最终的DFT结果。
MATLAB中的FFT算法可以通过fft函数实现。
具体来说,fft函数基于Cooley-Tukey算法,它使用了以下两个策略来提高计算效率:1.奇偶分解:将序列分解为奇数位置和偶数位置上的序列,分别进行DFT计算,然后合并结果。
2.蝶形运算:通过两个复数的乘法和加法运算,计算DFT的结果。
三、实例应用下面通过一个MATLAB实例应用来展示FFT算法的设计和使用过程。
假设我们有一个采样频率为Fs的音频信号,并且我们想要计算其频谱。
首先,我们读取音频文件并绘制其时域波形:```matlabfilename = 'audio.wav';[x, Fs] = audioread(filename);t = (0:length(x)-1)/Fs;plot(t, x);xlabel('Time (s)');ylabel('Amplitude');title('Audio Signal in Time Domain');```接下来,我们使用FFT算法计算音频信号的频谱,并绘制频谱图:```matlabN = length(x);X = fft(x);f=(0:N-1)*(Fs/N);plot(f, abs(X));xlabel('Frequency (Hz)');ylabel('Magnitude');title('Audio Signal Spectrum');```以上代码中,我们使用fft函数计算信号的频谱,并使用abs函数计算频谱的幅度。
傅里叶变换(Fourier Transform)是信号处理中的重要数学工具,它可以将一个信号从时域转换到频域。
在数字信号处理领域中,傅里叶变换被广泛应用于频谱分析、滤波、频谱估计等方面。
MATLAB作为一个功能强大的数学软件,自带了丰富的信号处理工具箱,可以用于实现傅里叶变换。
在MATLAB中,自行编写FFT(Fast Fourier Transform)的过程需要以下几个步骤:1. 确定输入信号我们首先需要确定输入信号,可以是任意时间序列数据,例如声音信号、振动信号、光学信号等。
假设我们有一个长度为N的信号x,即x = [x[0], x[1], ..., x[N-1]]。
2. 生成频率向量在进行傅里叶变换之前,我们需要生成一个频率向量f,用于表示频域中的频率范围。
频率向量的长度为N,且频率范围为[0, Fs),其中Fs 为输入信号的采样频率。
3. 实现FFT算法FFT算法是一种高效的离散傅里叶变换算法,它可以快速计算出输入信号的频域表示。
在MATLAB中,我们可以使用fft函数来实现FFT 算法,其调用方式为X = fft(x)。
其中X为输入信号x的频域表示。
4. 计算频谱通过FFT算法得到的频域表示X是一个复数数组,我们可以计算其幅度谱和相位谱。
幅度谱表示频率成分的强弱,可以通过abs(X)得到;相位谱表示不同频率成分之间的相位差,可以通过angle(X)得到。
5. 绘制结果我们可以将输入信号的时域波形和频域表示进行可视化。
在MATLAB 中,我们可以使用plot函数来绘制时域波形或频谱图。
通过以上几个步骤,我们就可以在MATLAB中自行编写FFT傅里叶变换的算法。
通过对信号的时域和频域表示进行分析,我们可以更好地理解信号的特性,从而在实际应用中进行更精确的信号处理和分析。
6. 频谱分析借助自行编写的FFT傅里叶变换算法,我们可以对信号进行频谱分析。
频谱分析是一种非常重要的信号处理技术,可以帮助我们了解信号中所包含的各种频率成分以及它们在信号中的能量分布情况。
基于MATLAB的FFT算法实现摘要:本文研究了基于MATLAB的快速傅里叶变换(FFT)算法的实现。
傅里叶变换是一种重要的信号处理工具,广泛应用于图像处理、语音处理、通信系统等领域。
FFT是一种快速计算傅里叶变换的算法,可以大大提高傅里叶变换的计算效率。
本文详细介绍了FFT算法的原理和实现步骤,并通过MATLAB编程实现了FFT算法,并对不同信号和数据集进行了测试和分析。
实验结果表明,基于MATLAB的FFT算法可以有效地计算傅里叶变换,并且具有较高的精确性和稳定性。
关键词:MATLAB、FFT、傅里叶变换、计算效率、精确性、稳定性一、引言傅里叶变换是一种将时域信号转换到频域的重要工具,可以解析复杂的周期信号和非周期信号。
傅里叶变换在图像处理、语音处理、通信系统等领域有广泛的应用。
由于传统的傅里叶变换算法计算复杂度较高,耗时较长,因此需要一种快速计算傅里叶变换的算法。
快速傅里叶变换(FFT)算法是一种通过分治和递归的方法,将傅里叶变换计算的时间复杂度从O(N^2)降低到O(NlogN),大大提高了傅里叶变换的计算效率。
二、FFT算法原理FFT算法是一种递归的分治算法,它将长度为N的输入序列分为两个长度为N/2的子序列,然后通过对子序列进行FFT变换,再利用蝶形运算(butterfly operation)将结果合并,最终得到整个输入序列的傅里叶变换结果。
FFT算法的关键步骤包括序列分组、计算旋转因子、递归计算和合并。
通过这些步骤,可以将傅里叶变换的计算复杂度从O(N^2)降低到O(NlogN)。
三、基于MATLAB的FFT算法实现步骤1.读入输入序列,并将序列长度补齐为2的指数幂,方便进行分组计算。
2.进行FFT算法的递归计算。
首先将输入序列分为两个长度为N/2的子序列,然后对子序列进行递归计算,最终得到子序列的傅里叶变换结果。
3.计算旋转因子。
根据旋转因子的定义,计算出旋转因子的实部和虚部。
数字信号处理实验报告 实验二 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 实现。
基于MATLAB的FFT算法的设计基于MATLAB的FFT(快速傅立叶变换)算法是一种用于将信号从时域转换到频域的常用方法。
FFT算法通过将复杂的离散傅立叶变换(DFT)问题转化为一个递归计算的过程,大大提高了计算效率。
本文将对基于MATLAB的FFT算法的设计进行详细介绍。
首先,我们需要了解MATLAB中FFT算法的基本原理。
FFT算法是一种将DFT计算复杂度从O(N^2)降低到O(NlogN)的算法。
它基于一种分治的思想,将输入信号分解成两个子问题,然后分别进行计算,最后合并结果。
这种分治的过程可以使用递归的方式实现。
在MATLAB中,可以使用fft函数来实现FFT算法。
该函数接受一个向量作为输入,并返回该向量的FFT结果。
具体而言,fft函数将输入信号分解成两个子问题,然后递归地调用fft函数计算子问题的FFT结果,最后将两个子问题的结果合并起来。
这个过程重复进行,直到最后得到整个信号的FFT结果。
以下是一个基于MATLAB的FFT算法的设计示例:```MATLABfunction Y = myFFT(X)N = length(X); % 输入信号长度if N == 1Y=X;%递归终止条件elseeven = myFFT(X(1:2:N)); % 分解成偶数点快odd = myFFT(X(2:2:N)); % 分解成奇数点快%合并步骤W = exp(-1i * 2 * pi / N * (0:N/2-1));temp = W .* odd;Y = [even + temp, even - temp];endend```在这个设计示例中,myFFT函数实现了基于MATLAB的FFT算法。
它接受一个向量X作为输入,并返回该向量的FFT结果Y。
在函数的内部,首先获取输入信号的长度N。
然后,使用递归的方式将输入信号分解成两个子问题。
接下来,分别调用myFFT函数计算子问题的FFT结果。
最后,在合并步骤中,我们使用旋转因子W将奇数点子问题的结果与偶数点子问题的结果合并起来。
基于MATLAB的FFT算法实现一、引言快速傅里叶变换(FFT)是一种非常重要的数学方法,广泛应用于信号处理、图像处理、通信等领域。
其主要功能是将时域信号转换为频域信号,对信号的频谱进行分析和处理。
本文基于MATLAB实现了FFT算法,并对其原理和应用进行了简要介绍。
二、FFT算法原理FFT算法通过将一个N点的离散傅立叶变换(DFT)分解为多个较小的DFT来加快计算速度。
其主要思想是利用信号的对称性质和旋转因子的周期性特点进行计算。
具体步骤如下:1.首先将输入信号序列划分为偶数下标和奇数下标的两个子序列;2.对每个子序列分别进行DFT运算;3.将得到的DFT结果进行合并。
三、MATLAB实现FFT算法在MATLAB中,我们可以利用内置函数fft(来实现FFT算法。
以下为MATLAB代码示例:```matlabfunction X = my_fft(x)N = length(x);if N == 1X=x;elsen=0:N-1;W_N = exp(-1i*2*pi/N*n);x_even = x(1:2:end);x_odd = x(2:2:end);X_even = my_fft(x_even);X_odd = my_fft(x_odd);X = [X_even + W_N(1:N/2).*X_odd, X_even - W_N(1:N/2).*X_odd];endend```在上述代码中,x为输入信号序列,N为序列的长度。
如果序列长度为1,则直接返回该序列;否则,利用递归将序列拆分为两个子序列,并进行DFT运算。
最后将两个子序列的DFT结果进行合并,得到最终的FFT 结果。
四、FFT算法的应用FFT算法在信号处理领域有着广泛的应用。
其中最常见的应用包括频谱分析、滤波器设计、图像处理等。
1.频谱分析:FFT可以将时域信号转换为频域信号,计算信号的频谱,分析信号的频率成分和能量分布。
通过频谱分析,我们可以了解到信号的频率特性,从而对信号进行相应的处理和判断。
基于MATLAB的FFT算法的设计FFT算法是一种用于快速计算离散傅里叶变换(DFT)的算法。
它通过将N点DFT分解为多个长度为N/2的DFT并递归地计算这些子问题来实现快速计算。
FFT算法是一种高效的算法,广泛应用于信号处理、图像处理和通信系统等领域。
MATLAB作为一种流行的科学计算软件,在信号处理中广泛使用。
MATLAB提供了快速计算DFT的函数fft,可以方便地进行信号频谱分析和滤波等操作。
下面将从FFT的理论原理、算法优化以及MATLAB的使用等方面展开讨论,详细介绍基于MATLAB的FFT算法的设计。
1.FFT算法的理论原理FFT算法基于蝶形运算的思想,将N点DFT分解为多级运算,每级运算中都会进行蝶形运算。
蝶形运算是一种两两计算的运算方式,可以将两个复数进行加减运算,并乘以一个旋转因子进行旋转。
FFT算法的主要思想是将N个点的DFT分解为两个N/2个点的DFT,然后再将这两个N/2个点的DFT两两合并为一个N个点的DFT。
这种分解递归进行下去,直到最后只有一个点,即得到DFT结果。
2.FFT算法的算法优化在实施FFT算法时,可以进行一些算法优化,以提高计算速度和效率。
首先是位逆序运算。
在FFT算法中,需要将输入的N个点按照位逆序重新排列,这在MATLAB中可以使用bitrevorder函数实现。
其次是预计算旋转因子。
FFT算法中需要进行的旋转因子的计算比较耗时,可以将旋转因子预先计算好并存储起来,以便使用时直接调用。
最后是避免重复计算。
由于FFT算法的递归特性,可能会重复计算一些结果。
可以使用分治法,将计算结果缓存起来,避免重复计算。
3.MATLAB中的FFT算法使用在MATLAB中,可以使用fft函数进行FFT计算。
这个函数可以接受输入信号和采样频率等参数,同时还可以设定计算结果的长度。
如果不指定计算结果的长度,默认将输入信号进行补零操作,使其长度为2的幂。
MATLAB的fft函数返回的结果是频率域的复数谱,可以使用abs函数取结果的绝对值,得到频谱的幅度谱。
一、实验目的1.利用MATLAB 编写FFT 快速傅里叶变换。
2.比较编写的myfft 程序运算结果与MATLAB 中的FFT 的有无误差。
二、实验条件PC 机,MATLAB7.0三、实验原理1. FFT (快速傅里叶变换)原理:将一个N 点的计算分解为两个N/2点的计算,每个N/2点的计算再进一步分解为N/4点的计算,以此类推。
根据DFT 的定义式,将信号x[n]根据采样号n 分解为偶采样点和奇采样点。
设偶采样序列为y[n]=x[2n],奇采样序列为z[n]=x[2n+1]。
上式中的k N W -为旋转因子N k j e /2π-。
下式则为y[n]与z[n]的表达式:2.蝶形变换的原理:下图给出了蝶形变换的运算流图,可由两个N/2点的FFT(Y[k]和Z[k]得出N点FFT X[k])。
同理,每个N/2点的FFT可以由两个N/4点的FFT求得。
按这种方法,该过程可延迟后推到2点的FFT。
下图为N=8的分解过程。
图中最右边的为8个时域采样点的8点FFTX[k],由偶编号采样点的4点FFT和奇编号采样点的4点得到。
这4点偶编号又由偶编号的偶采样点的2点FFT和奇编号的偶采样点的2点FFT产生。
相同的4点奇编号也是如此。
依次往左都可以用相同的方法算出,最后由偶编号的奇采样点和奇编号的偶采样点的2点FFT算出。
图中没2点FFT成为蝶形,第一级需要每组一个蝶形的4组,第二级有每组两个蝶形的两组,最后一级需要一组4个蝶形。
四、实验内容1.定义函数disbutterfly ,程序根据FFT 的定义:]2[][][N n x n x n y ++=、n N W N n x n x n z -+-=])2[][(][,将序列x 分解为偶采样点y 和奇采样点z 。
function [y,z]=disbutterfly(x)N=length(x);n=0:N/2-1;w=exp(-2*1i*pi/N).^n;x1=x(n+1);x2=x(n+1+N/2);y=x1+x2;z=(x1-x2).*w;2.定义函数rader ,纠正输出序列的输出顺序。
MATLAB的⼀个FFT程序FFT信号流图:程序实现是这样:程序流程如下图:⾸先进⾏位逆转,其实很简单,就是把⼆进制的位逆转过来:Matlab的位逆转程序:function a=bitreverse(Nbit, num)%Nbit = 4;%num = 8;a = 0;b = bitshift(1,Nbit-1);for i = 1:Nbit;if((bitand(num,1)) == 1)a = bitor(a,b);endnum = bitshift(num,-1);b = bitshift(b,-1);end;说明:Nbit是逆转位是⼏位,num是逆转的数即变量。
三个循环,第⼀个循环是进⾏N阶的FFT运算第⼆个循环其实就是,每⼀阶FFT的时候,有多少组DFT对象,拿8点来说,第⼀阶的时候,有4组DFT对象,到了第⼆阶,就有2组,到了第三,就是最后⼀阶,只有⼀组。
第三个循环,其实是在每⼀组DFT⾥边,执⾏多少次蝶形运算!8点DIT FFT来说,第⼀阶每组有⼀个蝶形,第⼆阶每组有2个,第三阶每组有4个蝶形。
所以很容易得到三者的关系i , j, k 三者,反别表⽰三层循环,然后得出循环次数的关系stages = log2(PointNum)i 从 0到stages – 1 !j 从 0 到其实就是k 从0 到旋转因⼦W的选择:因为根据8点DIT-FFT图,从第⼀阶到最后⼀阶,可以总结出⼀个规律:都是 N是每组蝶形数据个个数,⽐如第⼀阶每组有2个元素,N就是2,第⼆阶每组4个元素,N就是4等。
然后x往往都是从0开始到N/2 – 1;根据旋转因⼦的性质,其实可以有每阶段每组都是:蝶形运算设计:根据信号流图,得出以下算式:完成了蝶形运算!全部的matlab程序有:PointNum = 512;PointBitNum = 9;fs = 1024*2;t = 0:1:PointNum - 1;%for u = 1:1:PointNum;sampletab = cos(2*pi*543*t/fs) + cos(2*pi*100*t/fs) + 0.2 + cos(2*pi*857*t/fs) + cos(2*pi*222*t/fs);%endzeros(1,PointNum);sampletab1 = sampletab;index = 0;for i = 1:PointNumk = i - 1index = bitreverse(PointBitNum,i - 1)sampletab(i) = sampletab1(index + 1);end%sampletab1%sampletabREX = sampletab;IMX = zeros(1,PointNum);i = 0;?T Loop for Log2N stagesj = 0;?T loop for leach sub-DFTk = 0;?T Loop for each butterflystages = log2(PointNum);for i = 0 : stages - 1lenNum = 0;for j = 0 : 2^(stages - (i + 1)) - 1for k = 0 : 2^i - 1R1 = REX(lenNum + 2^i + 1) * cos(2*pi*k*2^(stages - (i + 1))/PointNum); R2 = IMX(lenNum + 2^i + 1) * sin(2*pi*k*2^(stages - (i + 1))/PointNum); T1 = REX(lenNum + 2^i + 1) * sin(2*pi*k*2^(stages - (i + 1))/PointNum); T2 = IMX(lenNum + 2^i + 1) * cos(2*pi*k*2^(stages - (i + 1))/PointNum); REX(lenNum + 2^i + 1) = REX(lenNum + 1) - R1 - R2;IMX(lenNum + 2^i + 1) = IMX(lenNum + 1) + T1 - T2;REX(lenNum + 1) = REX(lenNum + 1) + R1 + R2;IMX(lenNum + 1) = IMX(lenNum + 1) - T1 + T2 ;lenNum = lenNum + 1;endNum = lenNum + 2^i;endlenNum = endNum;endendsubplot(3,1,1);fft(sampletab1, PointNum);x1 = abs(fft(sampletab1, PointNum));plot([0 : PointNum/2 - 1], x1(1:PointNum/2));grid onsubplot(3,1,2);% [REX IMX]am = sqrt(abs(REX.*REX) + abs(IMX.*IMX));plot(0:1:PointNum/2 - 1, am(1:PointNum/2));grid onsubplot(3,1,3);plot(t, sampletab);grid on我还做了与MATLAB原来带有的FFT做⽐较:画出的图如下:第⼀个是MATLAB⾃带的FFT函数频谱图第⼆个是我⾃⼰设计的FFT频谱图第三个是信号的时域波形思想已经有了,我以前也改过⼈家的FFT的C程序但是不是很理解,打算有机会⽤C语⾔实现定点FFT,因为在嵌⼊式上多数⽤定点FFT,相应的C++版本应该也会写。
目录1前言 (1)2FFT算法的基本原理 (2)2.1系统总体流程图 (2)2.2 FFT运算规律及编程思想 (2)2.2.1对图片的选择 (2)2.2.2 FFT算法的基本原理 (3)2.2.3 FFT算法的运算规律及编程思想 (4)3 软件简介 (5)3.1 Matlab简介 (5)3.1.1 Matlab软件概况 (5)3.1.2 Matlab的特点 (5)3.2 GUI简介 (6)3.2.1界面设计 (6)3.3对比结果与分析 (8)4心得体会 (10)参考文献 (11)附录ⅠMatlab源程序 (12)附录ⅡGUI源程序 (16)1前言随着信息时代,数字时代的到来,数字信号处理已经成为一门极其重要的学科和技术领域。
以DSP为核心芯片的处理系统日益变成了数字信号处理系统的主流。
它广泛用于电子信息、通信、图像处理、语音处理、生物医学、自动控制、地质探测等领域,受到工程设计和使用人员的青睐。
MATLAB,它是美国Math Works公司推出的一种面向工程和科学计算的交互式计算软件。
它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程适用软件。
通过本次课设我们学会了分析和处理音频信号,首先要对图片信息进行采集,MATLAB的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制图像进行数据采集。
Window自带的程序也可驱动采集图片信息,并能保存该文件,供MATLAB相关函数直接读取写入。
MATLAB语言是一种数据分析和处理功能十分强大的计算机应用软件,它可以将图像文件变换位离散的数据文件,然后利用其强大的矩阵运算能力处理数据,如数据滤波、傅立叶变换、时域和频域分析、声音回放以及各种图的呈现等,它的信号处理与分析工具箱位语音信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便的完成图像信号的处理和分析以及信号的可视化,是人机交互更加便捷。
数字通信课程设计报告书
课题名称 基于matlab 的FFT 算法程序设计
姓 名
学 号
院 系 物理与电信工程系 专 业 电子信息工程
指导教师
2010年 01 月15日
※※※※※※※※※ ※
※ ※※ ※※
※※
※※※※※
※※
2007级数字通信
课程设计
基于matlab的FFT算法程序设计
0712401-36 李晔
(湖南城市学院物理与电信工程系通信工程专业,益阳,413000)
一、设计目的
1.通过该设计,进一步了解MATLAB软件。
2.通过该设计,进一步熟悉MATLAB的语法规则和编辑方式。
3.通过该设计,掌握傅里叶变换的含义和方法。
二、设计的主要要求
掌握Fourier变换,解了关于MATLAB软件在数字信号处理方面的应用,熟悉MATLAB的语法规则和编程。
用MATLAB实现快速Fourier变换。
三、整体设计方案
对信号x=sin(2*pi*f0*t)进行频谱分析,用MATLAB仿真。
选取抽样频率为fs=100Hz,依照下列条件用MATLAB软件对信号xt进行傅里叶变换y=fft(xt,N)并绘制频谱图,观察所产生的六幅频谱图进行对比,并进行分析。
四、程序设计
fs=100;%设定采样频率
N=128;
n=0:N-1;
t=n/fs;
f0=10;%设定正弦信号频率
%生成正弦信号
x=sin(2*pi*f0*t);
figure(1);
subplot(321);
plot(t,x);%作正弦信号的时域波形
xlabel('t');
ylabel('y');
title('正弦信号y=2*pi*10t时域波形'); grid;
%进行FFT变换并做频谱图
y=fft(x,N);%进行fft变换
mag=abs(y);%求幅值
m=length(y);
f=(0:m/2-1)'*fs/m;%进行对应的频率转换
figure(1);
subplot(322);
plot(f,mag(1:m/2));%做频谱图
axis([0,100,0,80]);
xlabel('频率(Hz)');
ylabel('幅值');
title('正弦信号y=2*pi*10t幅频谱图N=128'); grid;
%求均方根谱
sq=abs(y);
figure(1);
subplot(323);
plot(f,sq(1:m/2));
xlabel('频率(Hz)');
ylabel('均方根谱');
title('正弦信号y=2*pi*10t均方根谱'); grid;
%求功率谱
power=sq.^2;
figure(1);
subplot(324);
plot(f,power(1:m/2));
xlabel('频率(Hz)');
ylabel('功率谱');
title('正弦信号y=2*pi*10t功率谱'); grid;
%求对数谱
ln=log(sq);
figure(1);
subplot(325);
plot(f,ln(1:m/2));
xlabel('频率(Hz)');
ylabel('对数谱');
title('正弦信号y=2*pi*10t对数谱'); grid;
%用IFFT恢复原始信号
xifft=ifft(y);
magx=real(xifft);
ti=[0:length(xifft)-1]/fs;
figure(1);
subplot(326);
plot(ti,magx);
xlabel('t');
ylabel('y');
title('通过IFFT 转换的正弦信号波形'); grid;
五、程序仿真
t
y
正弦信号y=2*pi*10t 时域波形
频率(Hz)
幅值
正弦信号y=2*pi*10t 幅频谱图N=128
频率(Hz)
均方根谱
正弦信号y=2*pi*10t 均方根
谱
频率(Hz)
功率谱
正弦信号y=2*pi*10t 功率
谱
频率(Hz)
对数谱
正弦信号y=2*pi*10t 对数
谱
t
y
通过IFFT 转换的正弦信号波形
图5.1 基于matlab 的FFT 算法程序设计仿真图
六、设计总结与心得体会
快速傅氏变换 英文名是fast fourier transform ,快速傅氏变换(FFT )是离散傅氏变换(DFT)的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
有各种快速算法。
对于复数序列,用离散傅里叶变换。
快速傅里叶变换可以计算出与直接计算相同的结果,但只需要的计算复杂度。
通常,快速算法要求n能被因数分解,但不是所有的快速傅里叶变换都要求n是合数,对于所有的整数n,都存在快速算法。
除了指数的符号相反、并多了一个1/n的因子,离散傅里叶变换的正变换与逆变换具有相同的形式。
因此所有的离散傅里叶变换的快速算法同时适用于正逆变换。
在老师的帮助下我顺利的完成了这个课程设计,通过这次数字信号处理课程设计,让我了解了关于MATLAB软件在数字信号处理方面的应用,又一次学习了MATLAB软件的使用和程序的设计,MATLAB的仿真使我更加深入的了解了数字处理的过程,对我对数字信号处理的理解加深了一步。
MATLAB拥有强大的数据仿真能力,在生产和研究中起了非常重要的作用。
在这过程中我遇到了所多的难题,通过与老师的交流和学习,让我学会了很多在课堂上没有理解的难点。
同时也进一加深了对MATLAB的理解和认识
参考文献
[1] 张志勇,杨祖樱.MATLAB教程[s].北京航空航天大学出版社,2006,08
[2] 郑君里 ,杨为理.信号与系统[s].高等教育出版社, 2008, 12
[3] 李永东,岳继光,李炳宇.PIC单片机在楼宇对讲系统中的应用[J].电
[4] 李炳宇,萧蕴诗,李永东.AT89C51单片机在多层楼宇对讲系统中的应用[J].自动化与仪
表,2001,38(04):23-25.
[5]吴庆元,卢益民.智能小区系统通信协议的设计[J].通信技术,2003,19(7)。