ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】

2021-06-27 20:01:02  阅读:270  来源: 互联网

标签:小波软 语音 阈值 signal 降噪 源码 SNR 信号 first


一、简介

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
完整代码或代写加1564658423

标签:小波软,语音,阈值,signal,降噪,源码,SNR,信号,first
来源: https://www.cnblogs.com/homeofmatlab/p/14941903.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有