1数字信号处理课程设计报告.docx
《1数字信号处理课程设计报告.docx》由会员分享,可在线阅读,更多相关《1数字信号处理课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
![1数字信号处理课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/15/85b7c453-ac42-4b2c-9676-24c128653bf2/85b7c453-ac42-4b2c-9676-24c128653bf21.gif)
1数字信号处理课程设计报告
数字信号与处理课程设计报告
1、课程设计题目:
按时间抽选(DIT)的基-2IFFT算法的C实现
学号:
08113126
学生姓名:
徐思凯
班级:
081131
专业:
信息工程
指导教师:
饶志华
2011年6月19日
目录
一.数字信号处理的简介-2-
二.课程设计的目的与要求-2-
三.傅立叶变换的逆变换-2-
四.IFFT的计算方法-3-
五.课程设计代码-4-
六.程序结果-8-
一.数字信号处理的简介
数字信号处理的主要对象是数字信号,且是采用运算的方法达到处理目的,因此,其实现方法不同于模拟信号的实现方法,基本上可以分为两种实现方法,即软件实现方法和硬件实现的方法。
而硬件实现指的是选用合适的DSP芯片,配有适合芯片语言及任务要求的软件,实现某种信号处理功能的一种方法。
数字信号处理的特点1.灵活性2.高精度和高稳定性3.便于大规模集成4.对数字信号可以存储、运算;系统可以获得高性能指标
二.课程设计的目的与要求
通过本课程设计进一步巩固数字信号处理的基本概念、理论、分析方法和实现方法;能掌握的基本理论和分析方法方面的知识得到进一步扩展;能有效地将理论和实际紧密结合;增强软件编程实现能力和解决实际问题的能力,要求能够熟练地用Matlab语言编写数字信号处理的应用程序。
三.傅立叶变换的逆变换
对一个给定的傅里叶变换,求其相应原函数f(t)的运算,即傅立叶变换的逆变换对向量(或直接对矩阵的行或列)进行离散傅立叶逆变换的函数的调用方法是:
Y=ifft(X,n,dim)
函数对X进行离散傅立叶逆变换。
其中X、n、dim的意义及用法和离散傅立叶变换函数fft完全相同。
举例
A=[3,2,1,1;-5,1,0,1;3,2,1,5];
fftA=fft(A)%求A的列向量的傅立叶变换
fftA2=fft(A,4,2)%求A的行向量的傅立叶变换
ifft(fftA)%对矩阵fftA的列向量进行傅立叶逆变换,结果应等于A
ifft(fftA2,4,2)%对矩阵fftA2的行向量进行傅立叶逆变换,其结果应等于A
DX=diff(X)计算向量X的向前差分,DX(i)=X(i+1)-X(i),0
DX=diff(X,n)计算X的n阶向前差分,diff(X,2)=diff(diff(X))。
DX=diff(A,n,dim)计算矩阵A的n阶差分,dim=1时(缺省状态),按列计算差分,dim=2,按行计算差分。
四.IFFT的计算方法
FFT算法同样可以应用于IDFT的计算,称为快速傅里叶反变换,简写为IFFT。
前述DFT和IDFT公式为
比较上面两式,可以看出,只要把DFT公式中的系数
改为
,并乘以系数1/N,就可用FFT算法来计算IDFT,这就得到了IFFT的算法。
当把时间抽选FFT算法用于IFFT计算时,由于原来输入的时间序列x(n)现在变为频率序列X(k),原来是将x(n)偶奇分的,而现在变成对X(k)进行偶奇分了,因此这种算法改称为频率抽选IFFT算法。
类似地,当把频率抽选FFT算法用于计算IFFT时,应该称为时间抽选IFFT算法。
在IFFT计算中经常把常量1/N分解成M个1/2连乘,即1/N=(1/2)M,并且在M级的迭代运算中,每级的运算都分别乘上一个1/2因子。
图3.29表示的是时间抽选IFFT流程图。
五.课程设计代码
#include
#include/*调用系统函数*/
#include/*动态存储*/
#include
#defineN1024
typedefstruct/*定义复数类型*/
{
doublereal;
doubleimg;
}
complex;/*定义结构体类型为复数类型,声明新类型名为complex*/
complexx[N],*W;/*想x[n]为输入序列,*w为指向complex的数据指针*/
intsize_x=0;/*输入序列的大小,在本程序中仅限2的次幂*/
doublePI;/*圆周率*/
/*主函数*/
intmain(){
inti,method,s;
voidfft();/*快速傅里叶变换*/
voidifft();/*逆快速傅里叶变换*/
voidinitW();/*初始化变换核*/
voidchange();/*变址,将x[n]倒置*/
voidadd(complex,complex,complex*);/*复数加法*/
voidmul(complex,complex,complex*);/*复数乘法*/
voidsub(complex,complex,complex*);/*复数减法*/
voiddivi(complex,complex,complex*);/*复数除法*/
voidoutput();/*输出结果*/
voidinput();/*随机输入时调用*/
typedefstructCOMPLEX//复数结构体
{
doubleReal;
doubleImag;
}Complex;
voidFFT1D(Complex*pTD,Complex*pFD,unsignedintnGrade);//一维FFT变换
voidIFFT1D(Complex*pFD,Complex*pTD,unsignedintnGrade);//一维IFFT变换
voidFFT1D(Complex*pTD,Complex*pFD,unsignedintnGrade)//一维FFT变换
{
Complex*W,*X1,*X2,*X;
ComplexTempComplex;
unsignedinti,j,k;
unsignedintbfsize,p;
unsignedintnCount=1<doubledAngle;
W=newComplex[nCount>>1];//分配内存空间
X1=newComplex[nCount];
X2=newComplex[nCount];
for(i=0;i<(nCount>>1);i++)//计算加权系数
{
dAngle=PI*2.0*i/nCount;
W[i].Real=cos(dAngle);
W[i].Imag=-sin(dAngle);
}
memcpy(X1,pTD,sizeof(Complex)*nCount);//内存拷贝
for(k=0;k{
for(j=0;j<(unsignedint)(1<{
bfsize=1<<(nGrade-k);
for(i=0;i{
p=j*bfsize;
X2[i+p].Real=X1[i+p].Real+X1[i+p+bfsize/2].Real;
X2[i+p].Imag=X1[i+p].Imag+X1[i+p+bfsize/2].Imag;
TempComplex.Real=X1[i+p].Real-X1[i+p+bfsize/2].Real;
TempComplex.Imag=X1[i+p].Imag-X1[i+p+bfsize/2].Imag;
X2[i+p+bfsize/2].Real=TempComplex.Real*W[i*(1<X2[i+p+bfsize/2].Imag=TempComplex.Real*W[i*(1<}
}
X=X1;
X1=X2;
X2=X;
}
for(j=0;j{
p=0;
for(i=0;i{
if(j&(1<
{
p+=1<<(nGrade-i-1);
}
}
pFD[j].Real=X1[p].Real;
pFD[j].Imag=X1[p].Imag;
}
delete[]W;
delete[]X1;
delete[]X2;
}
voidIFFT1D(Complex*pFD,Complex*pTD,unsignedintnGrade)//一维IFFT变换
{
Complex*W,*X1,*X2,*X;
ComplexTempComplex;
unsignedinti,j,k;
unsignedintbfsize,p;
unsignedintnCount=1<doubledAngle;
W=newComplex[nCount>>1];//分配内存空间
X1=newComplex[nCount];
X2=newComplex[nCount];
//计算加权系数
for(i=0;i<(nCount>>1);i++)
{
dAngle=PI*2.0*i/nCount;
W[i].Real=cos(dAngle);
W[i].Imag=sin(dAngle);
}
memcpy(X1,pFD,sizeof(Complex)*nCount);//内存拷贝
for(k=0;k{
for(j=0;j<(unsignedint)(1<{
bfsize=1<<(nGrade-k);
for(i=0;i{
p=j*bfsize;
X2[i+p].Real=X1[i+p].Real+X1[i+p+bfsize/2].Real;
X2[i+p].Imag=X1[i+p].Imag+X1[i+p+bfsize/2].Imag;
TempComplex.Real=X1[i+p].Real-X1[i+p+bfsize/2].Real;
TempComplex.Imag=X1[i+p].Imag-X1[i+p+bfsize/2].Imag;
X2[i+p+bfsize/2].Real=TempComplex.Real*W[i*(1<