当前位置 : 主页 > 编程语言 > python >

【信号去噪】基于谱减法和维纳滤波实现语音去噪含Matlab源码

来源:互联网 收集:自由互联 发布时间:2022-06-18
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 仿真结果

【信号去噪】基于谱减法和维纳滤波实现语音去噪含Matlab源码_参考文献

【信号去噪】基于谱减法和维纳滤波实现语音去噪含Matlab源码_维纳滤波_02

4 参考文献

[1]彭健新, 唐云飞. 谱减法与维纳滤波法相结合的睡眠鼾声降噪处理[J]. 华南理工大学学报:自然科学版, 2018, 46(3):5.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。


【信号去噪】基于谱减法和维纳滤波实现语音去噪含Matlab源码_matlab代码_03

网友评论