当前位置:文档之家› 题目十一: 数字音频回声系统的处理实验报告

题目十一: 数字音频回声系统的处理实验报告

通信系统工程应用训练实验报告题目:数字音频回声系统的处理专业:通信工程姓名: 吕迪学号:13024219指导教师:孙恩昌完成日期:2016年6月6日一、实验目的(1)加深对IIR滤波器基本原理的理解;(2)学习利用IIR滤波器的C语言程序;(3)了解数字音频回声处理的方法,提高分析和解决问题的能力。

二、实验内容下面是一个对实际效果模拟的组合方案,如图3所示。

其中左面的子系统是延迟相加模块,滤波器参数分别为1)α=0.75,b=1,R=292)α=0.75,b=0.9,R=373)α=0.75,b=0.8,R=444)α=0.75,b=0.7,R=50右面的子系统是第二个延迟相加模块,参数为1)α=0.75,R=272)α=0.75,R=31输入一个脉冲信号,观察输出信号的波形(脉冲响应)。

图3 数字音频回声系统模拟三、实验思路及流程图四、实验结果单位冲击响应时延29滤波后图形单位冲击响应时延37滤波后图形单位冲击响应时延44滤波后图形单位冲击响应时延55滤波后图形滤波后求和后图形求和后时延27滤波后图形再次时延31滤波后图形DFT变换后频谱图五、实验程序#include "stdafx.h"#include"D:\x_math.cpp"#include"D:\x_graph.cpp"void Filter1(int t,double x[]); //延迟相加模块一void Filter2(double a,double b,double x[],int c0); //延迟相加模块二void Filter3(double a,double b,double x[]); //延迟相加模块三void plotgri2test(COLORREF gridcolor,COMPLEX p[],int N); //二维绘图函数double a[60];double b[60];double c[60];double d[60];int main(int argc, char* argv[]){int i;double x1[60];COMPLEX X2[60],X3[60];FILE *txtfile1;FILE *txtfile2;FILE *txtfile3;FILE *txtfile4;FILE *txtfile5;FILE *txtfile6;FILE *txtfile7;x1[0]=1; //在零时刻提供一个脉冲for(i=1;i<60;i++)x1[i]=0;for(i=0;i<60;i++)a[i]=0;window2("IIR数字滤波器-29",-2,3,70,-1,"t","f(t)");HPEN pen1=CreatePen(PS_SOLID,5,BLACK),oldpen=(HPEN)SelectObject(win2.hdc,pen1);//创建画笔HPEN pen2=CreatePen(PS_SOLID,1,RED);HPEN pen3=CreatePen(PS_SOLID,5,BLUE);xy2(GREEN);//画xy轴。

Filter1(29,x1);SelectObject(win2.hdc,pen3);for(int n=0;n<60;n++){line2(n,0,n,a[n]);}SelectObject(win2.hdc,pen2);for( n=0;n<60;n++){line2(n,0,n,x1[n]);}getch();//等待for(i=0;i<60;i++){b[i]=a[i];} //将结果存进数组b,进行求和txtfile1=fopen("1.txt","w");for(n=0;n<60;n++){fprintf(txtfile1,"%lf,",a[n]);}//将滤波结果存至txt文档fclose(txtfile1);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器-37",-2,3,70,-1,"t","f(t)");xy2(GREEN);//画xy轴。

Filter1(37,x1);SelectObject(win2.hdc,pen3);for( n=0;n<60;n++){line2(n,0,n,a[n]);}SelectObject(win2.hdc,pen2);for( n=0;n<60;n++){line2(n,0,n,x1[n]);}getch();//等待for(i=0;i<60;i++){b[i]=b[i]+0.9*a[i];}//进行求和txtfile2=fopen("2.txt","w");for(n=0;n<60;n++){fprintf(txtfile2,"%lf,",a[n]);}//将滤波结果存至txt文档fclose(txtfile2);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器-44",-2,3,70,-1,"t","f(t)");xy2(GREEN);//画xy轴。

Filter1(44,x1);SelectObject(win2.hdc,pen3);for( n=0;n<60;n++){line2(n,0,n,a[n]);}SelectObject(win2.hdc,pen2);for( n=0;n<60;n++){line2(n,0,n,x1[n]);}getch();//等待for(i=0;i<60;i++){b[i]=b[i]+0.8*a[i];}//进行求和txtfile3=fopen("3.txt","w");for(n=0;n<60;n++){fprintf(txtfile3,"%lf,",a[n]);}//将滤波结果存至txt文档fclose(txtfile3);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器-55",-2,3,70,-1,"t","f(t)");xy2(GREEN);//画xy轴。

Filter1(55,x1);SelectObject(win2.hdc,pen3);{line2(n,0,n,a[n]);}SelectObject(win2.hdc,pen2);for( n=0;n<60;n++){line2(n,0,n,x1[n]);}getch();//等待for(i=0;i<60;i++){b[i]=b[i]+0.7*a[i];}//进行求和txtfile4=fopen("4.txt","w");for(n=0;n<60;n++){fprintf(txtfile4,"%lf,",a[n]);}//将滤波结果存至txt文档fclose(txtfile4);txtfile5=fopen("5.txt","w");for(n=0;n<60;n++){fprintf(txtfile5,"%lf,",b[n]);}//将求和结果输出为txt文档fclose(txtfile5);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器求和",-2,5,70,-1,"t","f(t)");xy2(GREEN);//画xy轴。

SelectObject(win2.hdc,pen3);{line2(n,0,n,b[n]);}getch();//等待frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器-27",-5,5,70,-5,"t","f(t)");xy2(GREEN);//画xy轴。

Filter2(-0.75,0.75,b,27);SelectObject(win2.hdc,pen3);for( n=0;n<60;n++){line2(n,0,n,c[n]);}getch();//等待txtfile6=fopen("6.txt","w");for(n=0;n<60;n++){fprintf(txtfile6,"%lf,",c[n]);}//将滤波结果存至txt文档fclose(txtfile6);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框window2("IIR数字滤波器-31",-4,5,70,-5,"t","f(t)");xy2(GREEN);//画xy轴。

Filter3(-0.75,0.75,c);SelectObject(win2.hdc,pen3);for( n=0;n<60;n++){line2(n,0,n,d[n]);}getch();//等待txtfile7=fopen("7.txt","w");for(n=0;n<60;n++){fprintf(txtfile7,"%lf,",d[n]);}//将滤波结果存至txt文档fclose(txtfile7);frame2(win2.xstr,win2.ystr);//清除用户绘图区域,重画边框频谱图window2("频域图",-1,5,70,-5,"w","f(w)");xy2(BLUE);for(i=0;i<60;i++){X3[i]=COMPLEX(d[i],0);X2[i]=COMPLEX(0,0);} dft(X2,X3,60,1);plotgri2test(RED,X2,60);getch();//等待return 0;}void Filter1(int t,double x[]){int n;for( n=0;n<60;n++){if(n<t){a[n]=x[n];}else{a[n]=x[n]+0.75*a[n-t];}}}void Filter2(double a,double b,double x[],int c0) {int n;for( n=0;n<60;n++){if(n<c0){c[n]=a*x[n];}else{c[n]=a*x[n]+x[n-c0]+b*c[n-c0];}}}void Filter3(double a,double b,double x[]){int n;for( n=0;n<60;n++){if(n<31){d[n]=a*x[n];}else{d[n]=a*x[n]+x[n-31]+b*d[n-31];}}}void plotgri2test(COLORREF gridcolor,COMPLEX p[],int N) //二维绘图函数{int i;HPENpen1=CreatePen(PS_SOLID,1,gridcolor),oldpen=(HPEN)SelectObject(win2.hdc,pen1);for(i=0;i<N;i++){moveto2(i,0);lineto2(i,abs(p[i])); //lineto2(i,sqrt((p[i].r*p[i].r)+(p[i].i*p[i].i)));}SelectObject(win2.hdc,oldpen);DeleteObject(pen1);}六、心得体会通过本次实验,我体会到了编写一个滤波器程序的过程,让我收获颇丰,在编写程序的过程中,首先要有编写的思路,写出流程图,搭出框架,在具体算法的编写过程中,有些语句会出现错误,需要经过反复的调试来修改错误,还有一些语句的使用不够熟悉,需要查阅资料或者请教其他同学;除此之外,我还体会到了团队协作的力量,在本次实验中,我主要负责了绘图部分以及滤波器函数程序的编写工作,我和我的搭档相互帮助,相互讨论,最终完成了实验任务。

相关主题