青岛科技大学《数字信号处理》课程设计报告题目________________________________________________________________________指导教师__________________________学生姓名__________________________学生学号_________________________________________________________院(部)_____________________专业__班____2014__年_12__月__25_日数字信号分析及数字滤波器设计张淑军11.目的与要求1.进一步巩固数字信号处理中的基本原理与方法,提高分析、解决实际问题的能力。2.熟练掌握一门计算机语言,进行数字信号处理应用的开发设计,训练基本技能,如查阅设计资料和手册、程序的设计、调试等。3选择的题目为(一)《数字信号分析及数字滤波器设计》1.用以下方式产生三个不同频段的信号:(1)自己录制一段正常的语音文件;(2)录制一段环境噪声文件;(3)利用MATLAB产生一个不同于以上频段的信号。2.对上述三个信号,进行频谱分析,画出三路信号的时域波形和频谱图,对进行对比分析。3.根据三路信号的频谱特点得到性能指标,由性能指标设计三个滤波器,并画出各滤波器的频域响应。4.将三路信号叠加为一路信号。5.用自己设计的滤波器对合成的信号进行滤波,分析得到信号的频谱,并画出滤波后信号的时域波形和频谱。2.主要技术和原理2.1语音的输入、处理以及信号的叠加⑴Matlab中语音信号的输入为[x,fs,bits]=wavread('C:\Users\lenovo\Desktop\原始语音.wav',[5000060000]);其中wavread函数读取Microsoft的wav格式音频文件,x为自己随意定义的一个输出函数,fs是采样频率bits表示每个样点的位数,[5000060000]表示读取从50000到60000个点到x中。X_voice=x(:,1)因为音频信号都有两个声道,所以提取出来一个声道进行分析Plot(x)为画出当前的波形,freqz(x)是求离散系统频响特性的函数。随机产生的信号(2)信号的叠加本次实验需要将正常语音信号与噪音信号还有matlab产生的一个信号进行叠加,生成一个新的信号,代码如下f1=22000;f2=25000;fs=50000;t=1/fs;length_x=length(x);input_x=zeros(1,length_x);fori=1:1:length_xinput_x(i)=sin(2*pi*f1*i*t)+sin(2*pi*f2*i*t);input_x=input_x';end正常语音信号的代码:[x,fs,bits]=wavread('C:\Users\lenovo\Desktop\原始语音.wav',[5000060000]);X_voice=x(:,1);input_x=X_voice;噪声语音的代码:[x1,fs1,bits1]=wavread('C:\Users\lenovo\Desktop\ÔëÒô1.wav',[5000060000]);X3_voice=x1(:,1);input_x1=X3_voice;但是信号叠加有一个非常重要的条件就是点数必须相同,不仅点数相同而且点数矩阵得是同一类型,在原始语音和噪声语音的点数10001个,但他们产生的是10001行1列矩阵,而matlab产生的正弦信号却是1行10001列矩阵,结果也不能叠加,这就需要将1行10001列矩阵变成10001行1列矩阵,input_x=input_x';反转语句就是讲input_x的行和列互换。叠加语句:fori=1:1:length_xy1=X_voice+X3_voice+input_x;end2.2FIR滤波器设计原理⑴时间窗口设计法是从单位脉冲响应序列着手,使h(n)逼近理想的单位脉冲响应序列hd(n)。我们知道hd(n)可以从理想频响通过付氏反变换获得221)(onjjdddeeHnh但一般来说,理想频响)(jdeH是分段恒定,在边界频率处有突变点,所以,这样得到的理想单位脉冲响应hd(n)往往都是无限长序列,而且是非因果的。但FIR的h(n)是有限长的,问题是怎样用一个有限长的序列去近似无限长的。最简单的办法是直接截取一段hd(n)代替h(n)。这种截取可以形象地想象为h(n)是通过一个“窗口”所看到的一段hd(n),因此,h(n)也可表达为h(n)和一个“窗函数”的乘积,即h(n)=w(n)hd(n)在这里窗口函数就是矩形脉冲函数RN(n),当然以后我们还可看到,为了改善设计滤波器的特性,窗函数还可以有其它的形式,相当于在矩形窗内对hd(n)作一定的加权处理。(2)本次实验只采用了矩形窗设计方法,由于hd(n)是无限长的,故要用一个有限长的“窗函数”序列w(n)将hd(n)加以截断,窗的点数是N点。截断后的序列为hd(n)h(n)=w(n)hd(n),0=n=N-1窗的点数N及窗的形状是两个极其重要的参数。加窗后实际的频率响应jwHe()jwHe()=DTFT[h(n)]=DTFT[dhnwn()()]=1[()*()]2jwjwHeWe=()-1H()()2jwjwdeWed(3)FIR带通、高通、带阻、多通带多阻带滤波器的设计(1)N长的FIR全通滤波器h(n)的函数表达当c,则低通滤波器变为全通滤波器:1,0)21())21(sin()(NnNnNnnh(2)N长的FIR高通滤波器h(n)的函数表达式由高通的频谱结构可知,高通滤波器的频谱=全通滤波器的频谱-低通滤波器的频谱。1,0)21())21(sin()21())21(sin()(NnNnNnNnNnnhchp(3)N长的FIR带通滤波器h(n)的函数表达式带通滤波器的频谱=低通滤波器H的频谱-低通L滤波器的频谱。1,0)21())21(sin()21())21(sin()(NnNnNnNnNnnhLHBp(3)N长的FIR带通滤波器h(n)的函数表达式带阻滤波器的频谱=全通滤波器的频谱-带通],[LH滤波器的频谱。1,0)21())21(sin()21())21(sin()(NnNnNnNnNnnhLHBp(4)N长的FIR带阻H[,]L滤波器h(n)的函数表达式带阻滤波器的频谱=全通滤波器的频谱-带通[,]HL滤波器的频谱1,0])21())21(sin()21())21(sin([)21())21(sin()(NnNnNnNnNnNnNnnhLHBS(5)N长的FIR多通带多带阻滤波器h(n)的函数表达式多通带多阻带滤波器的频谱=全通滤波器的频谱-带通H11[,]L滤波器的频谱-带通H22[,]L滤波器的频谱。1,0])21())21(sin()21())21(sin([])21())21(sin()21())21(sin([)21())21(sin()(2211NnNnNnNnNnNnNnNnNnNnNnnhLHLHBS3.总体方案设计3.1开发环境和工具Pcwindow8.1matlab2012a3.2具体框架原始信号的录入噪声语音的录入Matlab产生一个信号绘制时域频域波形绘制时域频域波形绘制时域频域波形三路信号叠加成一路信号绘制时域频域波形设计低通滤波器设计高通滤波器设计多通多阻滤波器3.3设计过程(1)信号的获取采集(原始语音,噪声,matlab产生的信号)①录取一段语音信号,fs=44100赫兹,共抽样10001个点②录取一段噪声语音,本次噪声语音就是用电脑自己录的杂音当做噪声,且fs=44100,也是抽取了10001个点③用matlab产生了一个正弦信号抽样频率为50000,f1和f2分别为22000和25000赫兹。(2)对做好的信号要进行处理,用wavread函数将语音信号读进来,取他们的一列,对于正弦信号要进行转置input_x=input_x';以便于后面对信号的叠加做准备。(3)绘制语音信号的时域波形的频域波形(4)根据(3)设计出来的频谱特性进行分析,根据分析的结果设计滤波器,在画出各个滤波器的频谱以及时域波形。(5)将做好的三路信号叠加成一路信号,在对叠加好的信号画频谱。(6)将设计好的滤波器分别与此信号卷积进行滤波,在画出滤波后的信号的频谱。(7)最后将语音恢复,输出到指定文件夹下。4.实验结果与分析4.1这部分是实现对原始语音的处理具体代码如下:[x,fs,bits]=wavread('C:\Users\lenovo\Desktop\原始话音.wav',[5000060000]);%对原始话音读取到x中X_voice=x(:,1);%提取声道1input_x=X_voice;%将声道1赋给input_xfigure(1);plot(input_x);对input_x画时域波形title('原始话音波形');figure(1);freqz(input_x);%对input_x画频谱波形title('原始话音频谱');X1_voice=x(:,2);%提取声道2input_x=X1_voice;%将声道2赋给input_xfigure(3);plot(input_x);与y1相卷积进行滤波与y1相卷积进行滤波与y1相卷积进行滤波语音恢复成wav格式语音恢复成wav格式语音恢复成wav格式title('原始话音波形');figure(4);freqz(input_x);title('原始话音频谱');y=X_voice+X1_voice;&将两个信号叠加为原始语音信号figure(5);plot(y);title('原始话音波形');figure(6);freqz(y);title('原始话音频谱');主要用到的函数wavread是对语音信号的读取,但只能是wav格式,plot(input_x);是画图函数,将input_x画出来,freqz(input_x);是求input_x的频谱并将其画出。实验结果图如下:上图为声道1的波形和频谱,只是提取了10001个点进行分析,此频谱特点是图上在f=2800,11250,21400赫兹处出现了尖峰。这里只对提取的一个声道分析,代表了此信号。4.2实现对噪音信号的处理模块及其实现代码:[x1,fs1,bits1]=wavread('C:\Users\lenovo\Desktop\ÔëÒô1.wav',[5000060000]);X3_voice=x1(:,1);input_x1=X3_voice;figure(9);plot(input_x1);title('原始噪音波形');figure(10);freqz(input_x1);title('原始噪音频谱图');此模块与正常语音的的处理大同小异,只是在噪音里我只提取了一个声道,用到的函数与处理正常语音用到的函数一样。实验结果图如下以下两个图一个是噪音频谱,另一个是噪音波形,我也是对噪音提取了10001个点进行分析,从频谱上看,在f=6700赫兹以前信号的频率比较高,但不是很高,就设计一个高通滤波器将较高的信号滤除,使产生一个平稳的信号,此噪音不突出,一方面跟采样点数有关系,另一方面录制噪音的时候尖峰不够,但主要考察滤波器设计及其分析,不影响整体。4.3实现matlab产生的正弦信号及其代码:f1=22000;%输入信号f1f2=25000;%输入信号f2fs=50000;%fs为抽样频率t=1/fs;length_x=length(x);%输入信号的长度input_x=zeros(1,leng