1 简介 传统谱减法是从带噪信号的总能量中减去噪声能量,从而得到有用信号的能量,再对该能量开方和相位匹配后做傅里叶逆变换,即可恢复有用信号.该方法要求噪声信号与语音信
1 简介
传统谱减法是从带噪信号的总能量中减去噪声能量,从而得到有用信号的能量,再对该能量开方和相位匹配后做傅里叶逆变换,即可恢复有用信号. 该方法要求噪声信号与语音信号不相关,且噪声在语音活动区域近似于稳态噪声.维纳滤波法是假想带噪信号通过滤波器后产生了一组信号,并得到该组信号与期望信号的误差信号,通过对滤波器系数求导可以获取使均方误差最小时的滤波器系数. 在实际应用中,一般不易获得噪声和信号的独立的统计分布规律,这限制了维纳滤波法的应用范围. 采用子空间投影法可以从带噪信号中获得纯信号和噪声信号的线性估计,即将带噪鼾声投影到信号和噪声子空间,在一定意义上将噪声和信号的特征值分离,方便构造维纳滤波器.
2 部分代码
function ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLen);if nargin<2
yphase=angle(XNEW);
end
if nargin<3
windowLen=size(XNEW,1)*2;
end
if nargin<4
ShiftLen=windowLen/2;
end
if fix(ShiftLen)~=ShiftLen
ShiftLen=fix(ShiftLen);
disp('The shift length have to be an integer as it is the number of samples.')
disp(['shift length is fixed to ' num2str(ShiftLen)])
end
[FreqRes FrameNum]=size(XNEW);
Spec=XNEW.*exp(j*yphase);
if mod(windowLen,2) %if FreqResol is odd
Spec=[Spec;flipud(conj(Spec(2:end,:)))];
else
Spec=[Spec;flipud(conj(Spec(2:end-1,:)))];
end
sig=zeros((FrameNum-1)*ShiftLen+windowLen,1);
weight=sig;
for i=1:FrameNum
start=(i-1)*ShiftLen+1;
spec=Spec(:,i);
sig(start:start+windowLen-1)=sig(start:start+windowLen-1)+real(ifft(spec,windowLen));
end
ReconstructedSignal=sig;
3 仿真结果
4 参考文献
[1]彭健新, 唐云飞. 谱减法与维纳滤波法相结合的睡眠鼾声降噪处理[J]. 华南理工大学学报:自然科学版, 2018, 46(3):5.