📄 rls.m
字号:
%RLS算法
%用噪声训练滤波器权系数矢量,再进行滤波
%dxt
%EI,HUST
%2008.12
clear all %清除内存变量
clc %清除command框
%读取混合有噪声的语音信号
[xinit,Fs,nbits] = wavread('signalnoise.wav');
xinit = xinit'; %转置
xn = xinit(1,:); %取混有噪声的语音信号的单声道
n = wavread('noise.wav'); %读取噪声信号
n = n'; %转置
n = n(1,:); %取噪声信号的单声道
N=length(n); %噪声信号的长度
M=32; %滤波器的阶数
L=0.98; %遗忘因子
Ns = length(xn); %有噪声的语音信号
d = 0.002*ones(1,N); %期望输出
x1 = 10*n+d; %RLS滤波器输入信号
w=zeros(1,M); %权系数
x=zeros(1,M); %1*M,代表x(n)'
u=zeros(1,N); %临时数组u=x(n)*T(n-1)*x(n)'
T=200*eye(M); %T(-1)
k=zeros(M,1); %增益k(n)
e=zeros(1,N); %e(n|n-1)
e1=e; %平方误差
w1 = zeros(1,Ns-M+1);
for n=M:N
x=x1(n:-1:n-M+1); %x(n)
u(n)=x*T*x';
k=T*x'/(L+u(n)); %计算增益k(n)
e(n)=d(n)-x*w'; %计算e(n|n-1)
w=w+k'*e(n); %计算权系数w(n)
w1(N-n+1)=w(1);
T=(T-x*k*T)/L; %计算T(n)
e1(n)=e(n)*e(n);
end
%利用训练的滤波器系数进行语音信号的滤波
s = zeros(1,Ns-M+1);
for n=M:Ns
s(n-M+1) = 0;
for j=1:M
s(n-M+1)= s(n-M+1)+w(j)*xn(n-j+1);
end
end
subplot(2,1,1); %绘制原始语音信号
plot(xn);
title('混有噪声的原始语音信号');
subplot(2,1,2); %绘制滤波后的信号
plot(s,'k');
title('滤波后语音信号');
wavwrite(s,Fs,nbits,'filter.wav');
wavwrite(5*s,Fs,nbits,'filter5.wav');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -