1.ソフトウェアバージョン
matlab2021a
2.このアルゴリズムの理論的知識
広帯域ノイズを処理するための最も一般的な手法は、スペクトル減算です。これは、ノイズの多い音声推定値からノイズの多いスペクトル推定値を減算して、クリーンな音声のスペクトルを取得します。人間の耳は音声スペクトル成分の位相に敏感ではないため、この方法は主に短期間の振幅スペクトルを対象としています。音声は定常信号であると想定されますが、ノイズと音声は相加的であり、互いに無相関です。このとき、ノイズの多い音声信号はとして表すことができます。
3.コアコードの一部
function enhancedsignal=wiener(noisyspeech,samplefrequency)
x=noisyspeech;
fs=samplefrequency;
nx=length(x);
enhanced_x=zeros(1,nx);
%分帧和加窗
FrameLen=fix(0.025*fs); %取25毫秒为一帧
overlap=FrameLen/2;
inc=FrameLen-overlap; %帧移
x_frame=enframe(x,FrameLen,inc); %分帧
nf=size(x_frame,1); % 帧数
win=hamming(FrameLen)';
x_window=[];
for k=1:nf
x_row=x_frame(k,:).*win; % 加窗
x_window=[x_window;x_row];
end
%对带噪语音进行DFT
y=fft(x_window');
ymag = abs(y);
yphase = angle(y);
NNoise=23; %取噪音段(语音的初始段)帧数
MN=mean(ymag(:,1:NNoise)')';
PN=mean(ymag(:,1:NNoise)'.^2)'; %初始噪声功率谱均值
NoiseCounter=0;%连续噪声段长度
SmoothFactor=9;%噪声平滑因子
Alpha=0.95; %语音平滑因子
SNRPre=ones(size(MN));
%维纳滤波
for k=1:nf
if k<=NNoise
SpeechFlag=0;
NoiseCounter=NNoise;
else
NoiseMargin=3;
HangOver=8;
SpectralDist= 20*(log10(ymag(:,k))-log10(MN));
SpectralDist(find(SpectralDist<0))=0;
Dist=mean(SpectralDist);
if (Dist < NoiseMargin)
NoiseFlag=1;
NoiseCounter=NoiseCounter+1;
else
NoiseFlag=0;
NoiseCounter=0;
end
if (NoiseCounter > HangOver)
SpeechFlag=0;
else
SpeechFlag=1;
end
end
if SpeechFlag==0
MN=(SmoothFactor*MN+ymag(:,k))/(SmoothFactor+1); %更新噪声均值
PN=(SmoothFactor*PN+(ymag(:,k).^2))/(1+SmoothFactor); %更新噪声功率
end
%------滤波
SNRNew=(ymag(:,k).^2)./PN-1;
SNRPost=Alpha*SNRPre+(1-Alpha).*max(SNRNew,0);
Gain=SNRPost./(SNRPost+1);
smag=Gain.*ymag(:,k);
SNRPre=smag.^2./PN;
spectrum= smag.*exp(j*yphase(:,k));
enhanced_x((inc*(k-1)+1):(inc*(k-1)+FrameLen))=enhanced_x((inc*(k-1)+1):(inc*(k-1)+FrameLen))+real(ifft(spectrum,FrameLen))';
end
enhancedsignal=enhanced_x;
4.シミュレーションの結論
5.参考文献
[1] Yi Kechu。音声信号処理[M]。北京:国防産業プレス、2000年。
[2] LiZhao、KOBAYASHI、NIIMIYTone。連続HMMを使用した中国語の連続音声の認識[J]。日本音響学会誌、53(12)、933-940、1997。
A03-03
6.完全なソースコードを入手する方法
方法1:ブロガーに連絡するためのWechatまたはQQ
方法2:サブスクリプション、チュートリアルのケースコードとこのブログの2つの完全なソースコードへの無料アクセス