大家好,又见面了,我是你们的朋友全栈君。
Created with Raphaël 2.2.0 开始 选择正交变换,把时域信号转变为变换域信号 变换后的信号用其能量的平方根归一化 采用某一自适应算法进行滤波 结束
其他不再具体说明。
下面对各种类型的自适应滤波算法进行简单的总结分析。
clc,clear,close all;
g=100;
L=1024;%信号长度
k=128;%滤波器阶数
pp=zeros(g,L-k);
u=0.001;
for q=1:g
t=1:L;
a=1;
s=a*sin(0.05*pi*t);
figure(1);
subplot(311);
plot(s);
title('信号s时域波形');
xlabel('n');
axis([0,L,-a-1,a+1]);
xn=awgn(s,5); %信噪比5dB的WGN
y=zeros(1,L);
y(1:k)=xn(1:k);
w=zeros(1,k);
e=zeros(1,L);
for i=(k+1):L
XN=xn((i-k+1):(i));
y(i)=w*XN';
e(i)=s(i)-y(i);
pp(i)=pp(i)+e(i);
w=w+u*e(i)*XN;
end
end
subplot(312)
plot(xn);
title('信号加高斯白噪声后的时域波形');
axis([0,L,-a-2,a+2]);
subplot(313)
plot(y);
axis([0,L,-a-1,a+1]);
title('LMS算法自适应滤波后的输出时域波形');
已把音频放在了 https://pan.baidu.com/s/1L5vXa60c0wEATx2LQVLp-Q 提取码:vs7o
function [y,W,e]=LMSfilter(xn,d,L,mu)
% 输入参数:
% xn 输入的信号序列 (列向量)
% d 所期望的响应序列 (列向量)
% L 滤波器的阶数 (标量)
% mu 收敛因子(步长) (标量) 要求0<mu<xn的相关矩阵最大特征值的倒数
% 输出参数:
% W 滤波器的权值矩阵 (矩阵)
% 大小为M x t,
% e 误差序列(t x 1) (列向量)
% y 实际输出序列 (列向量)
t = length(xn);
e = zeros(t,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
W = zeros(L,t); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0
% 迭代计算
for k = L:t % 第k次迭代
x = xn(k:-1:k-L+1); % 滤波器L个抽头的输入
y = W(:,k-1).'*x; % 滤波器的输出
e(k) = d(k)- y ; % 第k次迭代的误差
W(:,k) = W(:,k-1) + 2*mu*e(k)*x; % 滤波器权值计算的迭代式
end
% 求最优时滤波器的输出序列 r如果没有yn返回参数可以不要下面的
y = inf * ones(size(xn)); % inf 是无穷大的意思
for k = L:length(xn)
x = xn(k:-1:k-L+1);
y(k) = W(:,end).'* x;%用最后得到的最佳估计得到输出
end
clc;
clear all;
close all;
%% 产生信号源
[X,Fs] = audioread('Rolling in the Deep.wav');%音频过长无法计算自相关
signal = X(:,1); %取出双通道中其中一个通道作为信号源signal
audiowrite('原始音频.wav',signal,Fs); %创建原始音频.wav
n = length(signal);
t=(0:n-1);
figure(1);
subplot(3,1,1);
plot(t,signal);grid;ylim([-2 2]);
ylabel('幅度');
xlabel('时间');
title('原始音频信号');
%% 产生期望信号
dn = awgn(signal,10); %加入信噪比为10dB的高斯白噪声
noise=dn-signal;
audiowrite('含噪音频.wav',dn,Fs); %创建含噪音频
subplot(3,1,2);
plot(t,dn);grid;ylim([-2 2]);
ylabel('幅度');
xlabel('时间');
title('含噪音频信号');
%% LMS滤波算法
M = 128; %滤波器阶数M
u = 0.0004; %滤波器的步长
[yLMS,W,eLMS] =LMSfilter(noise,dn,M,u);
%% 绘制去噪后的语音信号
subplot(3,1,3);
plot(t,eLMS);grid;ylim([-2 2]);
ylabel('幅度');
xlabel('时间');
title('去噪后的音频信号');
audiowrite('去噪音频.wav',eLMS,Fs);%保存去除噪声的音频
%%
e = signal-eLMS;%剩余噪声
figure(2);
subplot(2,1,1);
plot(t,e);grid;
ylabel('幅度');
xlabel('时间');
title('剩余的噪声');
%% 一小段三个信号比较
subplot(2,1,2);
t=(1000000:1005000);
plot(t,eLMS(1000000:1005000,1 ),'r',t,e(1000000:1005000,1),'g',t,signal(1000000:1005000,1),'b');
axis([1000000,1005000,-1,1]);
ylabel('幅度');
xlabel('时间');
legend('去噪后的语音信号','剩余噪声','原始音频');
title('一小段三个信号比较');
J=wiener2(I,[M,N],noise);
%表示M*N大小邻域局部图像均值与偏差,采用像素自适应滤波器对图像I滤波
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131579.html原文链接:https://javaforall.cn