数字信号处理三级项目Word下载.docx
- 文档编号:18059969
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:33
- 大小:544.25KB
数字信号处理三级项目Word下载.docx
《数字信号处理三级项目Word下载.docx》由会员分享,可在线阅读,更多相关《数字信号处理三级项目Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
1系统整体设计思想
本报告主要是用C语言在tc2.0环境下实现信号采集、信号时域及频域分析、FIR滤波器设计、数字信号滤波等功能的多频窄带数字信号处理软件仿真系统。
由此可知,该报告设计需包括以下系统:
A模拟信号采集模块:
完成对模拟信号的采样、量化,使信号变成数字信号。
B显示模块:
完成对信号的时域和频域显示,以便于对信号的频谱和时域分布进行分析。
C滤波器模块:
根据模拟信号生成的数字信号的频域特点确定要完成的滤波指标,进而按照一定的原则选择合适的滤波器进行最后要完成的滤波过程。
D滤波模块:
系统的最后一步,完成对要求滤除的信号频率的滤除和有用频率分量的保留。
具体的系统整体设计流程见图1-1系统设计框图:
图1-1系统设计框图
2各模块设计
2.1模拟信号采集模块
本项目的研究的原始信号是模拟信号,而计算机只能处理二进制编码形式的数字信号,故模拟信号与数字信号之间需有一个误差比较小或者无误差的转换过程,而这个过程就是通过我们的模拟信号采集模块实现的。
由理论知识可知,这个转变过程至少需要满足两个条件,一是数字信号可以无失真的还原原模拟信号,二是数字信号的频域相对于模拟信号的频域发生的改变。
无失真的还原原模拟信号就要满足采样频率fs大于等于模拟信号的最高频率的二倍。
以
为例,采样后的数字信号为
其中
。
故编程实现即为:
voidSignal_low_high(intn)/*高通和低通信号滤波测试信号函数*/
{inti;
for(i=0;
i<
n;
i++)
{
ARRAYI[i]=0.0;
ARRAYR[i]=(float)cos(2*PI*i*f1/fs)+(float)cos(2*PI*i*f2/fs);
}
}
程序中ARRAYR,ARRAYI数组表示采集数字信号的实部和虚部。
2.2显示模块
为了实现信号的采样滤波过程的图形显示,本次项目选择用TC2.0编译环境实现对信号的时域和频域显示。
考虑到信号包含实部和虚部,因此程序编写时为了方便,选择将一个信号用实部和虚部表示。
因此显示的时候就出现了两种情况,时域显示和频域显示,信号不同域波形需要不同的求模函数实现对信号的强度的表示,具体程序函数声明为:
/*取模函数,主要用来对时域信号的取模*/
voidGetModu1(floata[],floatb[],intll)
/*取模函数,主要用来对频域信号的取模*/
voidGetModu2(floata[],floatb[],intNNN)
在具体的DOS环境下的图形显示,考虑系统功能实现问题,设计两个绘图函数,GRAPH用于专门显示窗函数的衰减曲线,GRAPH1通用绘图函数为显示步骤中函数的时域和频域,具体见程序:
/*画图程序,用以画窗函数的时域图*/
voidGRAPH(floatxw[MAX],intnn,intkk)/*xw表示窗函数,nn表示描点点数,kk表示滤波器类型*/
/*画图程序,用以画函数的时域和频域的图型*/
voidGRAPH1(floata[],intn,intii,inthigh)/*n表示描点点数,ii表示步长,high表示所控制的画图函数的高度*/
2.3滤波器模块
本项目选择使用FIR滤波器设计方法。
FIR滤波器通常采用窗函数方法来设计。
窗设计的基本思想是,首先选择一个适当的理想选频滤波器(它总是具有一个非因果,无限持续时间脉冲响应),然后截取(加窗)它的脉冲响应得到线性相位和因果FIR滤波器。
因此这种方法的重点是选择一个合适的窗函数和理想滤波器。
我们用
表示理想的选频滤波器,它在通带上具有单位增益和线性相位,在阻带上具有零响应。
一个带宽
的低通滤波器由下式给定:
为了从
得到一个FIR滤波器,必须同时在两边截取
而要得到一个因果的线性相位滤波器,它的
长度为
,必须有:
这种操作叫做加窗,
可以看作是
与窗函数
的乘积:
其中
根据
的不同定义,可以得到不同的窗结构。
在频域中,因果FIR滤波器响应
由
和窗响应
的周期卷积得到,即:
常用的窗函数有矩形窗、巴特利特(BARTLETT)窗、汉宁(HANNING)窗、海明(HAMMING)窗、布莱克曼(BLACKMAN)窗、凯泽(KAISER)窗等。
窗函数设计的具体步骤见流程图2-1:
图2-1窗函数设计流程图
图2-2滤波器指标选择窗和理想响应流程
本项目实现提供四个窗函数选择,分别是矩形窗、哈明窗、汉宁窗、布莱克曼窗,通过给定的数字滤波器指标可以求出wn(n)窗函数,wn(n)窗函数得到程序实现上见附录程序中JXC(),HNC(),HMC(),BLKMC()四个窗函数子函数。
具体选择的窗函数类型需根据as阻带最小衰减,ws阻带截止频率,wp通带截止频率,wsl、wsh、wpl、wph带通带阻滤波器的上下边带阻带通带截止频率确定,由指标选择窗函数的子程序见choose_window()子程序,具体见流程图2-2。
理想单位脉冲函数Hd(n)获取上,因为我们设计的滤波器为低通、高通、带通、带阻四种,故需要四个能产生理想逼近单位响应函数的子函数。
查阅资料可知,对于高通滤波器函数来说,其理想频率响应
和理想单位脉冲响应函数
分别为:
对于带通滤波器函数来说,其理想频率响应
对于带阻滤波器函数来说,其理想频率响应
所以,由公式可以编写具体的函数产生程序,具体
函数的产生见附录子函数HDN(),HDN1(),HDN2(),HDN3()程序。
滤波器的单位脉冲响应h(n)得到是窗函数设计滤波器的最后一步,又流程图3-1可知,h(n)=Wn(n)*Hd(n),通过一个简单的for循环即可实现最后的相乘工作,即程序:
for(i=0;
i<
i++)/*时域加窗处理*/
{Hr[i]=Hd[i]*wn[i];
Hi[i]=0.0;
2.4滤波模块
滤波模块是设计的多频窄带数字信号处理仿真系统的最后一个步骤。
该步骤的设计流程图见图2-3。
图2-3滤波设计流程图
流程图中的截断处理是因为线性卷积过程中会在输出信号的两边形成过渡带,过渡带中包含的信号并不是我们想要的信号,而且过渡带中包含许多我们不想要的频率分量,因此为避免上述的过渡带带来的影响,我们对线性卷积的得到的结果进行截断处理,使得到的输出信号y(n)与原信号等长,这也满足我们对数字信号处理的基本要求。
在程序的具体实现上,线性卷积程序为Cir_conv()子函数程序(具体见附录程序),截断函数程序为
for(I=0;
I<
NN;
I++)/*对滤波信号进行截断处理*/
{Jieduanr[I]=DfCvAR[I+(N-1)/2];
Jieduani[I]=DfCvAI[I+(N-1)/2];
在信号的分析过程中,对于时域频域之间的转换,我们的设计思路是以DFT(程序见附录Dft子函数)变换为主,以FFT(程序见附录DFT_FFT子函数)变换为辅。
因FFT程序运行速度快,但变换点数必须为2的幂次,因此主要用来完成窗函数的时域到频域的转换;
其他时域频域之间的不定点转换则选择DFT实现。
3滤波实现
3.1低通滤波(程序见附录)
测试信号函数为10Hz和45Hz的混合信号,采样频率为100Hz,采样时间为2.0s,测试信号DFT变换点数为200点。
实现对45Hz高频信号的滤出,信号的时域波形和频域波形见图3-1-1与图3-1-2。
图3-1-1测试信号时域波形
图3-1-2测试信号频域波形
运行结果图:
图3-1-3滤波器指标输入
图3-1-4窗函数时域波形
图3-1-5滤波未截断时域波形
图3-1-6滤波截断后时域波形
图3-1-7滤波截断后频域波形
图3-1-8窗函数衰减波形
3.2高通滤波(程序见附录)
实现对10Hz低频信号的滤出。
信号的时域波形和频域波形见图3-1-1与图3-1-2。
运行结果图为:
图3-2-1滤波器指标输入
图3-2-2滤波未截断时域波形
图3-2-3滤波截断后时域波形
图3-2-4滤波截断后频域波形
图3-2-5窗函数衰减波形
3.3带通滤波(程序见附录)
测试信号函数为10Hz、30Hz、45Hz的混合信号,采样频率为100Hz,采样时间为2.0s,测试信号DFT变换点数为200点。
实现对10Hz和45Hz频率信号的滤出。
信号的时域波形和频域波形见图3-3-1与图3-3-2。
图3-3-1测试信号的时域波形
图3-3-2测试信号的频域波形
图3-3-3滤波器指标输入
图3-3-4滤波未截断时域波形
图3-3-5滤波截断后时域波形
图3-3-6滤波截断后频域波形
图3-3-7窗函数衰减波形
3.4带阻滤波(程序见附录)
实现对30Hz频率信号的滤出。
图3-4-1滤波器指标输入
图3-4-2滤波未截断时域波形
图3-4-3滤波截断后时域波形
图3-4-4滤波截断后频域波形
图3-4-5窗函数衰减波形
4项目结论与感想
项目开展至结束,时间紧迫,但收获颇丰。
这次我们采用分组合作来开展我们的课题,所谓“男女搭配干活不累”,在这次分组开展的研究中体现的淋漓尽致。
男生热爱钻研,冲劲十足,是小组攻坚的信心来源和决断力来源;
女生心思细腻,做事谨慎,在发现问题、解决问题以及后期材料整理方面贡献了重要力量。
通过这次的项目研究,让我们加深了对C语言和数字信号处理理论的理解,使得之后的运用更加熟练。
除此之外,讨论的过程让我们学到了别人知道但自己还不是很熟悉的知识,还纠正了一些理论知识学习中自己没有发现的错误。
同时感谢老师的帮助,才能使我们在问题不能解决的情况下走出困境。
参考文献
[1]郑君里.信号与系统[M].北京:
高等教育出版社,2000.
[2]高西全.数字信号处理第三版[M].西安:
西安电子科技大学出版社,2001.
[3]林建秋韩静萍.C语言程序人设计[M].北京:
机械工业出版社,2004.1
附录:
/*本程序可以实现信号的低通、高通、带通、带阻的滤波*/
#include<
graphics.h>
stdio.h>
conio.h>
math.h>
stdlib.h>
#definePI3.1415926
#defineMAX600
#definef110.0
#definef245.0
#definef330.0
#definefs100.0/*采样频率*/
#defineTp2/*信号截取时长*/
intL,NN,k,N;
;
/*信号频域采样点L,原信号DFT变换的点数为NN,k表示选择窗函数的类型,N表示窗函数的长度*/
floatARRAYR[MAX],ARRAYI[MAX],DfCvAR[MAX],DfCvAI[MAX],MODULUS[MAX],MODULUS1[MAX],Hr[MAX],Hi[MAX],Hd[MAX],wn[MAX];
/*ARRAYR,ARRAYI数组表示原信号的实部和虚部,DfCvAR,DfCvAI表示DFT变换后的实部和虚部;
MODULUS,MODULUS1表示时域的模值和频域的模值*/
/*Hr,Hi数组表示原信号的实部和虚部,Hd表示理想逼近的单位脉冲响应;
wn表示窗函数数组*/
floatwc,wl,wh;
/*过渡带中心频点*/
voidDft(floatre[],floatim[],ints,intN11);
/*DFT函数和IDFT函数,N11表示DFT和IDFT的点数*/
voidGetModu1(floata[],floatb[],intll);
/*求原信号的幅值*/
voidGetModu2(floata[],floatb[],intNNN);
/*求DFT变换后的信号的幅值*/
voidSignal_low_high(intn);
/*信号函数*/
voidSignal_ee(intn);
voidCir_conv(floath[],floatx[],inth_size,intx_size);
/*线性卷积函数*/
main()/*主程序开始*/
{
inti,m,n,fff,nn,kk,I,LL,lll;
/*as表示阻带最小衰减,lll表示循环卷积的点数*/
voidHDN(),JXC(),HNC(),HMC(),BLKMC(),HDN1(),HDN2(),HDN3();
/*HDN,HDN1,HDN2,HDN3分别表示低通,高通,带通,带阻理想逼近函数*/
floatJieduanr[MAX],Jieduani[MAX],Hk[MAX],Hkxw[MAX],arrayr[MAX],arrayi[MAX];
/*Hk表示设计的函数的频域模值,Hkxw表示转换为db形式的频域模值*/
voidDFT_FFT();
voidConvolution_LLL();
voidGRAPH();
voidGRAPH1();
voidchoose_window();
m=7;
n=(int)pow(2,m);
/*DFT_FFTLENGTH*/
L=Tp*fs;
printf("
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
);
pleasechoosewhatstyleoffilteryouwant\n"
/*选择设计滤波器类型*/
1-low-passfilter2-high-passfilter3-bandpassfilter,4-bandstopfilter*/;
\n"
/*1-低通;
2-高通;
3-带通;
4-带阻*/
scanf("
%d"
&
fff);
if(fff<
=2)/*选择测试滤波器函数*/
{Signal_low_high(L);
/*低通高通信号函数*/
else
{Signal_ee(L);
/*带通带阻信号函数*/
yoursignalstylesare%d\n"
L);
PleaseInputx(n)-DFTNN:
&
NN);
GetModu1(ARRAYR,ARRAYI,NN);
GRAPH1(MODULUS1,NN,3,20);
/*画原信号的时域波形*/
Dft(ARRAYR,ARRAYI,1,NN);
GetModu2(DfCvAR,DfCvAI,NN);
GRAPH1(MODULUS,NN,3,5);
/*画原信号的频域波形*/
choose_window(fff,n);
for(i=0;
i++)
Hr[i]=Hd[i]*wn[i];
}/*时域加窗处理*/
GRAPH1(Hr,n,6,300);
/*画加窗后的时域图*/
for(I=0;
I<
I++)
arrayr[I]=Hr[I];
arrayi[I]=Hi[I];
DFT_FFT(Hr,Hi,m,n);
{Hk[i]=sqrt(pow(Hr[i],2)+pow(Hi[i],2));
}/*加窗处理后的频域幅值*/
{Hkxw[i]=20*log10(Hk[i]);
}
GRAPH(Hkxw,n,k);
/*画加窗后的频域图*/
PleaseInputconvolutionLLL(LLL>
=%d):
(N+NN-1));
lll);
Cir_conv(arrayr,ARRAYR,N,NN);
/*线性卷积得到响应函数*/
GetModu1(DfCvAR,DfCvAI,lll);
/*响应函数的模值*/
GRAPH1(MODULUS1,lll,2,120);
/*画滤波后时域的波形*/
for(I=0;
Jieduanr[I]=DfCvAR[I+(N-1)/2];
Jieduani[I]=DfCvAI[I+(N-1)/2];
GRAPH1(Jieduanr,NN,2,80);
/*画滤波后时域截断的波形*/
Dft(Jieduanr,Jieduani,1,NN);
/*响应函数的频域模值*/
GetModu2(DfCvAR,DfCvAI,NN);
GRAPH1(MODULUS,NN,2,2);
/*画滤波后频域的波形*/
getch();
/*主程序结束*/
intgdriver,mode,i;
gdriver=DETECT,mode;
initgraph(&
gdriver,&
mode,"
C:
\\TC20\\BGI"
setbkcolor(42);
setcolor(30);
moveto(30,30);
line(30,30,619,30);
line(30,30,30,430);
nn;
{xw[i]=abs(xw[i]);
nn/2;
{lineto(30+i*3,30+xw[i]*3);
for(i=30;
240;
i+=30)
{line(30,30+i,25,30+i);
for(i=30+i;
=386;
i+=96)
{line(30+i,30,30+i,35);
outtextxy(23,23,"
O"
outtextxy(0,34,"
(db)"
outtextxy(0,90,"
-20"
outtextxy(0,150,"
-40"
outtextxy(0,210,"
-60"
outtextxy(130,37,"
/2"
outtextxy(226,37,"
1"
outtextxy(322,37,"
3/2"
outtextxy(420,37,"
"
if(kk==1)outtextxy(100,400,"
---RECTANGLEWINDOW---"
if(kk==2)outtextxy(100,400,"
---HANNINGWINDOW---"
if(kk==3)outtextxy(100,400,"
if(kk==4)outtextxy(100,400,"
---BLACKMANWINDOW---"
outtextxy(100,420,"
PRESSANYKEYTOEND."
setbkcolor(0);
setcolor(15);
closegraph();
voidchoose_window(intfff,intn)
floatws,wp,wsl,wsh,wpl,wph;
/*ws表示阻带截止频率,wp表示通带截止频率,wsl,wsh,wpl,wph表示带通带阻滤波器的上下边带阻带通带截止频率*/
intas;
if(fff==3||fff==4)/*设计带通和带阻滤波器的指标*/
pleaseinputwsl:
PI*"
%f"
wsl);
pleaseinputwpl:
wpl);
wl=(wpl+wsl)/2;
wl=%f*PI\n"
wl);
pleaseinputwsh:
wsh);
pleaseinputwph:
wph);
wh=(wph+wsh)/2;
wh=%f*PI\n"
wh);
if((fabs(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字信号 处理 三级 项目