⛄一、谱减法+小波变换+改进的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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除