1、燕山大学信息科学与工程学院页 - 1 -燕 山 大 学多频窄带数字信号处理仿真系统设计学生所在学院:信息学院学生所在班级:电子信息工程 2 班课程名称:数字信号处理 学生姓名: 姜升殿、李林、刘鹏、左园叶、陈敏、黄品程指导教师:陈书贞日期:2014.12.202014 年 12 月燕山大学信息科学与工程学院页 - 2 -多频窄带数字信号处理仿真系统设计姜升殿、李林、黄品程、刘鹏、左园叶、陈敏摘 要本文主要是实现在 TC2.0 的环境下利用 C 语言实现多频窄带数字信号处理仿真系统。系统功能包括信号采集、信号时域及频域分析、FIR 滤波器设计、数字信号滤波,在本文中主要设计四种滤波系统:低通滤波
2、系统、高通滤波系统、带通滤波系统、带阻滤波系统。在 FIR 滤波器设计时使用的是窗函数设计的方法,涉及四种窗函数,分别是矩形窗、哈明窗、汉宁窗、布莱克曼窗。最后本文对设计的系统程序进一步改进,使之可以完成信号模拟到数字的转换功能、根据数字滤波器指标自动完成滤波器设计的功能、四种滤波功能以及个步骤的时域频域图形绘制。关键词:多频窄带数字信号处理仿真系统、FIR 滤波器、C 语言、TC2.0前言: 本次数字信号三级项目是教改后用于帮助同学理解数字信号的理论和提高处理解决问题的能力而设立的,主要是利用数字信号的理论结合编程实现一个多频窄带数字信号处理仿真系统设计。目前的软件解决数字信号处理的有很多,
3、比较好的是 MATLAB,其强大的数字图像处理能力为我们提供了很好的处理环境,但是由于其处理都是集成的,同时给我们的使用带来一定的不便性,对于我们理解信号处理过程和定制我们需要的信号处理软件没有参考价值。故我们选择利用 tc2.0 环境下的 C 语言进行系统设计与编写,预期实现信号的采集、信号时域及频域分析、FIR 滤波器设计、数字信号滤波等功能的多频窄带数字信号处理软件仿真系统。项目组分工:组长姜升殿,负责程序的编写和调试以及报告和汇报 ppt 的部分制作;组员李林,负责报告主要编写;组员陈敏,负责汇报 ppt 的主要制作;组员黄品程,负责部分程序的编写;组员左园叶,负责报告的理论部分整理;
4、组员刘鹏,负责报告的理论部分整理。燕山大学信息科学与工程学院页 - 3 -研究报告正文1 系统整体设计思想本报告主要是用 C 语言在 tc2.0 环境下实现信号采集、信号时域及频域分析、FIR 滤波器设计、数字信号滤波等功能的多频窄带数字信号处理软件仿真系统。由此可知,该报告设计需包括以下系统:A 模拟信号采集模块:完成对模拟信号的采样、量化,使信号变成数字信号。B 显示模块 :完成对信号的时域和频域显示,以便于对信号的频谱和时域分布进行分析。C 滤波器模块:根据模拟信号生成的数字信号的频域特点确定要完成的滤波指标,进而按照一定的原则选择合适的滤波器进行最后要完成的滤波过程。D 滤波模块:系统
5、的最后一步,完成对要求滤除的信号频率的滤除和有用频率分量的保留。具体的系统整体设计流程见图 1-1 系统设计框图:采集模块 滤波器模块显示模块滤波模块模拟信号生成数字滤波器指标图 1-1 系统设计框图2 各模块设计2.1 模拟信号采集模块本项目的研究的原始信号是模拟信号,而计算机只能处理二进制编码形式的数字信号,故模拟信号与数字信号之间需有一个误差比较小或者无误差的转换过程,而这个过程就是通过我们的模拟信号采集模块实现的。由理论知识可知,这个转变过程至少需要满足两个条件,一是数字信号可以无失真的还原原模拟信号,二是数字信号的频域相对于模拟信号的频域发生的改变。无失真的还原原模拟信号就要满足采样
6、频率 fs 大于等于模拟信号的最高频率的二倍。以为例,采样后的数字信号为 ,其y=cos(2*)pifot y=cos( 2*pifns)中 。故编程实现即为:ff燕山大学信息科学与工程学院页 - 4 -void Signal_low_high(int n)/*高通和低通信号滤波测试信号函数 */ int i;for ( i = 0; i #include#include#include#include#define PI 3.1415926#define MAX 600#define f1 10.0#define f2 45.0#define f3 30.0#define fs 100.0/
7、*采样频率*/#define Tp 2 /*信号截取时长*/int L,NN,k,N;/*信号频域采样点 L,原信号 DFT 变换的点数为 NN,k 表示选择窗函数的类型,N 表示窗函数的长度*/float ARRAYRMAX, ARRAYIMAX,DfCvARMAX,DfCvAIMAX, MODULUSMAX,MODULUS1MAX,HrMAX,HiMAX,HdMAX,wnMAX;/*ARRAYR,ARRAYI 数组表示原信号的实部和虚部,DfCvAR,DfCvAI 表示 DFT 变换后的实部和虚部;MODULUS,MODULUS1 表示时域的模值和频域的模值*/*Hr,Hi 数组表示原信号
8、的实部和虚部, Hd 表示理想逼近的单位脉冲响应;wn 表示窗函数数组*/float wc,wl,wh;/*过渡带中心频点*/void Dft(float re, float im, int s,int N11);/*DFT 函数和 IDFT 函数,N11 表示 DFT 和 IDFT 的点数*/void GetModu1(float a, float b,int ll);/*求原信号的幅值*/void GetModu2(float a, float b,int NNN);/*求 DFT 变换后的信号的幅值*/void Signal_low_high(int n);/*信号函数*/void Si
9、gnal_ee(int n);/*信号函数*/void Cir_conv(float h,float x,int h_size,int x_size);/*线性卷积函数*/main()/*主程序开始*/int i,m,n,fff,nn,kk,I,LL,lll;/*as 表示阻带最小衰减,lll 表示循环卷积的点数*/void HDN(),JXC(),HNC(),HMC(),BLKMC(),HDN1(),HDN2(),HDN3();/*HDN,HDN1,HDN2,HDN3 分别表示低通,高通,带通,带阻理想逼近函数*/float JieduanrMAX,JieduaniMAX,HkMAX,Hkx
10、wMAX,arrayrMAX,arrayiMAX;/*Hk 表示设计的函数的频域模值,Hkxw 表示转换为 db 形式的频域模值*/燕山大学信息科学与工程学院页 - 18 -void DFT_FFT();void Convolution_LLL();void GRAPH();void GRAPH1();void choose_window();m=7;n=(int)pow(2,m);/*DFT_FFT LENGTH*/L=Tp*fs;printf(“n“);printf(“please choose what style of filter you wantn“);/*选择设计滤波器类型*/p
11、rintf(“1-low-pass filter 2- high-pass filter 3-band pass filter,4-band stop filter*/;n“);/*1-低通;2-高通;3-带通;4-带阻*/scanf(“%d“,if (fff=%d):n“,(N+NN-1);scanf(“%d“, Cir_conv(arrayr,ARRAYR,N,NN);/*线性卷积得到响应函数*/GetModu1(DfCvAR, DfCvAI,lll);/*响应函数的模值*/GRAPH1(MODULUS1,lll,2,120);/*画滤波后时域的波形*/for(I=0;I0)/*选择窗函数
12、的长度的估计指标*/wp=wph;ws=wsh;elsewp=wpl;ws=wsl;else /*设计低通和高通滤波器的指标*/printf(“please input ws:PI*“);scanf(“%f“,printf(“please input wp:PI*“);scanf(“%f“,wc=(wp+ws)/2;printf(“wc=%f*PIn“,wc);printf(“please input as:“);/*衰减的 DB 绝对值*/scanf(“%d“,if(as74)printf(“can not realize,please quit.n“);getch();switch(k)c
13、ase 1:JXC(n,N);break;case 2:HNC(n,N);break;case 3:HMC(n,N);break;case 4:BLKMC(n,N);break;default:printf(“errorn“);switch(fff)case 1:HDN(n,N);break;case 2:HDN1(n,N);break;case 3:HDN2(n,N);break;case 4:HDN3(n,N);break;default:printf(“errorn“);/*画图程序,用以画函数的时域和频域的图型*/void GRAPH1(float a,int n,int ii,int
14、 high)/*n 表示描点点数,ii 表示步长,high 表示所控制的画图函数的高度*/int gdriver,mode,x,y,m;gdriver=DETECT,mode;initgraph(setbkcolor(42);setcolor(30);cleardevice();x=20;y=200;line(30,200,609,200);for(m=0;m=0;j+,m-)y1k+= h1j*x1m;for (n=0;n=k)j=j-k;k=(int)k/2;j=j+k;for(i=1;i=m;i+)b=(int)pow(2,(i-1);for(j=0;j=(b-1);j+)p=(float)(pow(2,(m-i)*j*2.0*PI/(float)n);for(k=j;k=(n-1);)tr=ARk+b*cos(p)-AIk+b*(-sin(p);ti=AIk+b*cos(p)+ARk+b*(-sin(p);ARk+b=ARk-tr;AIk+b=AIk-ti;ARk=ARk+tr;AIk=AIk+ti;k+=b*2;燕山大学信息科学与工程学院页 - 26 -