语音增强基于matlab多维谱自适应小波语音信号去噪含Matlab源码 1972期
Posted 海神之光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音增强基于matlab多维谱自适应小波语音信号去噪含Matlab源码 1972期相关的知识,希望对你有一定的参考价值。
一、自适应小波语音信号去噪
1 引言
语音信号在传输过程中,容易受到环境噪声和其他语音的干扰,降低了语音通信质量,影响了语音处理系统工作。所以,语音的净化处理技术,在现代语音通信和数字音频广播系统中起到愈来愈重要的作用。小波变换具有良好的时频局部化分析特性,是处理语音这种非平稳时变信号的有效方法。但随着尺度的增大,正交小波基函数的空间分辨率愈高,其频率分辨率愈低。小波包具有随尺度增大而变宽的频谱窗口进一步分割变细的特性,能克服正交小波变换的不足,可对信号进一步分解,提高频率分辨率,是一种比多分辨分析更加精细的分解方法,具有更好的时频特性。因此,利用小波包变换去除信号中的噪声,实现更好的语音净化效果。
2 小波包变换理论
小波包变换在小波变换基础上进一步提出,可将小波变换没有细分的高频部分进一步分解,为信号提供了更精细的分析方法。对于有丰富高频分量的语音信号来说,小波包变换是理想的分析工具,克服了正交小波基的一个主要缺陷,即随着尺度的增大,相应的正交小波基函数的时间分辨率愈高,而其频率分辨率愈低。通过空间小波包分解,其实质是让信号通过高、低通滤波器,进行隔点采样,把信号逐层分解到不同频段。
小波包分解公式为
小波包重构公式为
3 自适应阈值法去噪
3.1 阈值法小波去噪
首先对被噪声污染的语音信号f(t)进行离散序列小波变换,得到带有噪声的小波系数w(j,k),其中,j=0,1,2,…,N;k=0,1,2,…,N;然后用设定的阈值λ作为门限对小波系数进行处理,对低于λ的小波系数作为由噪声引起的,仅让超过λ的那些显著的小波系数来重构原始纯净语音信号s(t)。阈值法小波去噪处理框图如图1所示。
图1 阈值法小波去噪处理框图
阈值法小波去噪因容易实现、计算量小,所以得到了广泛应用。Donoho和Johnstone提出的硬阈值和软阈值方法是目前最普遍的方法。硬阈值法采用式(3)的硬阈值函数进行阈值处理,软阈值法采用式(4)的软阈值函数进行阈值处理。
3.2 自适应阈值法
Donoho的软阈值法虽然取得了不错的效果,但其基于正交小波基。笔者采用小波包分析的方法,并对其阈值选取进行了进一步研究。由信号的奇异性理论,白噪声具有负的奇异性,其幅度和稠密度随尺度的增大而减小,而信号则相反。因此阈值的选取不能单一,应能根据噪声情况自动调节阈值大小。笔者采用自适应阈值法来克服这种缺点,即下一时刻的阈值λ(k+1)等于现在时刻的阈值λ(k)减去一个扰动项,该扰动项正比于均方误差函数的梯度值Δλ,即
式中,α为步长,可根据精度选择。
算法的关键时求出Δλ(k),可设一个关于观测值Y的函数
由式(10)可看出,如采用常用的硬阈值或软阈值函数,由于导数不连续甚至没有导数,无法进行自适应迭代,当然也无法得到最佳阈值。为获得最佳阈值,实现更好的去噪效果,应采用具有连续导数的阈值函数。阈值函数,即
这种阈值函数的好处是:当|x|非常接近阈值λ时,不会直接将小于阈值的小波系数置零,而是渐近为零;在|x|≥λ内,该函数对小波系数采取的是缓变地压缩,这样做符合对大于阈值的小波系数的处理,能较好地处理有用信号中存在的噪声分量。
二、部分源代码
clear all; close all; clc;
% Audio acquisition
[file,path] = uigetfile('./Databases/*.wav', 'Select the speech files', 'MultiSelect', 'on');
[audio_signal,fs] = audioread([path,file]);
Fs = fs; N = 1024; seqAxis = 0:1:N-1; step = 0;
audio_signal = audio_signal.'/max(abs(audio_signal));
audio_signal = cat(2,zeros(1,N),audio_signal);
% Additive noise + filtering @8KHz
noise = randn(1,length(audio_signal));
nsVar = 0.05;
noise = nsVar * noise/max(abs(noise));
Hd = mylowpass;
audio_noisy = audio_signal + noise;
audio_noisy = filter(Hd,audio_noisy);
% SNR values
Pa = bandpower(audio_signal);
Ps = bandpower(audio_noisy);
Pn = bandpower(noise);
SNR = 10*log10(Pa/Pn);
% Window choice and preparation
h = hann(N); % Hanning
%h = hamming(N); % Hamming
h = h'; weight = sum(abs(h.^2));
% Wiener Filter parameters
umax = 10; u0 = (1+4*umax/5); z = 25/(umax-1);
%% MTS: Sine Tapers + Noise estimation
m = 0:N-1; L = 5; l = 1:L;
a = sqrt(2/(N+1)).*sin((pi * l' * (m+1))/(N+1));
figure(1); clf
set(gcf,'Name','Sine tapers')
S_k_n = 0.0;
for currentTaper = 1:L
S_k_n = S_k_n + abs(fft(a(currentTaper,:) .* audio_noisy(1:N))).^2;
plot(a(currentTaper,:));
hold on
end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]张飞.基于小波包变换的自适应阈值语音去噪净化[J].电声技术. 2009,33(10)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
以上是关于语音增强基于matlab多维谱自适应小波语音信号去噪含Matlab源码 1972期的主要内容,如果未能解决你的问题,请参考以下文章
语音去噪基于matlab GUI软阈值+硬阈值+软硬折中阈值语音去噪含Matlab源码 1810期
数字信号去噪基于matlab小波软阈值+硬阈值+改进阈值数字信号去噪含Matlab源码 1025期