【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
作者:互联网
一、简介
1 小波变换应用领域:信号处理、图像处理
2 领域内的应用:信号(图像)的降噪、压缩
3 小波变换的优势:在正交小波中,正交基的选取比传统方法更接近实际信号本身,所以通过小波变换可以更容易地分离出噪声或其他我们不需要的信息,因此在这类应用中小波分析有着传统方法无可比拟的优势。
4 降噪和压缩这两种应用有一个共同点在于他们都是尽量把无用的信息从原始信号中剔除,所以Matlab提供了一条通用的命令wdencmp,同时处理降噪和压缩。
5 降噪准则
• 光滑性:在大部分情况下,降噪后的信号应该至少和原信号具有同等的光滑性;
•相似性:降噪后的信号和原信号的方差估计应该是最坏情况下的方差最小;(MinmaxEstimator);
6 降噪过程
(1)分解过程:选定一种小波,对信号进行N层小波(小波包)分解;
(2)作用阈值过程:对分解得到的各层系数选择一个阈值,并对细节系数作用软阈值处理;
(3)重建过程:对处理后的系数通过小波(小波包)重建恢复原始信号。
在小波分析用于降噪的过程中,和信号的步骤就是在系数上作用阈值。因为阈值的选取直接影响降噪的质量,所以人们提出了各种理论和经验的模型。但没有一种模型时通用的,他们都有自己的使用范围。
在小波分析用于降噪的过程中,和信号的步骤就是在系数上作用阈值。因为阈值的选取直接影响降噪的质量,所以人们提出了各种理论和经验的模型。但没有一种模型时通用的,他们都有自己的使用范围。
小波变换中,对各层系数降噪所需的阈值一般是根据原信号的信号噪声比来取得,从理论模型里这个量用式(1)中的
二、源代码
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;
三、运行结果
四、备注
版本:2014a
标签:小波软,语音,阈值,signal,降噪,源码,SNR,信号,first 来源: https://blog.51cto.com/u_15287606/2975945