数字信号处理期末论文
题 目: 基于DSP 的FFT 程序设计的研究
作 者
系 别
指导老师
完成时间 2013.06 届 别 专 业 职 称
内容摘要
快速傅里叶变 (Fas Fourier Tranformation,FFT) 是将一个大点数N 的DFT 分解为若干小点的D F T的组合。将用运算工作量明显降低, 从而大大提高 离散傅里叶变换(D F T) 的计算速度。因各个科学技术领域广泛的使用了FFT 技术它大大推动了信号处理技术的进步,现已成为数字信号处理强有力的工具,本论文将比较全面的叙述各种快速傅里叶变换算法原理、特点,并完成了基于MATLAB 的实现。
关键词:频谱分析;数字信号处理;MATLAB ;DSP281x
引言:
1965年,库利(J.W.Cooley )和图基(J.W.Tukey )在《计算数学》杂志上发表了“机器计算傅立叶级数的一种算法”的文章,这是一篇关于计算DFT 的一种快速有效的计算方法的文章。它的思路建立在对DFT 运算内在规律的认识之上。这篇文章的发表使DFT 的计算量大大减少,并导致了许多计算方法的发现。这些算法统称为快速傅立叶变换(Fast Fourier Transform),简称FFT ,1984年,法国的杜哈梅尔(P.Dohamel )和霍尔曼(H.Hollmann )提出的分裂基快速算法,使运算效率进一步提高。FFT 即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
随着科学的进步,FFT 算法的重要意义已经远远超过傅里叶分析本身的应用。FFT 算法之所以快速,其根本原因在于原始变化矩阵的多余行,此特性也适用于傅里叶变换外的其他一些正交变换,例如,快速沃尔什变换、数论变换等等。在FFT 的影响下,人们对于广义的快速正交变换进行了深入研究,使各种快速变换在数字信号处理中占据了重要地位。因此说FFT 对数字信号处理技术的发展起了重大推动作用。
信号处理中和频谱分析最为密切的理论基础是傅立叶变换(Fouriertransform,FT) 。快速傅立叶变换(FFT)和数字滤波是数字信号处理的基本内容。信号时域采样理论实现了信号时域的离散化,而离散傅里叶变换理论实现了频域离散化,因而开辟了数字技术在频域处理信 号的新途径,推进了信号的频谱分析技术向更广的领域发展。
1. 信号的频谱分析
如果信号频域是离散的,则信号在时域就表现为周期性的时间函数;相反信号在时域上是离 散的,则该信号在频域必然表现为周期的频率函数。不难设想,一个离散周期序列,它一定 具有既是周期又是离散的频谱。有限长序列的离散傅里叶变换和周期序列的离散傅里叶级数 本质是一样的。因而有限长序列的离散傅里叶变换的定义为:x(n)和X(k)是一个有限长序列的离散傅里叶变换对。
式(1.1)为x(n)的N 点离散傅里叶变换(DFT),式(1.2)为X(k)的N 点离散傅里叶反变换(IDFT)。
作为有限长序列的一种傅里叶表示法,离散傅里叶变换除了在理论上相当重要之外,而且由 于存在有效的快速算法—快速离散傅里叶变换(FFT),因而在各种数字信号处理的算法中起着核心作用。快速傅里叶变换是指1965年库力和图基(Cooley-Tukey)算法为基础的一类高 效算法,它的出现和发展对推动信号的数字处理技术的变革和发展起着重大作用。
信号谱分析是数字信号处理的重要内容,对确定的信号其时 域表示是确定的,其频谱可以通 过傅立叶变换得到。但在实际应用中,携带信息的信号本质上都是随机的,随机信号不能用 确定的时间函数表示,只能用概率分布函数、概率密度函数或统计平均特性来描述。通常把 随机信号看作无限长度和无限能量的功率信号,由于不满足绝对可积,其傅立叶变换不存在 ,因此只能研究其功率在频域的分布,即功率谱或功率谱密度。实际应用中人们所能得到的 随机信号的样本函数总是有限长序列,根据有限长度的信号所得的功率谱只是随机信号真实 功率谱的估计,称为功率谱估计。功率谱是平稳随机信号在频域上,描述各频率分量功率分 布情况的基本特征量,由于功率谱与相关函数之间是一对傅立叶变换,经典功率谱估计都依 据DFT ,而采用FFT 算法,故称之为非参数方法。若间接使用有限数据先估计相关函数,进而 求出功率谱的估计,为自相关法。
2. 利用MATLAB 进行随机信号功率谱分析
MATLAB 在DSP(数字信号处理) 中有着广泛的应用。例如:MATLAB 的信号处理工具箱、滤波 器设计工具箱以及Simulink 的建模仿真功能,还有针对DSP 系统的专用数据库——DSP 模块库 和定点DSP 模块库。此外,信号处理工具SPTool(Signalprocessingtool)提供了一个于 完成信号处理任务的GUI 集成环境。利用他可以从MATLAB 工作空间或者文件直接导入已经设 计好的信号、滤波器或频谱;可以分析、聆听和输出时域信号;可以
设计、分析和输出滤波 器;可以完成对信号的滤波;可以对输入输出信号进行各种谱分析并输出结果,等等。
在下面的程序中利用MATLAB 分信号频域的幅度谱、相位谱、功率谱。通过
对频谱图的比较, 观察出信号的频域特征。
3. 利用DSP 进行随机信号功率谱分析
对信号的数字处理,是利用计算机或专用的数字设备对信号进行采集、变换、滤波、估值、 增强、压缩和识别等加工处理,以得到符合人们需要的信号形式并进行有效的传输与应用。 数字信号处理器,也称DSP 芯片,是一种专门用于数字信号处理的微处理器。DSP 芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊 的DSP 指令,可以用来快速地实现各种数字信号处理算法。
基2的FFT 硬件实现有多种形式,其工作原理主要采用:①顺序处理;②级联处理;③并 行迭代处理;④阵列处理等。
4.matlab 结果比较
(1).自编FFT 程序与MATLAB 调用FFT 程序比较
6
4
2
[1**********]416
6
4
2
[1**********]416
自编函数与调用fft 函数结果是一致的。
(2). 自编产生多频信号程序及多频信号时序图和调用MATLAB 自带FFT 程序处理此多频信号及频谱分析图
多频信号
12000
10000
8000
6000
4000
2000
-[**************]16
184频谱
16
14
12
10
8
6
4
2
5. 结论
文章通过对随机信号的功率谱分析,了解信号中的频谱组成,进而对信号特征进行考察。完 成了基于MATLAB 的信号在时域和频域的波形仿真。
在CCS 环境下,利用汇编语言实现FFT 算法和功率谱的估计,通过CCS 所包含的画图函数进行相应的频谱观测,最后,通过仿真器在硬件DSP281x 上实现了随机信号的功率谱分析。
参考文献
[1] 陈后金,薛健,胡健. 数字信号处理[M ]. 北京:高等教育出版社,2004.
[2] 董长虹,余啸海,高成,金涛.MATLAB 信号处理与应用[M ]. 北京:国防工业 出版社,2005.
[3] 梁虹,梁洁,陈跃斌. 信号与系统分析及MATLAB 实现[M ]. 北京:电子工业出 版社,2002.
[4] 张志涌. 精通MATLAB6.5版[M ]. 北京:北京航空航天大学出版社,2003.
[5] 彭启琮,李玉柏,管庆.DSP 技术的发展与应用[M ]. 北京:高等教育出版社, 2002.
附录1:在利用DSP 进行频谱分析的程序设计中,实现的主要程序为:
STM#fft-data,AR2
STM#fft-data,AR3
STM#fft-out,AR4
STM#K-FFT-SIZE*2-1,BRC
RPTBpower-end-1
SQUR*AR2+,A
SQURA*AR2+,A
STHA,*AR4+13-6-18 基于DSP 的信号频谱分析与实现
DSP281x
产生一个多频信号,分析其频谱,并和matlab 结果比较
FFT 程序设计
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "f2812a.h"
#include"math.h"
#define PI 3.1415926
#define SAMPLENUMBER 128
void InitForFFT();
void MakeWave();
//void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);
int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];
float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];
float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];
void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER])
{
int x0,x1,x2,x3,x4,x5,x6,xx;
int i,j,k,b,p,L;
float TR,TI,temp;
for ( i=0;i
{
x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;
xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;
dataI[xx]=dataR[i];
}
for ( i=0;i
{
dataR[i]=dataI[i]; dataI[i]=0;
}
for ( L=1;L
{ /* for(1) */
b=1; i=L-1;
while ( i>0 )
{
b=b*2; i--;
} /* b= 2^(L-1) */
for ( j=0;j
{
p=1; i=7-L;
while ( i>0 ) /* p=pow(2,7-L)*j; */
{
p=p*2; i--;
}
p=p*j;
for ( k=j;k
{
TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p]; dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p]; dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p]; dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p]; } /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for ( i=0;i
{
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
}
} /* END FFT */
main()
{
int i;
InitForFFT();
MakeWave();
for ( i=0;i
{
fWaveR[i]=INPUT[i];
fWaveI[i]=0.0f;
w[i]=0.0f;
}
FFT(fWaveR,fWaveI);
for ( i=0;i
{
DATA[i]=w[i];
}
while ( 1 ); // break point
}
void InitForFFT()
{
int i;
for ( i=0;i
{
sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);
cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);
}
}
void MakeWave()
{
int i;
for ( i=0;i
{
INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024; }
}
附录2:MATLAB 调用FFT 程序
x=randn(1,16)
s=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
for k=1:16
for n=1:16
s(k)=s(k)+x(n).*2.718^(-(j*2*pi*k*n)/16)
end
end
subplot(2,1,1), stem(abs(s))
y=fft(x)
subplot(2,1,2), stem(abs(y))
附录3:调用MATLAB 自带FFT 程序处理此多频信号及频谱分析图 a=0
t=1:0.1:16
for f=1:128
a=a+1024*sin(2*3.14*f*3*t/128)
end
figure,plot(t,a)
title('多频信号')
y=fft(a)
figure,plot(abs(y))
title('频谱')