语音降噪变步长LMS以及归一化LMS算法matlab代码
时间: 2023-09-14 17:06:34 浏览: 110
以下是语音降噪变步长LMS和归一化LMS算法的MATLAB代码示例:
变步长LMS:
```matlab
clear
clc
close all
% 读取原始语音信号
[x,fs] = audioread('noisy_speech.wav');
x = x(:,1); % 取左声道
x = x./max(abs(x)); % 归一化
% 添加高斯白噪声
n = 0.1*randn(size(x));
snr_before = snr(x,n);
d = x + n;
% 变步长LMS参数
L = 100; % 滤波器长度
mu = 0.01; % 初始步长
k = 0.001; % 步长更新速率
delta = 0.01;
% 初始化滤波器系数
w = zeros(L,1);
% 变步长LMS算法
y = zeros(size(d));
e = zeros(size(d));
for i = L:length(d)
xk = d(i:-1:i-L+1);
y(i) = w'*xk;
e(i) = d(i) - y(i);
mu = mu + k*(delta - abs(xk'*xk));
w = w + mu*xk*e(i);
end
% 去噪后语音信号
snr_after = snr(x,x-e);
y = y./max(abs(y));
% 绘图
figure
subplot(3,1,1)
plot(x)
title('原始语音信号')
subplot(3,1,2)
plot(d)
title(['添加高斯白噪声后信噪比:',num2str(snr_before),'dB'])
subplot(3,1,3)
plot(y)
title(['变步长LMS去噪后信噪比:',num2str(snr_after),'dB'])
```
归一化LMS:
```matlab
clear
clc
close all
% 读取原始语音信号
[x,fs] = audioread('noisy_speech.wav');
x = x(:,1); % 取左声道
x = x./max(abs(x)); % 归一化
% 添加高斯白噪声
n = 0.1*randn(size(x));
snr_before = snr(x,n);
d = x + n;
% 归一化LMS参数
L = 100; % 滤波器长度
mu = 0.01; % 初始步长
delta = 0.01;
% 初始化滤波器系数
w = zeros(L,1);
% 归一化LMS算法
y = zeros(size(d));
e = zeros(size(d));
for i = L:length(d)
xk = d(i:-1:i-L+1);
y(i) = w'*xk;
e(i) = d(i) - y(i);
mu = mu + delta*mu*(xk'*xk)/(xk'*xk+delta);
w = w + mu*xk*e(i);
end
% 去噪后语音信号
snr_after = snr(x,x-e);
y = y./max(abs(y));
% 绘图
figure
subplot(3,1,1)
plot(x)
title('原始语音信号')
subplot(3,1,2)
plot(d)
title(['添加高斯白噪声后信噪比:',num2str(snr_before),'dB'])
subplot(3,1,3)
plot(y)
title(['归一化LMS去噪后信噪比:',num2str(snr_after),'dB'])
```
以上代码仅供参考,具体参数需要根据实际情况进行调整。
阅读全文