新浪博客

dsp.LMSFilter的用法

2022-12-02 03:48阅读:
代码: %main
clc;
filedir=[];
filename='C2T3.wav';
fle=[filedir filename];
[s,fs]=audioread(fle);
N=length(s(:));
time=(0:N-1)/fs;
snr=5;
M=32;
mu=0.001;
[r1,r2]=add_n(s,'babble1.wav',fs,snr);%r1为语音+噪音,r2为噪音信号,此函数产生一个信噪比为snr的带噪语音
snr1=snr_length(s,r1);%s是纯净语音信号,r1是带噪信号
%如何使用dsp.lmsfilter函数?
r1 = r1';
lms1=dsp.LMSFilter(32,'StepSize',0.001);%dsp.LMSFilter
[z,e,w] = lms1(r1,s(:));%r1为语音+噪音,r2为噪音信号
output=z;%lms滤波的输出
snr2=snr_length(s,output');
fprintf('snr1=%.5f snr2=%.5f snr=%.5f',snr1,snr2,snr1-snr2);
figure(1)
subplot(3,1,1);plot(time,s(:),'k');ylabel('幅值');title('原始声音信号');
subplot(3,1,2);plot(time,r1,'k');ylabel('幅值');title('叠加噪音后的声音信号');
subplot(3,1,3);plot(time,output,'k');ylabel('幅值');title('LMS滤波后的声音信号');xlabel('时间/s');
figure(2)
plot(10*log(abs(e)));
ylabel('幅值(dB)');title('LMS滤波后的误差');xlabel('时间/s');
function[signal,noise]=add_n(s,n_path,fs,snr)%s为
信号,n_path为噪音路径及其名字,fs为信号的采样频率,snr为噪声设置的信噪比
s=s(:)';
sl=length(s);
[n,fs1]=audioread(n_path);
n=n(:)';
if fs~=fs1
n1=resample(n,fs,fs1);
else
n1=n;
end
noise=n1(1:sl);
E1=1/sl*sum(s.*s);%求出信号能量
E2=1/sl*sum(noise.*noise);%噪声能量
noise=sqrt(E1/(10^(snr/10))/E2)*noise;
signal=s+noise;
end
function snr=snr_length(s,signal)%计算信号的信噪比,s是语音信号,signal是带噪信号
signal=signal(:)';
s=s(:)';
E1=sum((s-mean(s)).^2);%信号的能量
E2=sum((s-signal).^2);%噪声的能量
snr=10*log10(E1/E2);
end
波形:
dsp.LMSFilter的用法
dsp.LMSFilter的用法
输出的snr系数:
dsp.LMSFilter的用法

我的更多文章

下载客户端阅读体验更佳

APP专享