✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
在自适应滤波算法中,LMS算法是最常用的算法之一,因为具备结构简单,易于实现,性能稳定,计算复杂度低等特点.然而,LMS算法也存在缺点,比如,收敛速度较慢,收敛精度低的问题,这就影响LMs算法在收敛性要求较高的领域中的应用.使用粒子群算法对LMS算法进行改进,可以将LMS滤波设计变成对LMS滤波参数优化的问题,利用粒子群算法的优化能力,使得滤波参数得到全局最优解.以此可以提高LMS滤波算法的收敛性能,从而提高滤波性能.
⛄ 部分代码
clear all;
clc;
close all;
warning off
filename='hehe.wav';
[s,fs] =audioread(filename); %wavread函数在此版本后不能用了,改用audioread
S=max(abs(s));
s=s/S; %将语音信号幅值归一化
N=length(s); %求信号的长度
time=(0:N-1)/fs; %设置横坐标的时间
ns=0.5*cos(2* pi* 50* time); %计算出50Hz的工频信号
x=s+ns'; %语音信号和50Hz的工频信号叠加
snr1=SNR_singlech(s,x); %计算叠加后50Hz工频信号之后的信噪比
x1=cos(2* pi * 50 * time); %设置x1和x2
x2=cos(2* pi * 50 * time);
w1=0.1; %初始化w1和w2
w2=0.1;
e=zeros(1,N); %初始化e和y
y=zeros(1,N);
mu=0.05; %设置mu
for i=1:N % 迭代计算
y(i)=w1* x1(i)+ w2* x2(i); %LMS自适应陷波器滤波
e(i)=x(i)-y(i); % 第k次迭代的误差
w1=w1+mu* e(i) * x1(i); % 滤波器权值计算的迭代式
w2=w2+mu* e(i) * x2(i); % 滤波器权值计算的迭代式
end
output=e'; %陷波器输出
snr2=SNR_singlech(s,output); %计算信噪比snr
snr=snr2-snr1;%去噪前后信噪比差
fprintf('去噪前后信噪比差=%5.4f ,加噪后信号信噪比=%5.4f ,LMS算法去噪后信噪比=%5.4f\n',snr,snr1,snr2);
mse2 = MSE(s,output);%计算LMS算法去噪后的均方差
mse1 = MSE(s,x);%计算加噪后的均方差
mse=mse2-mse1;%去噪前后均方差
fprintf('去噪前后均方差差=%5.4f ,加噪后信号均方差=%5.4f ,LMS算法去噪后均方差=%5.4f\n',mse,mse1,mse2);
psnr2 = PSNR(s,output);%计算LMS算法去噪后的峰值信噪比
psnr1 = PSNR(s,x);%计算加噪后的峰值信噪比
psnr=psnr2-psnr1;%去噪前后峰值信噪比差
fprintf('去噪前后峰值信噪比差=%5.4f ,加噪后信号峰值信噪比=%5.4f ,LMS算法去噪后峰值信噪比=%5.4f\n',psnr,psnr1,psnr2);
audioplayer(output*S,fs);pause(10);
wavwrite(output,'hehe.wav');%保存lms去噪音频
%作图
figure(1)
subplot 311; plot(time,s,'b');
ylim([-1,1]); title('原始语音信号');
subplot 312; plot(time, x,'b');
ylim([-1,1]); title('带噪语音信号');
subplot 313; plot(time, output,'b');
ylim([-1,1]); title('PSO-LMS滤波输出语音信号');
xlabel('时间/s')
⛄ 运行结果
编辑
⛄ 参考文献
[1]李曼. 在Matlab中实现基于LMS算法语音信号去噪[J]. 电脑知识与技术, 2014(11X):3.
[2]黄媛媛, 王友仁, 崔江,等. 基于粒子群算法的自适应LMS滤波器设计及可重构硬件实现[J]. 佳木斯大学学报:自然科学版, 2010, 28(1):4.
❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除