武汉理工大学《信息处理课群综合训练与设计》课程设计说明书
3 方案设计
3.1最小二乘算法RLS算法实现
图3-1自适应横向滤波器结构框图
自适应横向滤波器有两路输入,一为输入信号{x(n)},含有样本{x(1),x(2),……x(N)};另一为期望信号序列为{d(n)},含有样本{d(1),d(2),……d(N)}如图2所示。滤波器滤波系数是对延迟线抽头信号加权的系数{w1(n),w2(n),w3(n),…Wm (n)},实质上,这也是滤波器的冲激响应序列。这里滤波器长度M必须低于或等于信号数据长度n。滤波器输出信号y(n)等于输入信号x(n)与冲激响应序列Wi (n)的卷积和,如式①。
y(n)??wi(n)x(n?i?1)?wT(n)x(n)①
i?1M误差信号为e(n)?d(n)?y(n),由此得到自适应横向滤波器按最小平方准则设计的代价函数:
J(n)??e(i)???d(i)?y(i)?②
22i?1i?1NN将①代入式②中,展开得:
?N?J(n)??d(i)?2?wk(n)??d(i)x(i?k?1)?n?1m?1?i?1?
2NM
式中,M≤N。
??k?1M?w(n)wkm?1Mm(n)?x(i?k?1)x(i?m?1)i?1N简短的表示滤波器的代价函数,将上式有关项定义为以下参数:
6
武汉理工大学《信息处理课群综合训练与设计》课程设计说明书
(1)确定性相关函数表示输入信号在抽头k与抽头m之间两信号的相关性,
?(N,k,m)??x(i?k)x(i?m);i?1Nk,m?0,1,?,M?1.
(2)确定性互相关函数表示期望响应与在抽头k输入型号之间的互相关性:
?(N,k)??d(i)x(i?k);i?1Nk?0,1,?,M?1.
(3)期望响应序列的能量为:
Ed(n)??d2(i)
i?1N将上述定义的三个参数代入式③中,得:
J(n)?Ed(n)?2?wk(n)?(N;k?1)???wk(n)wm(n)?(N;k?1,m?1)④
k?1k?1m?1MMM为了估算滤波器的最佳滤波系数,把式④对滤波系数(权系数)wk(n)微分一次,并令其导数等于0:
M?J(n) ⑤得:??2?(N;k?1)?2?wm(n)?(N;k?1,m?1)?0;?wk(n)m?1
k?1,2,?,M.?wm?1Mm(n)?(N;k?1,m?1)??(N;k?1);k?1,2,?,M.⑥这是最小二乘法自适应滤波
的正则方程。 RLS递推计算公式为:
?(n)?w?(n?1)?K(n)[d(n)?xT(n)w?(n?1)]?w?(n?1)?K(n)?(n) w式中K(n)为增益矢量,它等于相关矩阵?(n)的逆矩阵与延迟线抽头输入阵X(n)的乘积。?(n)是真正的估计误差,它等于:
?(n?1) ?(n)?d(n)?xT(n)w自适应递归最小二乘算法的信号流程图如图3-2:
图3-2 RLS算法信号流程图
7
武汉理工大学《信息处理课群综合训练与设计》课程设计说明书
3.2 RLS算法程序程序设计
在理解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));
for i=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;
8
武汉理工大学《信息处理课群综合训练与设计》课程设计说明书
4 RLS算法滤波方案实现
4.1信号的获取
本次课程设计对我们自行处理和灵活运用的能力提出了很高的要求。首先,老师没有给我们提供设计中所需要用到的语音信号;其次,怎样录制噪声和被噪声污染的语音信号也是一个很现实的问题。
所以我选择自己从网上下载了一段简短的wav格式的音频,然后用randn(length(source),1)函数将其打乱作为噪声,记做RLSrefns.wav。将这两段语音信号叠加并保存下来记做RLSprimsp.wav。
4.2读取语音文件
主麦克风录制的语音信号是RLSprimsp.wav,参考麦克风录制的参考噪声是RLSrefns.wav,都是.wav格式,用waveread指令读取音频信号;
指令写为如下:
primary = wavread('RLSprimsp.wav'); primary = primary';
ref = wavread('RLSrefns.wav'); fref = fref';
4.3RLS算法实现
RLS算法的收敛特性较LMS算法优越,但相应的复杂度也要高许多,考虑到收敛时间的影响,从起始时间到收敛时间经滤波器处理得到到输出误差依然很大,故直接将前32项去掉,先通过两输入作差得到预期值,再将所有预期值与对应时刻的实际输出值作差求平方,将这些平方值相加可以得到一个变量为W的函数,取W是函数的值最小。另外,显然距离n最近的量与Y(n)最接近,引入遗忘因子使得从n-1到0,相关程度逐渐减小。最后求得相关偏差,反馈给滤波器以矫正输出,达到减小误差的目的。
9
武汉理工大学《信息处理课群综合训练与设计》课程设计说明书
% 初始化
Worder=32; %滤波器阶数 lambda=1 ; % 设置遗忘因子 Delta=0.001 ;
p=(1/Delta) * eye ( Worder,Worder ) ; w=zeros(Worder,1);
output=primary; %主语音输出 loopsize=max(size(primary));
for i=1+Worder:loopsize %RLS算法设计 u=fref(i-Worder+1:i)'; y= w'*u e=primary(i)-y; k=(p*u)/(lambda+u'*p*u); w = w + k*e; p= (p-k*u'*p)/lambda; output(i-Worder)=e; disp(i); end;
4.4提取语音信号
用MATLAB中的wavread指令分别读取被噪声污染后的语音文件RLSprimsp.wav和噪声文件RLSrefns.wav后,进行RLS算法处理,滤除噪声后,得到语音文件,先由plot指令绘出语音文件波形,再用Y=fft()函数求出频谱,由plot指令绘出语音文件频谱图,然后通过MATLAB中的sound命令播放语音文件。代码如下所示:
figure;
[source,fs,bits]=wavread('Audio.wav'); %fs表示采样频率,bits表示采样位数
10