语音噪声滤波.docx

上传人:b****6 文档编号:9212791 上传时间:2023-02-03 格式:DOCX 页数:53 大小:1.13MB
下载 相关 举报
语音噪声滤波.docx_第1页
第1页 / 共53页
语音噪声滤波.docx_第2页
第2页 / 共53页
语音噪声滤波.docx_第3页
第3页 / 共53页
语音噪声滤波.docx_第4页
第4页 / 共53页
语音噪声滤波.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

语音噪声滤波.docx

《语音噪声滤波.docx》由会员分享,可在线阅读,更多相关《语音噪声滤波.docx(53页珍藏版)》请在冰豆网上搜索。

语音噪声滤波.docx

语音噪声滤波

 

DSP课程设计实验报告

语音噪声滤波

 

院(系):

电子信息工程学院

小组成员:

通信0707班高砾琦07211201

通信0708班李淼07281156

指导教师:

高海林

目录

一、设计任务3

二、设计内容4

三、设计思路5

四、算法原理6

1、FIR滤波器算法6

2、直接存储器访问DMA7

3、A/D和D/A转换器9

4、LMS算法9

五、主要函数介绍14

六、程序设计、调试19

七、实验结果分析37

1、低通滤波器的对比37

2、语音自适应滤波效果49

八、实验心得与体会53

一、设计任务

语音通信的目的是传递声音信息。

位于甲地的通信者发出的声音经语音传感器变换成为电信号,经发送端设备变换为适合传输的形式,通过传输信道传输到乙地。

在乙地经接收端设备恢复出原来的语音信号,经耳机或者喇叭转换为接收者可以听到的声音信号。

这就是最基本的语音通信系统,但是由于周围环境的原因,我们采集到语音信号经常含有不同程度的噪声。

典型语音通信系统中的噪声来自三个方面:

①信号处理设备产生的电噪声及传输信道中的电噪声;②信号发送端空间环境中的音频噪声信号经麦克风变换为电信号之后,与有用信号其同传递到接收端;③信号接收端空间环境中的音频噪声对信号接收者的影响。

噪声是由于发生体作无规则振动产生的。

在很多情况下,环境中的背景噪声是通信系统中噪声干扰的主要来源。

当语音信号受到背景噪声干扰时语音通信质量变得不可接受,因此要对语音信号中的噪声滤除。

DSP利用直接存储器访问方式DMA(DirectMemoryAccess)采集数据时不打扰CPU,因此利用DMA方式工作时,CPU可以对语音信号进行实时地滤波。

本设计要求利用DSP的DMA方式进行信号采集和信号输出,对语音信号进行数字编码,滤波后进行解码。

自适应滤波不仅能够选择信号,而且能够控制信号的特性。

自适应滤波器具有跟踪信号和噪声变化的能力,它的系数能够被一种自适应算法所修改。

利用DSP可以实时地对信号进行自适应滤波。

DSP利用直接存储器访问方式DMA采集数据时不打扰CPU,因此CPU可以对信号进行实时地滤波。

本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行数字滤波。

这就是这次设计所要完成的任务。

二、设计内容

基本部分:

(1)对DMA进行初始化;

(2)对A/D、D/A进行初始化;

(3)编写DMA中断服务程序和滤波算法程序,实现语音信号的实时滤波;

(4)设计FFT算法,或调用DSPLIB中的FFT函数,实现对信号的频谱分析;

(5)设计子自适应滤波算法,调用DSPLIB中的自适应函数,实现对信号的自适应滤波。

发挥部分:

1)利用自适应滤波实现语音信号的回波对消。

2)比较加不同窗和阶数时滤波器的滤波效果;

3)测试所设计滤波器的幅频特性和相频特性,并与MATLIB下的设计结果进行比较。

要求完成的任务

(1)编写C语言程序,并在CCS集成开发环境下调试通过;

(2)将包含噪声的语音信号进行滤波,从扬声器输出端口输出,比较滤波前后的信号的变化;

(3)按要求撰写设计报告。

 

三、设计思路

首先利用DSP的DMA方式对外部含噪声的语音信号进行实时采集,语音信号先经过A/D转换为数字信号,利用MCBSP的接收寄存器接收数据。

编写滤波算法程序,而且调用DSPLIB的lms中的滤波函数,对信号进行滤波。

滤波后的数据利用DMA方式送到D/A转换器转换为模拟信号。

这就是我们的设计思路。

具体的设计方案原理图如下。

模拟输入信号通过DSK的MIC端口输入,经A/D转换,然后到达DSP的DMA通道2,DSP接收到信号后,调用中断服务程序进行滤波,选择滤波模式进行不同种类的滤波,滤波后的信号可以在CCS上显示,也可以通过DMA通道3将信号输出到D/A转换器,经D/A转换后从SPEAKER端口输出。

四、算法原理

1、FIR滤波器算法

FIR滤波器是指系统的单位脉冲响应h[k]仅在有限范围内有非零值的滤波器。

在本设计实验中,滤波占有十分重要的地位。

数字滤波是数字信号处理的基本方法。

在许多信息处理过程中,如对信号的过滤、检测、预测等,都要广泛地用到滤波器,而数字滤波器则因其设计灵活、实现方便等特点而广为接受。

所谓数字滤波器就是具有某种选择性的器件、网络或以计算机硬件支持的计算程序。

其功能本质是按事先设计好的程序,将一组输人的数字序列通过一定的运算后转变为另一组输出的数字序列,从而改变信号的形式和内容,达到对信号加工或滤波以符合技术指标的要求。

数字滤波器是语音、图象处理、模式识别以及谱分析中的重要的处理运算环节。

DSP由于其本身具有并行的硬件乘法器、流水结构以及快速的片内存储器等资源,其技术已广泛地应用于噪声及振动的各个领域。

因此用DSP芯片实现FIR数字滤波,除具有准确度高、不受环境影响等优点外,由于DSP芯片具有可编程特性,程序的可移植性好,灵活性强。

实际应用时只需按要求修改滤波器参数,并对程序作较少的改动,即可实现不同截止频率的FIR滤波器,实用性较强。

下面简单介绍一下数字滤波器的基本原理。

数字滤波器原理一般具有如下差分方程:

y(n)=∑akx(n-k)+∑bky(n-k)

(1)

式中x(n)为输人序列,y(n)为输出序列,ak和bk为滤波器系数,,N是滤波器阶数。

当所有的bk均为零,则有

y(n)=∑akx(n-k)

(2)

(2)式是FIR滤波器的差分方程,其一般形式为

y(n)=∑h(k)x(n-k)(3)

对(3)式进行z变换,整理后可得FIR滤波器的传递函数:

H(Z)==∑h(k)z-k(4)

FIR数字滤波器的设计方法主要有窗函数法和频率抽样设计法,其中窗函数法是基本而有效的设计方法。

下面为FIR滤波器的算法实现方法。

FIR滤波为有限冲击响应滤波,其滤波结构是一个分节的延时线,每节的输出加权累加,得到滤波器的输出。

由前面的分析知,FIR滤波器数学上可表示为:

y(n)=∑h(k)x(n-k)(5)

式(5)中x[n]为最近(t=nT)的输人信号,x[n-k]是延时了k个取样周期的输人信号,h[k]是第k个延时节的加权值(即滤波器系数),可由MATLAB设计出来,y[n]是时刻t=nT时滤波器的输出信号,N是滤波器的阶数也称滤波器的抽头数,为实整数,且须满足N×t<1/fs,其中fs为采样频率,,tmac为每个抽头数乘加运算的时间,从这个式子和结构可以看出,为什么称之为有限冲激响应滤波器。

因为该滤波器的冲激响应在N个周期后变为0也就是每次乘加运算都要用到之前N个数。

滤波器系数可通过MATLAB设计得到,若采用海明窗设计的FIR滤波器是一个32阶的低通滤波器,截止频率为150Hz.由“MATLAB设计FIR滤波器”可得h(n),这样设计的滤波系数再经过量化即得。

本次设计实验中,FIR滤波器可以通过编写滤波算法程序,或调用DSPLIB中的滤波函数来实现。

但一般调用DSPLIB中的滤波函数不能够达到很好的滤波效果,所以我们采用编写滤波算法程序来实现FIR滤波器。

2、直接存储器访问DMA

直接存储器访问(DirectMemoryAccess)是C54xDSP非常重要的片上外设,DMA控制器可以在不影响CPU的情况下完成数据的传输,因此数据传输速度快,在要求信号实时采集和处理的系统中常采用DMA方式进行信号采集和传输。

C5402有6个可独立编程的DMA通道,每个DMA通道受各自的5个16位寄存器控制:

源地址寄存器DMSRC、目的地址寄存器DMDST、单元计数寄存器DMCTR、同步事件和计数寄存器DMSFC、发送模式控制寄存器DMMCR。

目的地址寄存器DMDST规定DMA要传送数据目的地址和首地址。

单元计数寄存器DMCTR规定DMA传送数据的个数为DMCTR寄存器的值加1。

同步事件和桢计数寄存器DMSFC规定DMA传送数据的同步事件类型和传送一块数据所含桢信号的个数。

发送模式控制寄存器DMMCR规定DMA通道的传输模式,当DMA工作在自动初始化模式时,CPU在一个DMA事件完成后自动装载下一个DMA初始化设置并继续进行数据传送。

DINM位和IMOD位设置DMA中断产生方式。

CTMOD位设置发送计数模式控制,CTMOD位为0时,DMA工作在多桢模式,CTMOD位为1时,DMA工作在自动缓冲ABU模式。

SIND位和DIND位用来设置源地址和目的地址的自动调整方式。

此外,DMA的6个通道还受通道优先级和使能控制寄存器DMPREC控制。

本实验利用DMA通道2与MCBSP1通道结合来读取A/D转换器的数据,利用DMA通道3与MCBSP1通道结合来将处理后的数据发送至D/A转换器。

选择MCBSP1通道的接收寄存器DRR11(41H)为DMA传送数据的首地址,并选择DMA源地址工作在不调整方式,选择MCBSP1接收事件为DMA同步事件,以实现DMA和MCBSP的结合。

A/D转换器的数据按MCBSP1的设置被传送到DSP内部接收寄存器DRR11中,再由DMA通道2将DRR11中的数据读到指定数据存储区inp_buffer中完成数据采集。

DMA在传送外部来的数据时不会影响CPU的正常运行,当DMA通道2采集完一组数据后产生一个DMA中断事件中断CPU,来通知CPU对其进行相应的处理,此时DMA通道2可以按照设定继续采集下一组数据,实现了数据采集与CPU处理的并行操作。

当一组数据处理完成后,将数据存放在数据存储区out_buffer中,选择out_buffer为DMA通道3的首地址,并选择源工作地址工作在不调整方式。

选择MCBSP1通道的发送积存器DXR11(43H)为DMA通道3传送数据的目的地址,并选择DMA源地址工作在不调整方式,选择MCBSP1接收事件为DMA同步事件,以实现DMA和MCBSP的结合。

在CCS集成开发环境中,与DMA相关的头文件有regs54xx.h和dma54xx.h。

在这两个头文件中,定义了DMA的寄存器资源、使用方法和DMA寄存器的地址和基本访问方式,以及寄存器的各个比特域和访问方法,因此需要进行C源程序的开始处包含这两个头文件。

输入信号经A/D转换后,利用DMA通道2进行传输进入DSP处理,而滤波后的信号输出利用了DMA通道3进行传输进入D/A转换器等输出,因此需要对DMA通道2和通道3进行初始化配置。

3、A/D和D/A转换器

本实验要用到A/D和D/A转换器。

A/D转换器能够将接收的语音信号(模拟信号)转化为数字信号,供CPU进行处理;D/A转换器能够将数字信号转换为语音信号送SPEAKER端口输出。

要使用A/D和D/A转换器,必须首先对A/D和D/A转换器进行初始化设置,即设置A/D转换器的工作模式(15+1bit模式,16bit模式)、输入增益(0dB,6Db,12dB)以及抽样频率(8000Hz,16000Hz)等。

4、LMS算法

最小均方(LMS,least-mean-square)算法,是由Widrow和Hof在1960年创建的,直到现在它还是应用最广泛的自适应滤波算法.LMS算法是随机梯度算法族中的一员。

该算法在随机输入维纳滤波器递推计算中使用确定性梯度。

LMS算法的一个显著特点就是它的简单性。

此外,它不需要计算有关的相关函数,也不需要矩阵求逆运算。

事实上,正是因为LMS算法的简单性,使得它成为其他自适应滤波算法的参照标准。

这两个过程一起工作组成一个反馈环,如图3所示。

首先有一个横向滤波器(围绕它构造LMS算法);该部件的作用在于完成滤波过程。

其次,有一个对横向滤波器抽头权值进行自适应控制过程的算法。

横向滤波器各部分的细节如图4所示。

抽头输入u(k),u(k-1),……,u(k-M+1)为MX1抽头输入向量a(k)元素,其中M+1是延迟单元的个数;这些输入张成一个多维空间。

相应的ho(k),hi(k),...,hm-1(k)为Mxl抽头权向量h(k)的元素。

通过LMS算法计算这个向量所得的值表示一个估计,当迭代次数趋于无穷时,该估计的期望值可能接近维纳最优解在滤波过程中,期望响应d(k)与抽头输入向量z(k)一道参与处理。

在这种情况下,给定一个输入,横向滤波器产生一个输入,横向滤波器产生一个输出y(k)作为期望响应d(k)的估计。

因此,我们可把估计误差e(k)定义为期望响应与实际滤波器输出之差,如图4所示。

估计误差e(k)与抽头输入向量z(k)都被加到自适应部分,因此围绕抽头权值的反馈环是闭环的。

图3.自通应横向滩波器框圈

图4.横向渡波器结构框图

回声消除器的基本原理:

声学回声消除的功能原理框图如图5所示:

图5.回声消除器原理框图

回声消除的基本原理可以概括如下:

自适应地合成回声,并从有回声干扰地信号中减去该合成回声。

图6.回声消除器的基本原理图

一般回声消除算法通过自适应滤波来完成,其基本原理如图6所示。

其中,远端信号城x(k)通过回声信道h产生回声y(k),近端信号d(k)是由回声y(k)和近端声音代句(可包含噪声信号)得到。

通过使用M抽头的FIR自适应滤波器

来模拟回声信道h,可以使所得y(k)通近回声信号,进而达到回声消除的目的由此可见,回声消除的关键是自适应地调整

使其通近h,可通过现有的各种自适应滤波算法实现。

这个实验采用的LMS算法,即最小均方误差算法设计的自适应滤波器进行未知系统识别,以将回声信号滤除。

该自适应滤波器是FIR横向滤波器,可以根据输出自动修改滤波器的权系数,从而逼近未知系统回声通道。

算法的实现基于TMS320C5402DSP芯片和CCS系统的C语言。

远端的信号通过回声通道产生回声信号d(n),该信号一般为远端信号的衰减和延迟。

远端信号通过自适应滤波器产生回声预测信号y(n)。

在k时刻,它们之差为剩余回声信号:

用它来控制LMS自适应滤波器的系数ω(n)

其中μ为自适应步长因子,一般取0

μ

1,可视为常数,k时刻滤波器的输出为:

以上三个方程是LMS最小均方误差算法的核心方程,也是C语言编程的依据。

LMS的算法流程图如下:

图7.LMS算法流程图

五、主要函数介绍

自适应滤波算法:

利用LMS的算法实现对已叠加噪声的信号进行滤波,由C语言实现LMS算法的C语言程序如下所示:

doublelms(doublew[],doublex[],doubledk,doubleek)//移植到CCS中的lms算法

{

s16i;

doubleuek,yk;

yk=0;

for(i=0;i

{

yk=yk+w[i]*x[i];

}

ek=dk-yk;

uek=2*mu*ek;

for(i=0;i

{

w[i]=w[i]+uek*x[i];

}

return(ek);

}

然而算法的效率与滤波器的长度有关,因此应当适当减小滤波器的长度;同时也应该适当的提高FIR滤波器的阶数。

同时替换原有的LMS算法的C语言实现程序,更换为CCS的diplib库中的函数shortdlms(PARAM)取代自定的lms()函数,同时用dsplib库里的函数shortfir(PARAM)产生回声通道的输出信号(也就是用预定阶数的FIR滤波器模拟回声通道),该输出信号作为自适应滤波器的理想输出信号,对之进行逼近进而得到预定结果。

Dsplib库中的dlsm函数和fir函数的子程序:

Dlsm.h的程序如下,路径:

C:

\ti\c5400\dsplib\EXAMPLES\DLMS

//*****************************************************************************

//Filename:

dlms_t.c

//Version:

0.01

//Description:

testfordlmsroutine

//*****************************************************************************

#include

#include

#include

#include"test.h"

shorti;

shorteflagr=PASS;

shorteflagh=PASS;

voidmain(void)

{

/*clear*/

for(i=0;i

for(i=0;i

for(i=0;i

/*compute*/

dlms(x,h,r,&dp,des,STEP,NH,NX);

/*test*/

eflagr=test(r,rtest,NX,MAXERROR);//forr

eflagh=test(h,htest,NH,MAXERROR);//forh

if(eflagr!

=PASS)

{

exit(-1);

}

if(eflagh!

=PASS)

{

exit(-1);

}

return;

}

FIR.h的程序如下,路径:

C:

\ti\c5400\dsplib\EXAMPLES\FIR

//*****************************************************************************

//Filename:

fir_t.c

//Version:

0.01

//Description:

testforfirroutine

//*****************************************************************************

#include

#include

#include

#include"test.h"

shorti;

shorteflag1=PASS;

shorteflag2=PASS;

DATA*dbptr=&db[0];

voidmain(void)

{

/*1.Testforsingle-buffer*/

/*clear*/

for(i=0;i

for(i=0;i

/*compute*/

fir(x,h,r,&dbptr,NH,NX);

/*test*/

eflag1=test(r,rtest,NX,MAXERROR);

/*2.Testsfordual-buffer*/

/*clear*/

for(i=0;i

for(i=0;i

dbptr=&db[0];

/*compute*/

if(NX>=4)

{

fir(x,h,r,&dbptr,NH,NX/4);

fir(&x[NX/4],h,&r[NX/4],&dbptr,NH,NX/4);

fir(&x[2*NX/4],h,&r[2*NX/4],&dbptr,NH,NX/4);

fir(&x[3*NX/4],h,&r[3*NX/4],&dbptr,NH,NX/4);

}

/*test*/

eflag2=test(r,rtest,NX,MAXERROR);

if(eflag1!

=PASS)

{

exit(-1);

}

if(eflag2!

=PASS)

{

exit(-2);

}

return;

}

这两个函数是用C5000汇编语言编写的,具有很高的执行效率,使用这个函数可以大大提高运算速度,以解决用C语言编写的程序效率不能满足要求的问题。

下面以dlsm.h为例,其使用方法如下:

shortoflag=dlms(DATA*x,DATA*h,DATA*r,DATA**d,DATA*des,DATAstep,ushortnh,ushortnx)

上述语句是在Dsplib.h中可以找到其路径为:

C:

\ti\c5400\dsplib\

Include

下面参看其C子函数定义的各个变量的意义:

oflag溢出错误标志,=1时在计算过程中发生了数据溢出;=0时无数据溢出。

x输入信号数组

h自适应滤波器系数矢量

r输出数组

d延迟缓冲区,用来存放上一时刻的输出数据

des理想输出信号数组

step2*μ,μ为自适应滤波器的自适应步长因子,一般取0<μ<1,可视为常数。

但为了适应DSP定点数的运算一般取STEP为327

nx向量x中的个数

nh系数的个数

注意:

h和d的存储地址要求起点必须位于Kbit边界处,即起始地址值的最低有效位必须是0,必须在CMD文件中开辟对齐1K边界的空间,并且只能在头文件中进行段的配置。

否则编译无法通过。

同理,FIR.h的使用方法如下:

oflag=shortfir(DATA*x,DATA*h,DATA*r,DATA**dbuffer,ushortnh,ushortnx)

oflag溢出错误标志,=1时在计算过程中发生了数据溢出;=0时无数据溢出。

x输入信号数组

hFIR滤波器的系数矢量,也是要逼近的对象

r输出数组

d延迟缓冲区,用来存放上一时刻的输出数据

nx向量x中的个数

nh系数的个数

注意:

h、d的地址要求同dlms()函数中的h、d参数。

DATA为tms320.h中定义的short整型。

为了降低计算量,输入缓冲数组长度应该尽量小,取长度为LENGTH_IN=5。

采用数据压入方式,将最新的声音采样值存入数组x[0],然后将存储的数据从低位压入高位。

其实现程序update(DATAx[],DATAdk)如下:

voidupdate(DATAx[],DATAdk)//dk为当前采样值

{

s16j,k;

for(j=1;j

{

k=LENGTH_IN-j;

x[k]=x[k-1];//从低位压向高位

}

x[0]=dk;//当前采样值存入最低位

}

六、程序设计、调试

首先设计FIR滤波器。

FIR滤波器的算法可以由MATLAB来设计。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1