基于RLS算法的多麦克风降噪.docx
《基于RLS算法的多麦克风降噪.docx》由会员分享,可在线阅读,更多相关《基于RLS算法的多麦克风降噪.docx(22页珍藏版)》请在冰豆网上搜索。
基于RLS算法的多麦克风降噪
课程设计任务书
学生姓名:
熊昌青专业班级:
通信1102
指导教师:
艾青松工作单位:
题目:
基于RLS算法的多麦克风降噪
初始条件:
pc机,matlab7.0软件
要求完成的主要任务:
(1)阅读参考资料和文献,明晰算法的计算过程,理解RLS算法基本过程;
(2)主麦克风录制的语音信号是RLSprimsp.wav,参考麦克风录制的参考噪声是RLSrefns.wav,用matlab指令读取;
(3)根据算法编写相应的matlab程序;
(4)算法仿真收敛以后,得到增强的语音信号;
(5)用matlab指令回放增强后的语音信号;
(6)分别对增强前后的语音信号作频谱分析。
时间安排:
6月20日到6月27日理论设计与仿真
6月28日到7月1日撰写报告
7月3日答辩
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
课程设计任务书1
摘要3
Abstract4
1设计任务5
2设计要求6
3基本原理7
3.1自适应干扰抵消原理7
3.2RLS算法基本原理8
4方案论证10
5功能设计12
5.1读取语音文件12
5.2算法实现13
6信号的获取15
7调试程序16
7.1环境噪声中的语音波形分析16
7.2RLS算法的滤波效果:
18
7.3分别对增强前后的语音信号做频谱分析19
附:
MATLAB软件输出窗口如下图:
22
8心得体会23
9参考文献24
附录:
程序清单25
摘要
MATLAB即矩阵实验室,是一个可视化的计算程序,被广泛的运用在科学计算领域,包括数值计算、数据拟合图形图像处理、系统模拟仿真功能。
除具备卓越的数值计算能力用外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。
自适应滤波器是统计信号处理的一个重要组成部分。
在实际应用中,由于没有充足的信息来设计固定系数的数字滤波器,或者设计规则会在滤波器正常运行时改变,因此我们需要研究自适应滤波器。
凡是需要处理未知统计环境下运算结果所产生的信号或需要处理非平稳信号时,自适应滤波器可以提供一种吸引人的解决方法,而且其性能通常远优于用常方法设计的固定滤波器。
此外,自适应滤波器还能提供非自适应方法所不可能提供的新的信号处理能力。
本次课程设计正是要求使用具有强大运算能力的MATLAB软件,运用自适应滤波中的RLS算法实现麦克风降噪。
旨在培养我们使用计算机处理庞大的数据的能力和熟悉MATLAB在信息技术中的应用。
关键词:
MATLAB,自适应滤波,RLS算法,麦克风降噪
Abstract
MATLABnamelyMatrixLaboratory,isavisualcalculationprocedureiswidelyusedinthefieldofscientificcomputing,includingnumericalcomputation,datafitting,graphics,imageprocessing,systemsimulation.Hasproventhevalueofcomputingpower,italsoprovidesaprofessionallevelofsymboliccomputation,wordprocessing,visualmodelingandsimulationandreal-timecontrolfunctions.
Theadaptivefilterisanimportantpartofstatisticalsignalprocessing.Inpracticalapplications,doesnothavesufficientinformationtodesignafixed-coefficientdigitalfilterdesignrulesinthenormaloperationofthefilterchange,soweneedtostudytheadaptivefilter.Thosewhoneedtodealwiththesignalsgeneratedbytheresultoftheoperationenvironmentofunknownstatisticsorneedtodealwithnon-stationarysignals,theadaptivefiltercanprovideanattractivesolution,anditsperformanceisusuallyfarsuperiortothefixedfilterdesignusingtheregularmethod.Inaddition,theadaptivefiltercanalsoprovidenon-adaptivemethodscannotprovideanewsignalprocessingcapabilities.
ThiscoursedesignistousethepowerfulcomputingpowerofMATLABsoftware,theuseoftheRLSadaptivefilteringalgorithmmicrophonenoisereduction.Aimstodevelopthewayweusecomputerstohandlelargedata,familiaritywithMATLABcountinformation.
Keywords:
MATLAB,adaptivefilter,RLSalgorithm,microphonenoisereduction
1设计任务
给定主麦克风录制的受噪声污染的语音信号和参考麦克风录制的噪声,实现语音增强的目标,得到清晰的语音信号。
2设计要求
(1)阅读参考资料和文献,明晰算法的计算过程,理解RLS算法基本过程;
(2)主麦克风录制的语音信号是RLSprimsp.wav,参考麦克风录制的参考噪声是RLSrefns.wav,用matlab指令读取;
(3)根据算法编写相应的MATLAB程序;
(4)算法仿真收敛以后,得到增强的语音信号;
(5)用matlab指令回放增强后的语音信号;
(6)分别对增强前后的语音信号作频谱分析。
3基本原理
3.1自适应干扰抵消原理
如图所示的是自适应干扰抵消器的基本结构,它有着很广泛的应用。
期望响应
是信号和噪声之和,即
,自适应处理器的输入是与
相关的另一个噪声
。
当
与
不相关时,自适应处理器将调整自己的参数,以力图使
成为
的最佳估计
。
这样,
将逼近信号
,且其均方值
为最小。
噪声
就得到了一定程度的抵消
+
图3-1自适应干扰抵消原理图
3.2RLS算法基本原理
RLS算法是FIR维纳滤波器的一种递归算法,它是严格以最小二乘方准则为依据的算法。
FIR自适应滤波器除了LMS算法外,还有另一种算法,即自适应的递归最小二乘方(RLS)算法。
这种算法实际上是FIR维纳滤波器的一种时间递归算法,它是严格以最小二乘方准则为依据的算法。
它的主要优点是收敛速度快,因此,首先在快速信道均衡,实时系统辨识和时间序列分析中得到广泛应用。
其主要缺点是每次迭代计算量很大(对于
阶横向滤波器,计算量数量级为
),因此,在信号处理中它的应用曾一度收到限制。
但是近年来人们重新对它产生了兴趣,主要是因为它具有收敛速度快的优点。
在生物医学应用中,这种算法的自适应滤波器很容易在小型计算机上实现。
RLS算法的关键是用二乘方的时间平均的最小化准则取代最小均方准则,并按时间迭代计算。
具体来说,是要对初始时刻到当前时刻所有误差的平方进行平均并使其最小化,在按照这一准则确定FIR滤波器的权系数矢量
,即所依据的准则是
(1)
其中
式中,
是期望响应,
是L阶FIR滤波器的输出相应,即
(2)
RLS的算法所采用的是最小二乘准则,其代价函数为:
(3)
式中称
为遗忘因子,且有0
1。
RLS算法的权向量的迭代公式为cn=cn-1+gnen(4)
式中,gn为:
(5)
其中,是Rn均衡器输入矢量的自相关矩阵
4方案论证
方案一:
理解RLS算法的基本原理,自行编写RLS算法程序块,RLS算法可以理解为将输出反馈给滤波器来调整相关参数,达到校正误差的目的。
算法实现代码如下所示:
Worder=32; %滤波器阶数
lambda=1; %设置遗忘因子
Delta=0.001;
p=(1/Delta)*eye(Worder,Worder);
w=zeros(Worder,1);
output=primary; %主语音输出
loopsize=max(size(primary));
fori=1+Worder:
loopsize %写RLS算法公式
z=primary(i)-w'*(fref(i-Worder+1:
i))';
n2=fref(i-Worder+1:
i)';
k=(1/lambda)*p*n2;
K=k/(1+n2'*k);
w=w+K*z;
p0=K*n2';
p=(p-p0*p)/lambda;
output(i-Worder)=z;
disp(i);
end;
方案二:
直接调用MATLAB自带的RLS算法adaptfilt.rls(l,lambda,invcov,coeffs,states)
1指滤波器的长度,必须为正数,默认值为10;lambda指RLS的遗忘因子,为标量,取值范围[01],默认值为1;invcov指输入矩阵的协方差的逆,为使滤波器性能最佳,常将其初始化为正定矩阵;coeffs指初始化滤波器系数向量,长度必须为滤波器的阶数,默认下所有元素全零;states指矢量自适应滤波器的初始过滤状态,长度必须为阶数减1,默认下所有元素全零。
该方案运用现成的RLS算法函数,操作简单,易实现,但不能深入了解RLS算法的根本原理,不利于RLS算法的掌握。
直接调用库的RLS算法函数的设计方法比较简单,直接用Hadapt函数调用RLS数字滤波器就可以滤波输出。
而直接编写RLS算法公式的设计方法就比较难,设计时要先要弄懂基本的RLS算法,公式的推导,每一步的含义等,好的是可以掌握好MATLAB指令,如何去编写公式也是难点,此方法的设计过程当中就参考了一些数字滤波器的设计资料,还有矩阵的写法与匹配问题,需要自己分析解决一些问题。
为了加深对matlab的了解,我们选择方案一。
5功能设计
5.1读取语音文件
主麦克风录制的语音信号是RLSprimsp.wav,参考麦克风录制的参考噪声是RLSrefns.wav,都是.wav格式,用waveread指令读取音频信号;
指令写为如下:
primary=wavread('RLSprimsp.wav');
primary=primary';
ref=wavread('RLSrefns.wav');
fref=fref';
5.2算法实现
RLS算法的收敛特性较LMS算法优越,但相应的复杂度也要高许多,考虑到收敛时间的影响,从起始时间到收敛时间经滤波器处理得到到输出误差依然很大,故直接将前32项去掉,先通过两输入作差得到预期值,再将所有预期值与对应时刻的实际输出值作差求平方,将这些平方值相加可以得到一个变量为W的函数,取W是函数的值最小。
另外,显然距离n最近的量与Y(n)最接近,引入遗忘因子使得从n-1到0,相关程度逐渐减小。
最后求得相关偏差,反馈给滤波器以矫正输出,达到减小误差的目的。
%初始化
Worder=32;%滤波器阶数
Delta=0.001;
p=(1/Delta)*eye(Worder,Worder);
w=zeros(Worder,1);
output=primary;%主语音输出
loopsize=max(size(primary));
fori=1+Worder:
loopsize%写RLS算法公式
z=primary(i)-w'*(fref(i-Worder+1:
i))';
n2=fref(i-Worder+1:
i)';
k=p*n2;
K=k/(1+n2'*k);
w=w+K*z;
p0=K*n2';
p=(p-p0*p);
output(i-Worder)=z;
disp(i);
end;
5.3提取语音信号
用MATLAB中的wavread指令分别读取被噪声污染后的语音文件RLSprimsp.wav和噪声文件RLSrefns.wav后,进行RLS算法处理,滤除噪声后,得到语音文件,先由plot指令绘出语音文件波形,再通过MATLAB中的sound命令播放语音文件。
代码如下所示:
figure;%作图
subplot(2,3,1);
plot(primary);%画主麦克风语音波形
title('primaryinput');
subplot(2,3,2);
plot(fref);%画参考麦克风语音波形
title('frefnoise');
subplot(2,3,3);
plot(output);%画降噪后的语音波形
title('output');
wavwrite(output,fs,'lym0');%生成降噪后的语音波形
sound(output,fs,bits);
6信号的获取
本次课程设计对我们自行处理和灵活运用的能力提出了很高的要求。
因为我自己耳机的麦克风在windows8音频驱动下,输入增益太小,根本无法使用。
然而直接去购买一个专用的麦克风又不划算,最后在我确定了获取被噪声污染的信号和噪声信号的方法:
本次设计我算选用的噪声信号由MATLAB中随机函数randn产生的声音信号来模拟的,而语音信号则用酷狗音乐盒登录“hellokugou(文件名login.wav)”和randn函数产生的噪声混合的声音信号来模拟。
这样,噪声信号就和语音信号中噪声有很大相似度。
我首先使用wavwrite函数,将randn函数输出的噪声信号命名为RLSrefns.wav。
然后在用wavwrite函数将加载了噪声的“hellokugou”信号输出命名为RLSprimsp.wav。
7调试程序
7.1环境噪声中的语音波形分析
(1)麦克风主噪音RLSprimsp.wav信号波形如下:
图7-1麦克风主噪音波形图
(2)参考噪音RLSrefns.wav信号波形如下:
图7-2参考噪音波形图
7.2RLS算法的滤波效果:
算法仿真收敛以后,得到增强的语音信号
图7-3增强的语音信号波形图
7.3分别对增强前后的语音信号做频谱分析
对于时域信号,我们往往难以找出其中蕴含的规律,仅从时域角度完成特征信号的提取、噪声信号的滤除和信号的分割不仅十分困难,有时甚至根本无法实现,这时如果从频域角度来看,问题就变得简单许多,首先将时域信号经傅里叶变换得到对应频域信号。
傅里叶变换,即将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。
在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。
对于离散信号,通常采用离散福利叶变换,为提高计算机的运算速度又衍生出快速离散傅里叶变换,接下来频谱信号的绘制即是直接调用MATLAB中指令fft先得到对应的频谱信号,再通过plot命令得到的。
(1)对麦克风主噪音RLSprimsp.wav信号进行频谱分析:
频谱图如下:
图7-4麦克风主语音输入频谱
(2)对参考噪音RLSrefns.wav信号进行频谱分析:
频谱图如下:
图7-5参考麦克风语音输入频谱
(3)对降噪后的输出语音lym0.wav进行频谱分析
频谱图如下:
图7-6降噪后语音输出频谱图
附:
MATLAB软件输出窗口如下图:
8心得体会
这次的课程设计结束了,虽然开始的时候不知道从何入手,该怎么样达到要求,完成设计,但是经过一步步的摸索和总结,最后总算完成了这次任务。
由于对于理论知识学习不够扎实,我深感“书到用时方恨少”,于是想起圣人之言“温故而知新”,便重拾教材与实验手册,对知识系统而全面进行了梳理,遇到难处先是苦思冥想再向同学请教,终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的方向。
正所谓“实践是检验真理的唯一标准”,只有自己动手做过了,才能更贴切更深刻的掌握所学的知识,使自己进一步的提高。
尽管课程设计是在期末才开始,我们的教材学习完毕,掌握许多知识,但是还有很多地方理解领悟不到位,所以查阅资料使必不可少的,这就养成了我们自己学习的方式
通过此次学科课程设计,我掌握了自适应算法的一些基本知识,加强了我对MATLAB软件的应用能力,提高了运用RLS算法进行滤波器设计的基本能力。
提高自己的基础理论知识、基本动手能力,提高人才培养的基本素质,并帮助我们掌握基本的文献检索和文献阅读的方法,同时提高我们正确地撰写论文的基本能力。
当然,经过此次RLS算法多麦克风语音降噪课程设计,我也发现了自己的很多不足。
但是通过自己的动手动脑,既增加了知识,又给了我专业知识以及专业技能上的提升,我也会更加努力,认真学习,争取在以后的课程中做得更好。
9参考文献
[1]陈怀琛.MATLAB及在电子信息课程中的应用.西安:
西安电子科技大学出版社,2000
[2]胡广书.数字信号处理—理论、算法与实现.北京:
清华大学出版社,2003
[3]何振亚.自适应信号处理.科学出版社,2002
[4]安颖,侯国强.自适应滤波算法研究与DSP实现.现代电子技术,2007
[5]王洪元主编.MATLAB语言以及在电子信息工程中的应用.清华大学出版社,2004.
[6]郑宝玉.自适应滤波器原理[M].北京:
电子工业出版社,2006.
附录:
程序清单
source=wavread('login.wav');%读入hello_kugou的wav音频文件
noise=0.1*randn(length(source),1);
source=source+noise;
wavwrite(noise,22050,'RLSrefns');%输出模拟噪声文件
wavwrite(source,22050,'RLSprimsp');%输出模拟主语音信号
primary=wavread('RLSprimsp')
primary=primary';
fref=wavread('RLSrefns.wav');%读入参考语音信号
fref=fref';
Worder=32;%滤波器阶数
lambda=1;%设置遗忘因子
Delta=0.001;
p=(1/Delta)*eye(Worder,Worder);
w=zeros(Worder,1);
output=primary;%主语音输出
loopsize=max(size(primary));
fori=1+Worder:
loopsize%写RLS算法公式
z=primary(i)-w'*(fref(i-Worder+1:
i))';
n2=fref(i-Worder+1:
i)';
k=(1/lambda)*p*n2;
K=k/(1+n2'*k);
w=w+K*z;
p0=K*n2';
p=(p-p0*p)/lambda;
output(i-Worder)=z;
end;
figure;%作图
subplot(2,3,1);plot(primary);%画主麦克风语音波形
title('primaryinput');
[y1,fs,bits]=wavread('RLSprimsp.wav');
y1
Y1=fft(y1);
subplot(2,3,4);plot(abs(Y1));title('麦克风主语音输入频谱');
subplot(2,3,2);plot(fref);%画参考麦克风语音波形
title('frefnoise');
[y2,fs,bits]=wavread('RLSrefns.wav');
Y2=fft(y2);subplot(2,3,5);plot(abs(Y2));title('参考麦克风语音输入频谱');
subplot(2,3,3);
plot(output);%画降噪后的语音波形
title('output');
wavwrite(output,fs,'lym0');%生成降噪后的语音
[y,fs,bits]=wavread('lym0.wav');
Y=fft(y);
subplot(2,3,6);plot(abs(Y));title('降噪后语音输出频谱');
sound(y1,fs,bits);
sound(y2,fs,bits);
sound(output,fs,bits);
本科生课程设计成绩评定表
姓名
熊昌青
性别
男
专业、班级
通信1102
课程设计题目:
基于RLS算法的多麦克风降噪
课程设计答辩或质疑记录:
成绩评定依据:
评分项目
最高分限
实际得分
设计说明书(论文)文理通顺、书写工整、图纸整洁。
20
方案设计合理,有一定创新,计算正确,论证充分。
20
答辩时态度谦虚有礼。
10
能够及时正确地回答教师所提出的问题。
40
仿真设计及其运行情况
10
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
2013年7月3日