【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、小波语音降噪简介
对于噪声频谱遍布于语音信号频谱之中的宽带噪声,如果噪声振幅比大部分的语音信号振幅低,则削去低幅度成分也就削去了宽带噪声。基于这种思路,可以在频域中采取中心限幅的方法,即让带噪语音信号通过一限幅滤波器,高幅度频谱可以通过而低幅成分不允许通过,从而实现噪声抑制。需要注意的是中心削波不可避免地要损害语音质量,通常只在频域中进行,而一般不在时域中实施。
小波降噪的原理类似于中心削波法。小波降噪最初是由Donoho和Johnstone提出的, 其主要理论依据是,小波变换具有很强的去数据相关性,它能够使信号的能量在小波域集中在一些大的小波系数中;而噪声的能量却分布于整个小波域内。因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值。因此,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声。于是,采用阈值的办法可以把信号系数保留,而使大部分噪声系数减小至0。小波降噪的具体处理过程为:将含噪信号在各尺度上进行小波分解,设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完全保
留, 或者做相应的“收缩”(shrinkage) 处理。最后; 将处理后获得的小波系数用逆小波变换进行重构,得到去噪后的信号。
阈值去噪中,阈值函数体现了对超过和低于阈值的小波系数的不同处理策略,是阈值去噪中关键的一步。设w表示小波系数, T为给定阈值, sgn(*) 为符号函数, 常见的阈值函数主要有:
三、部分源代码
clear all; clc; close all;
[xx, fs] = wavread('C5_4_y.wav'); % 读入数据文件
xx=xx-mean(xx); % 消除直流分量
x=xx/max(abs(xx)); % 幅值归一化
N=length(x);
%-------------------------加入指定强度的噪声---------------------------------
SNR=5;
s=awgn(x,SNR,'measured','db'); % 叠加噪声
wname='db7';
jN=6; %分解的层数
snrs=20*log10(norm(x)/norm(s-x));
signal=Wavelet_Hard(s,jN,wname);
signal=signal/max(abs(signal));
snr1=SNR_Calc(x,s); % 计算初始信噪比
snr2=SNR_Calc(x,signal); % 计算降噪后的信噪比
snr=snr2-snr1;
fprintf('snr1=%5.4f snr2=%5.4f snr=%5.4f\n',snr1,snr2,snr);
% 作图
time=(0:N-1)/fs; % 设置时间
subplot 311; plot(time,x,'k'); grid; axis tight;
title('纯语音波形'); ylabel('幅值')
subplot 312; plot(time,s,'k'); grid; axis tight;
title(['带噪语音 信噪比=' num2str(SNR) 'dB']); ylabel('幅值')
unction snr=SNR_Calc(I,In)
% 计算带噪语音信号的信噪比
% I 是纯语音信号
% In 是带噪的语音信号
% 信噪比计算公式是
% snr=10*log10(Esignal/Enoise)
I=I(:)'; % 把数据转为一列
In=In(:)';
Ps=sum((I-mean(I)).^2); % 信号的能量
%小波软阈值函数
function signal=Wavelet_Soft(s,jN,wname)
[c,l]=wavedec(s,jN,wname);
%高频分量的索引
first = cumsum(l)+1;
first1=first;
first = first(end-2:-1:1);
ld = l(end-1:-1:2);
last = first+ld-1;
%--------------------------------------------------------------------------
%软阈值
cxdsoft=c;
for j=1:jN %j是分解尺度
flk = first(j):last(j); %flk是di在c中的索引
thr(j)=sqrt(2*log((j+1)/j))*median(c(flk))/0.6745;
for k=0:(length(flk)-1) %k是位移尺度
djk=c(first(j)+k); %为了简化程序
absdjk=abs(djk);
thr1=thr(j);
if absdjk<thr1
djk=0;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/114871523
- 点赞
- 收藏
- 关注作者
评论(0)