【语音去噪】谱减法+小波变换+改进的EMD算法语音去噪【含Matlab源码 3551期】

在这里插入图片描述

⛄一、谱减法+小波变换+改进的EMD算法语音去噪

1 谱减法
在语音去噪中最常用的方法是谱减法,谱减法是一种发展较早且应用较为成熟的语音去噪算法,该算法利用加性噪声与语音不相关的特点,在假设噪声是统计平稳的前提下,用无语音间隙测算到的噪声频谱估计值取代有语音期间噪声的频谱,与含噪语音频谱相减,从而获得语音频谱的估计值。谱减法具有算法简单、运算量小的特点,便于实现快速处理,往往能够获得较高的输出信噪比,所以被广泛采用。该算法经典形式的不足之处是处理后会产生具有一定节奏性起伏、听上去类似音乐的“音乐噪声”。

转换到频域后,这些峰值听起来就像帧与帧之间频率随机变化的多频音,这种情况在清音段尤其明显,这种由于半波整流引起的“噪声”被称为“音乐噪声”。从根本上,通常导致音乐噪声的原因主要有:
(1)对谱减算法中的负数部分进行了非线性处理
(2)对噪声谱的估计不准
(3)抑制函数(增益函数)具有较大的可变性

谱减法的缺点
1)由于对负值进行半波整流,导致帧频谱的随机频率上出现小的、独立的峰值,变换到时域上面,这些峰值听起来就像帧与帧之间频率随机变化的多颤音,也就是通常所说的“音乐噪声”(Musical Noise)
2)另外,谱减法还存在一个小缺点就是使用带噪语音的相位作为增强后语音的相位,因此产生语音的质量可能比较粗糙,尤其是在低信噪比的条件下,可能会达到被听觉感知的程度,降低语音的质量。
为了更好的理解谱减法语音增强,这里对该算法进行简单仿真,仿真参数设置如下
在这里插入图片描述
2 小波降噪
小波降噪是Donoho和Johnstone提出的,其主要理论依据是,小波变换具有很强的去数据相关性,它能够使信号的能量在小波域集中在一些大的小波系数中;而噪声的能量却分布于整个小波域内。因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值。因此,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声。于是,采用阈值的办法可以把信号系数保留,而使大部分噪声系数减小至零。小波降噪的具体处理过程为:将含噪信号在各尺度上进行小波分解,设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完全保留,或者做相应的“收缩(shrinkage)”处理。最后,将处理后获得的小波系数用逆小波变换进行重构,得到去噪后的信号。阈值去噪中,阈值函数体现了对超过和低于阈值的小波系数不同处理策略,是阈值去噪中关键的一步。设w表示小波系数,T为给定阈值,sgn(*)为符号函数,常见的阈值函数主要有以下两种。

⛄二、部分源代码

function varargout = speech_gui(varargin)
%SPEECH_GUI M-file for speech_gui.fig
% SPEECH_GUI, by itself, creates a new SPEECH_GUI or raises the existing
% singleton*.
%
% H = SPEECH_GUI returns the handle to a new SPEECH_GUI or the handle to
% the existing singleton*.
%
% SPEECH_GUI(‘Property’,‘Value’,…) creates a new SPEECH_GUI using the
% given property value pairs. Unrecognized properties are passed via
% varargin to speech_gui_OpeningFcn. This calling syntax produces a
% warning when there is an existing singleton*.
%
% SPEECH_GUI(‘CALLBACK’) and SPEECH_GUI(‘CALLBACK’,hObject,…) call the
% local function named CALLBACK in SPEECH_GUI.M with the given input
% arguments.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help speech_gui

% Last Modified by GUIDE v2.5 04-Dec-2013 09:54:05

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @speech_gui_OpeningFcn, …
‘gui_OutputFcn’, @speech_gui_OutputFcn, …
‘gui_LayoutFcn’, [], …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% — Executes just before speech_gui is made visible.
function speech_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin unrecognized PropertyName/PropertyValue pairs from the
% command line (see VARARGIN)

% Choose default command line output for speech_gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes speech_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = speech_gui_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% — Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
global snr;
snr=5;
% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,‘Value’) returns toggle state of radiobutton1

% — Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, eventdata, handles)
global snr;
snr=0;
% hObject handle to radiobutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,‘Value’) returns toggle state of radiobutton2

% — Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
global snr;
snr=-5;
% hObject handle to radiobutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hint: get(hObject,‘Value’) returns toggle state of radiobutton3

% — Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Y;
global X;
global snr;
global fs;
sound(X);

% — Executes on button press in pushbutton2.

function pushbutton2_Callback(hObject, eventdata, handles)
global Y;
global snr;
global pathname;
global X;

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

语音增强是语音信号处理中的一个重要问题。其中,基于EMD去噪谱减法是一种常用的语音增强方法。下面是该方法的matlab代码及算法思路。 算法思路: 1. 对输入的语音信号进行EMD分解,得到多个IMF分量。 2. 选择需要增强的IMF分量,并对其进行谱减法处理。 3. 对处理后的IMF分量进行反变换,得到增强后的语音信号。 4. 对增强后的语音信号进行后处理,如均衡化、归一化等。 Matlab代码: 1. EMD分解 ```matlab % 输入语音信号 [x,fs] = audioread('input.wav'); % EMD分解 imf = emd(x); % 绘制IMF分量 for i = 1:size(imf,2) subplot(size(imf,2),1,i); plot(imf(:,i)); title(['IMF ' num2str(i)]); end ``` 2. 谱减法处理 ```matlab % 选择需要增强的IMF分量 imf_enhance = imf(:,2); % 谱减法处理 win_size = round(fs*0.025); % 窗口大小 win_shift = round(fs*0.01); % 窗口移动步长 nfft = 2^nextpow2(win_size); % FFT点数 alpha = 2; % 调整因子 for i = 1:win_shift:length(imf_enhance)-win_size % 分帧 frame = imf_enhance(i:i+win_size-1); % FFT frame_fft = fft(frame,nfft); % 计算功率谱 power = abs(frame_fft).^2; % 计算噪声谱 if i == 1 noise_power = power; else noise_power = alpha*noise_power+(1-alpha)*power; end % 谱减 power_enhance = max(power-noise_power,0); % IFFT frame_enhance = real(ifft(sqrt(power_enhance).*frame_fft,nfft)); % 重叠加和 if i == 1 imf_enhance(i:i+win_size-1) = frame_enhance; else imf_enhance(i+win_shift:i+win_size-1) = imf_enhance(i+win_shift:i+win_size-1)+frame_enhance(win_shift+1:end); end end ``` 3. 反变换 ```matlab % 反变换 x_enhance = sum(imf(:,[1 3:end]),2)+imf_enhance; % 写入输出文件 audiowrite('output.wav',x_enhance,fs); ``` 4. 后处理 ```matlab % 后处理,如均衡化、归一化等 x_enhance = x_enhance/max(abs(x_enhance)); ``` 以上就是基于EMD去噪谱减法语音增强法的matlab代码及算法思路。需要注意的是,该方法在实际应用中可能需要根据实际情况进行参数调整才能得到更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab领域

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值