clear %释放系统存储空间
clf %清除运行中的图
N=2; %设置回音的个数
G=[0.5 0.8]; %此为回音与原信号的对应幅值之比,用于设置回音的大小
D=[5000 2000];%设置延迟的大小 延迟时间t=fs*D
Dmax=max(D); %求出延迟中的最大延迟
%%%%%%%%%%%%%%%%%%%原信号%%%%%%%%%%%%%%%%%%%%%%%%
[y,fs]=audioread('321.wav '); %读取音频文件
d=y; %期望得到信号
y=y(:,1); %取单通道信号
Y=fft(y); %对原始信号傅里叶变换
figure(1)
subplot(2,2,1:2);
plot(y);
title('原始信号时域波形');
subplot(2,2,3);
plot(abs(Y));
title('原始信号幅度');
subplot(2,2,4);
plot(angle(Y));
title('原始信号相频');
grid on
% %%%%%%%%%%%%对采样后的信号进行延时模块1%%%%%%%%%%%%%%%
z= delay1( N,G,D,Dmax,y);
Z=fft(z,30000);
%sound(y,fs);
figure(2)
subplot(2,2,1:2);
plot(z);
title('延迟信号时域波形');
subplot(2,2,3);
plot(abs(Z));
title('延迟信号幅度');
subplot(2,2,4);
plot(angle(Z));
title('延迟信号相频');
grid on
%%%%%%%%%对采样后的信号进行混响%%%%%%%%%%%%%%%%
y=[y;zeros(5000,1)];
y1=y+z; %将原始音频与回音信号叠加
Y1=fft(y1,30000); %对叠加后信号求傅里叶变换
figure(3)
subplot(2,2,1:2);
plot(y1);
title('混响信号时域波形');
subplot(2,2,3);
plot(abs(Y1));
title('混响信号幅度');
subplot(2,2,4);
plot(angle(Y1));
title('混响信号相频');
grid on
%sound(y1,fs);
%%%%%%%%绘制数据样本的自相关函数图像%%%%%%%%%%
figure(4)
r=xcorr(y1);
plot(r);
grid on;
title('y1的自相关函数')
grid on
%%%%%%利用自相关函数求出回声延迟%%%%%%%%%%%%%
[u,v]= max(r);
r1=r;
r1(v-200:v+200,1)=0;
[u1,v1]=max(r1);
N=v-v1; %相减之后得到音频信号与回声的延迟
%%%%%%%%%%利用LMS算法进行自适应滤波%%%%%%%%%%%%
a=length(y1); %取读采样的长度
ns=y1-y; %高斯白噪声信号
u=y1; %需要滤波的信号
mu=0.001; %收敛步长
M=1024; %32阶滤波器
w=zeros(M,1); %初始化
u=u(:);
d=d(:);
e=zeros(1,a);
for n=M:a %开始迭代
uvec=u(n:-1:n-M+1); %
e(n)=d(n)-w'*uvec; %y(n)=w'*uvec
w=w+2*mu*uvec*e(n);
o(n) = w'*uvec;
end
%%%%%%%%%%%%%%%时域绘图%%%%%%%%%%%%%%%%%%%%%%
n=1:a;
figure(5)
subplot(5,1,1)
plot(n,y);xlabel('t')
title('原始音频')
subplot(5,1,2)
plot(n,ns);xlabel('t')
title('噪声音频')
subplot(5,1,3)
plot(n,y1);xlabel('t')
title('加噪后音频')
subplot(5,1,4)
plot(n,o);xlabel('t')
title('滤波后音频')
subplot(5,1,5)
plot(n,e);xlabel('t')
title('均方误差')
grid on
audiowrite('add_noise.wav',y1,fs); %保存数据
audiowrite('LMS_filter.wav',o,fs);
sound(y1,fs); %播放带有回音的混响音频
pause(5);
sound(z,fs); %播放延迟音频
pause(5);
sound(o,fs); %播放滤波后音频