信号实验报告 离散傅里叶变换及其快速算法及IIR数字滤波器的设计.docx
- 文档编号:24327677
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:22
- 大小:118.12KB
信号实验报告 离散傅里叶变换及其快速算法及IIR数字滤波器的设计.docx
《信号实验报告 离散傅里叶变换及其快速算法及IIR数字滤波器的设计.docx》由会员分享,可在线阅读,更多相关《信号实验报告 离散傅里叶变换及其快速算法及IIR数字滤波器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
信号实验报告离散傅里叶变换及其快速算法及IIR数字滤波器的设计
信号实验一离散傅里叶变换及其快速算法
一、实验目的
1、掌握计算序列的离散傅里叶变换(FFT)的方法;
2、掌握实现时间抽取快速傅里叶变换(FFT)编程方法;
3、加深对DFT与序列的傅里叶变换和Z变换之间的关系的理解;
4、复习复数序列的运算方法。
二、程序设计框图
1、码位倒置程序框图
2、蝶形图运算程序框图
三、实验程序
实验程序的源代码如下:
#include"math.h"
#include"stdio.h"
/*------------------------------------------------------------------------------------------
子函数部分
------------------------------------------------------------------------------------------*/
voidswap(float*a,float*b)//交换变量子函数
{
floatT;
T=*a;
*a=*b;
*b=T;
}
voidfft(floatA[],floatB[],unsignedM)//数组A为序列的实部,数组B为序列的虚部
{
unsignedlongN,I,J,K,L,LE,LE1,P,Q,R;
floatWr,Wi,W1r,W1i,WTr,WTi,theta,Tr,Ti;
N=1< J=0; for(I=0;I { if(J>I) { swap(&A[I],&A[J]); swap(&B[I],&B[J]); } K=N>>1; while(K>=2&&J>=K) { J-=K; K>>=1; } J+=K; } for(L=1;L<=M;L++) { LE=1< LE1=LE/2; Wr=1.0; Wi=0.0; theta=(-1)*3.1415926536/LE1; W1r=cos(theta); W1i=sin(theta); for(R=0;R { for(P=R;P { Q=P+LE1; //基本蝶形图的复数运算 Tr=Wr*A[Q]-Wi*B[Q]; Ti=Wr*B[Q]+Wi*A[Q]; A[Q]=A[P]-Tr; B[Q]=B[P]-Ti; A[P]+=Tr; B[P]+=Ti; } WTr=Wr; WTi=Wi; Wr=WTr*W1r-WTi*W1i; Wi=WTr*W1i+WTi*W1r; } } return; } /*------------------------------------------------------------------------------------------ 主函数部分 ------------------------------------------------------------------------------------------*/ voidmain() { floatA[20],B[20]; chart1,t2,file_name[20]; intM,N,i,iiff; FILE*fp; /*************************************数据读取部分************************************/ printf("请输入文件名: ");//输入数据文件名 scanf("%s",file_name); printf("FFT变换还是IFFT变换? (FFT: 1,IFFT: -1): ");//输入变换方式,1为FFT,-1为IFFT scanf("%d",&iiff); while(iiff! =1&&iiff! =-1)//检错: 检验上一步的输入是否有错,有错则重新输入 { printf("输入错误,请重新输入! "); printf("FFTorIFFT? (FFT: 1,IFFT: -1): "); scanf("%d",&iiff); } fp=fopen(file_name,"r");//打开文件并读入数据 fscanf(fp,"%d",&M); N=pow(2,M);//计算序列总数 for(i=0;i { fscanf(fp,"%f%c%c%f",&A[i],&t1,&t2,&B[i]); if(iiff==-1)//根据FFT或IFFT修正B B[i]=B[i]*-1; if(t2! ='j')//检错: 检验读取格式是否有错 { printf("输入格式错误\n"); break; } if(t1=='+')//判断虚部的正负号 B[i]=B[i]; elseif(t1=='-') B[i]=-B[i]; } /****************************************变换部分****************************************/ fft(A,B,M);//FFT变换 /**************************************数据输出部分**************************************/ fp=fopen("fft_result.txt","w");//输出结果 if(iiff==-1) fprintf(fp,"IFFT变换的输出结果是: \n"); else fprintf(fp,"FFT变换的输出结果是: \n"); for(i=0;i { if(iiff==-1)//根据FFT或IFFT修正B { B[i]=B[i]*-1/N; A[i]=A[i]/N; } if(B[i]>=0)//修正虚部的输出格式 fprintf(fp,"%f+j%f\n",A[i],B[i]); elseif(B[i]<0) fprintf(fp,"%f-j%f\n",A[i],-B[i]); elseif(B[i]==0) fprintf(fp,"%f\n",A[i]); } fclose(fp); } 四、程序运行结果检验 1、对序列 进行FFT变换 (1)输入文件fft_input.txt: 2 1+j0 2+j0 -1+j0 4+j0 (2)控制台输入: 请输入文件名: fft_input.txt FFT变换还是IFFT变换? (FFT: 1,IFFT: -1): 1 (3)输出文件fft_result.txt: FFT变换的输出结果是: 6.00000+j0.00000 2.00000+j2.00000 -6.00000+j0.00000 2.00000+j-2.00000 (4)运行结果分析: 程序运行输出结果与计算结果相同,表示傅里叶正变换(FFT)成功。 2、对序列 进行IFFT变换 (1)输入文件ifft_input.txt: 2 6+j0 2+j2 -6+j0 2-j2 (2)控制台输入: 请输入文件名: ifft_input.txt FFT变换还是IFFT变换? (FFT: 1,IFFT: -1): -1 (3)输出文件fft_result.txt: IFFT变换的输出结果是: 1.000000+j0.000000 2.000000-j0.000000 -1.000000+j0.000000 4.000000+j0.000000 (4)运行结果分析: 程序运行输出结果与计算结果相同,表示傅里叶正变换(FFT)成功。 信号实验二IIR数字滤波器的设计 一、实验目的 1.掌握设计IIR数字滤波器的冲激响应不变法; 2.掌握设计IIR数字滤波器的双线性变换法 3.掌握IIR数字滤波器的实现方法。 二、滤波器设计过程 用双线性变换法设计一个IIR低通数字滤波器,数字滤波器的设计指标是 取采样时间 ,进行预畸变将上述数字滤波器的设计指标变换为模拟滤波器的设计指标,即 采用巴特沃思型逼近形式,因此,设计的模拟滤波器应满足 可得,模拟滤波器的系统函数 为 采用双线性变换法,得数字滤波器的系统函数 其中 可采用级联结构实现该滤波器。 三、实验程序 实验程序的源代码如下: #include"math.h" #include"stdio.h" /*------------------------------------------------------------------------------------------ 子函数部分 ------------------------------------------------------------------------------------------*/ voidIIRDF(floatA[],unsignedlongN)//A为待滤波序列,M为序列长度 { unsignedlongn; //赋初值x[0]为x(0),x[1]为x(-1),x[2]为x(-2),同理y1,y2,y floatx[3]={0,0,0},y1[3]={0,0,0},y2[3]={0,0,0},y[3]={0,0,0}; for(n=0;n { x[0]=A[n]; //第一级 y1[0]=1.31432*y1[1]-0.71489*y1[2]+0.08338*x[0]+0.16676*x[1]+0.08338*x[2]; x[2]=x[1]; x[1]=x[0]; //第二级 y2[0]=1.0541*y2[1]-0.37534*y2[2]+0.08338*y1[0]+0.16676*y1[1]+0.08338*y1[2]; y1[2]=y1[1]; y1[1]=y1[0]; //第三级 y[0]=0.94592*y[1]-0.23422*y[2]+0.08338*y2[0]+0.16676*y2[1]+0.08338*y2[2]; y2[2]=y2[1]; y2[1]=y2[0]; y[2]=y[1]; y[1]=y[0]; A[n]=y[0]; } } /*------------------------------------------------------------------------------------------ 主函数部分 ------------------------------------------------------------------------------------------*/ voidmain() { intn,N; floatTs,T; floatx[3][100],x0[3][100]; FILE*fp,*fp1,*fp2,*fp3; /***********************************数据输入部分***********************************/ Ts=0.00125;//输入序列采样时间Ts T=0.08;//输入序列采样总时间 for(n=0;Ts*n<=T;n++)//生成测试序列 { x[0][n]=4*sin(100*3.1415926*Ts*n);//生成序列1 x0[0][n]=x[0][n]; x[1][n]=4*sin(200*3.1415926*Ts*n);//生成序列2 x0[1][n]=x[1][n]; x[2][n]=4*sin(400*3.1415926*Ts*n);//生成序列3 x0[2][n]=x[2][n]; } N=n;//记录序列总长度 /***********************************IIR滤波部分************************************/ IIRDF(x[0],N);//序列1滤波 IIRDF(x[1],N);//序列2滤波 IIRDF(x[2],N);//序列3滤波 /***********************************结果输出部分***********************************/ fp1=fopen("x(t)=4sin(100πt).txt","w");//打开输出文件 fp2=fopen("x(t)=4sin(200πt).txt","w"); fp3=fopen("x(t)=4sin(400πt).txt","w"); fprintf(fp1,"x(t)=4sin(100πt)的IIR滤波的输出结果是: \n");//序列1的结果输出 for(n=0;n { fprintf(fp1,"%10f%10f\n",x0[0][n],x[0][n]); } fprintf(fp2,"x(t)=4sin(200πt)的IIR滤波的输出结果是: \n");//序列2的结果输出 for(n=0;n { fprintf(fp2,"%10f%10f\n",x0[1][n],x[1][n]); } fprintf(fp3,"x(t)=4sin(400πt)的IIR滤波的输出结果是: \n");//序列3的结果输出 for(n=0;n { fprintf(fp3,"%10f%10f\n",x0[2][n],x[2][n]); } fclose(fp1);//关闭文件 fclose(fp2); fclose(fp3); } 四、程序运行结果检验 1、检验数据输入 将下列分别位于通带、过渡带和阻带的三个模拟信号数字 式中, 为采样间隔, 为记录时间长度。 然后将得到的三个序列 、 、 作为激励信号分别输入到所设计数字滤波器的输入端,计算输出端的响应信号 、 和 ,观察序列幅度变化。 2、程序运行结果 程序结果分别输出到文件x(t)=4sin(100πt).txt、x(t)=4sin(200πt).txt、x(t)=4sin(400πt).txt中,输出结果见附录一。 3、结果分析 使用matlab对运行结果作图分析(程序见附录二),结果如下 对输出结果分析发现,对处于带通范围内的序列x(t)=4sin(100πt)的采样结果经过滤波器滤波之后,幅值基本没有发生变化,对处于过渡带范围内的序列x(t)=4sin(200πt)的采样结果经过滤波器滤波之后,幅值大幅减小,对处于带阻范围内的序列x(t)=4sin(200πt)的采样结果进过滤波器滤波之后,幅值基本为零。 说明我们设计的滤波器工作正常。 附录一 IIR滤波输出结果 序列x(t)=4sin(100πt) 序列x(t)=4sin(200πt) 序列x(t)=4sin(400πt) 滤波前 滤波后 滤波前 滤波后 滤波前 滤波后 0 0 0 0 0 0 1.530734 0.000887 2.828427 0.00164 4 0.002319 2.828427 0.009904 4 0.01759 0 0.021597 3.695518 0.053724 2.828427 0.090329 -4 0.092564 4 0.190219 0 0.296509 -0.000001 0.241948 3.695518 0.498033 -2.828427 0.699064 4 0.430788 2.828427 1.034063 -4 1.253904 0.000001 0.552539 1.530734 1.778526 -2.828428 1.750245 -4 0.525252 0 2.604401 -0.000001 1.872052 -0.000002 0.367739 -1.530733 3.296343 2.828426 1.382391 4 0.160862 -2.828427 3.615747 4 0.321861 0.000002 -0.02986 -3.695518 3.384228 2.828428 -0.92806 -4 -0.16206 -4 2.550329 0.000001 -1.79539 -0.000003 -0.1979 -3.695518 1.214164 -2.828426 -1.82165 4 -0.13584 -2.828428 -0.39611 -4 -0.94575 0.000003 -0.03535 -1.530735 -1.98372 -2.828429 0.414599 -4 0.03747 -0.000001 -3.25623 -0.000002 1.556292 -0.000004 0.069588 1.530733 -3.98948 2.828426 1.866755 4 0.076267 2.828426 -4.0677 4 1.171775 0.000004 0.054972 3.695518 -3.49508 2.828429 -0.15127 -4 0.006252 4 -2.38282 0.000002 -1.37177 -0.000005 -0.03527 3.695519 -0.92036 -2.828425 -1.81193 4 -0.03909 2.828428 0.660368 -4 -1.23105 0.000005 -0.02181 1.530735 2.120863 -2.828429 0.034567 -4 -0.01238 0.000001 3.24821 -0.000003 1.260962 -0.000006 -0.00502 -1.530732 3.881631 2.828425 1.749781 4 0.013906 -2.828426 3.932208 4 1.228569 0.000006 0.026185 -3.695518 3.394366 2.828429 0.006567 -4 0.012807 -4 2.347404 0.000003 -1.20516 -0.000007 -0.00622 -3.695519 0.945806 -2.828425 -1.70587 4 -0.00566 -2.828429 -0.60165 -4 -1.21076 0.000007 0.001329 -1.530735 -2.06193 -2.82843 -0.01455 -4 -0.00587 -0.000002 -3.21275 -0.000004 1.181933 -0.000008 -0.01299 1.530732 -3.87718 2.828424 1.681051 4 -0.00121 2.828426 -3.95171 4 1.194745 0.000008 0.012017 3.695517 -3.42318 2.82843 0.01125 -4 0.005 4 -2.37133 0.000004 -1.17483 -0.000009 -0.00635 3.695519 -0.95665 -2.828424 -1.66935 4 -0.00025 2.828429 0.604501 -4 -1.18445 0.000009 0.008531 1.530736 2.073425 -2.828431 -0.00608 -4 -0.00027 0.000002 3.225829 -0.000005 1.174258 -0.00001 -0.01078 -1.530731 3.886142 2.828424 1.664906 4 -0.00231 -2.828425 3.954141 4 1.179013 0.00001 0.008993 -3.695517 3.419967 2.828431 0.002115 -4 0.001811 -4 2.36537 0.000005 -1.17559 -0.000011 -0.00838 -3.695519 0.951115 -2.828423 -1.66382 4 -0.00064 -2.828429 -0.60752 -4 -1.17663 0.000011 0.009472 -1.530736 -2.07343 -2.828431 0.000235 -4 0.001246 -0.000003 -3.22368 -0.000006 1.176972 -0.000012 -0.00946 1.530731 -3.88331 2.828423 1.663959 4 -0.00166 2.828425 -3.95196 4 1.175828 0.000012 0.008905 3.695517 -3.41912 2.828432 -0.00139 -4 0.00123 4 -2.36582 0.000006 -1.17792 -0.000013 -0.00908 3.695519 -0.95231 -2.828423 -1.66438 4 -0.00115 2.828429 0.60627 -4 -1.1757 0.000013 0.009309 1.530737 2.072645 -2.828432 0.001861 -4 0.001392 0.000003 3.223538 -0.000007 1.178443 -0.000014 -0.00915 -1.53073 3.883689 2.828422 1.66473
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号实验报告 离散傅里叶变换及其快速算法及IIR数字滤波器的设计 信号 实验 报告 离散 傅里叶变换 及其 快速 算法 IIR 数字滤波器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)