for i=1:numberOfFrames SpeechFlag=SF(i); if SpeechFlag==0 % 在无话段中平滑更新噪声谱值 N=(NoiseLength*N+Y(:,i))/(NoiseLength+1); NRM=max(NRM,YS(:,i)-N); % 求取噪声最大残留值 X(:,i)=Beta*Y(:,i); else D=YS(:,i)-N; % 谱减法消噪 if i>1 && i<numberOfFrames % 消去噪声的残留值 for j=1:length(D) if D(j)<NRM(j) D(j)=min([D(j) YS(j,i-1)-N(j) YS(j,i+1)-N(j)]); end end end X(:,i)=max(D,0); % 每条谱线幅值都大于0 end end 在这段代码里,当某个频率的幅值低于对应的噪声最大残留时,会取周边两个片段的最小值。为什么用这个方法可以减少噪声残留,有什么数学依据么。 |
1 条回复