谱减法的Matlab程序:
-----------------------------------------------------------------------------------------------------
clear;
[xx,fs]=wavread('I:\\aa\\0a.wav'); [team,row]=size(xx); if row==2
x=(xx(:,1)+xx(:,2))/2; yy=x;
else
x=xx;
yy=x;
end
x=x-mean(x)+0.1*rand(length(x),1); % 读语音信号
% 将多通道求平均值
% 去直流分量并加噪
N=length(x);
n=220; % 每一帧长
n1=160; %每两帧重合的长度
frame=floor((N-n)/(n-n1)); %帧数
for i=1:frame
y1=x((i-1)*(n-n1)+1:(i-1)*(n-n1)+n).*hamming(n); % 每一帧对应的语音信号
fy=fft(y1,n); %求fft
nen(i,:)=abs(fy).^2; %求能量
ang(i,:)=angle(fy); % 求角度
end
yuzhi=sum(sum(nen(2:5,:)))/(4*n); % 求阈值,信号开始阶段的能量平均值
for i=1:frame
nen(i,:)=nen(i,:)-yuzhi; % 减谱
nen(i,find(nen(i,:)<0))=0; % 将小于0的部分赋值为0
end
for i=1:frame
nen(i,:)=sqrt(nen(i,:));
jie=nen(i,:).*exp(j*ang(i,:)); %求频域函数
out(i,:)=real(ifft(jie))./hamming(n)'; %求逆fft
end
zong=out(1,:)'; % 对out求导,以便于原信号比较
jiewei=n;
for i=2:frame %将一系列的帧组合还原
zong(jiewei-n1+1:jiewei)=(zong(jiewei-n1+1:jiewei)+out(i,1:n1)')/2;
jiewei=jiewei+n-n1;
zong=[zong;out(i,n1+1:end)'];
end
figure(1);
subplot(211);
plot(x); %画加噪的原始语音信号
axis([1,(n-n1)*frame+n,min(x),max(x)]);
subplot(212);
specgram(x,fs,1024,n,n1); % 对应的鱼谱图
figure(2);
subplot(211);
plot(zong); %画增强的语音信号
axis([1,(n-n1)*frame+n,min(zong),max(zong)]);
subplot(212);
specgram(zong,fs,1024,n,n1);
wavplay(x,fs); % 输出音频
wavplay(zong,fs);
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务