一、语音处理简介
语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式。语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义。噪声广泛存在于生活, 信号在传输过程中不可避免会受到各类噪声的干扰, 降低了信号的可读性, 因此对携带噪声的信号进行去噪处理十分必要。语音信号是一种特殊的信号, 其在传输过程中, 由于外界环境和设备的影响不可避免会被噪声干扰, 一定程度上影响了人们所接收信息的准确性。人们提出了各种语音去噪方法, 其中, 常用的有滤波器去噪法、小波分析去噪法以及小波包分析去噪法。
MATLAB是一种功能强大, 具有很好的交互性的数值计算和可视化计算高级语言, 其强大的矩阵运算, 数值分析以及信号处理功能使其广泛应用于众多科学领域中。因此作者使用MATLAB作为设计工具软件来进行语音信号去噪处理。
作者在MATLAB环境下应用滤波器去噪方法对加噪声的语音信号进行时域、频域的分析和滤波。通过MATLAB编程对语音信号被噪声污染进行仿真处理, 并对加噪声前后的频谱图进行对比;然后根据语音信号特点设计各类滤波器;最后将所设计的滤波器分别应用于含噪声的语音信号, 并对其频谱图进行对比分析, 确定最优化方法。
1 总体设计 利用MATLAB作为平台实现滤波和频谱分析, 主要分为语音信号采集、语音信号分析、语音信号加噪、滤波分析以及GUI设计五个模块, 系统框图如图1所示。 首先对采集的语音信号进行频谱分析, 然后对其进行加噪并对加噪后的信号进行频谱分析。而滤除噪声的方法选择了噪性能较好的滤波器方法, 即通过设计无限脉冲相应IIR滤波器来完成, 并利用这两种方法对加噪后的语音信号进行去噪处理, 然后从频域角度对结果进行了对比分析。最后为了加强程序的友好性和可视性, 采用GUI编程的方法来设计语音信号去噪系统用户界面。
2 语音信号采集和加噪 2.1 语音信号采集 文章利用PC机声卡对语音信号进行采集。PC机的声卡采样率一般在64 KHz以上, 即一秒钟可以采集64 000个声音样本。而人们正常的语音信号一般在300 Hz至34 000 Hz之间, 根据奈奎斯特采样定理, 一般的正常的语音信号均可以利用声卡采集并且保证其不失真。在安静环境下的正常交流可以近似为纯语音信号, 声音信号的长度最好控制在10 s内以便后期分析处理。
2.2 语音信号加噪 对已经获得的纯语音信号进行加噪处理来模拟在实际生活中语音信号被噪声污染的情况。利用MATLAB中的audioread函数把语音信号转换成序列, 得到信号信息;sound函数可以将采样序列通过声卡转换成声音, 可直观听出加噪前后的区别。高斯白噪声可用具体的数学表达式表示, 且可以贴近反映实际信道中的加性噪声的情况。
文章选择对语音信号加入高斯白噪声来模拟声音被污染的情况。利用MATLAB中的随机函数 (rand或randn) 产生符合高斯分布序列的噪声序列并将其加到语音信号中, 用来模拟语音信号被污染。通过对其频谱分析, 声音的回放可以很清楚的听出加噪前后的区别。也可以通过sound函数便可以听到加噪后的语音信号, 与原始语音信号相比, 声音刺耳根本不能分辨出原始语音信号。
3 语音信号去噪方法 对于语音去噪现在已经有一些比较成熟的方法, 如小波变换法, 小波包变换法, 以及滤波器法。利用小波的方法去噪设计过程相对繁琐, 因此, 选用滤波器方法来实现去噪功能。
3.1 IIR滤波器语音去噪 IIR滤波器一般有三种设计方法, 分别为:零极点位置累试法、利用模拟滤波器设计数字滤波器和最优化设计法。本文选用滤波器方法, 在设计IIR滤波器的时候可以借鉴经典的成熟的模拟滤波器, 如巴特沃斯滤波器、切比雪夫滤波器和椭圆滤波器等。文章将使用巴特沃斯低通滤波器来设计数字滤波器。
由原始语音信号及其加噪前后的频谱分析可知, 所设计滤波器应该要实现的功能是滤除掉出语音信号之外的噪声部分的频率, 根据要求给出技术指标如下: 低通滤波器的性能指标:fp=1 000 Hz, fs=1200 Hz, αs=50 db, αp=1 d B 高通滤波器的性能指标:fp=3 500 Hz, fs=4000 Hz, αs=50 d B, αp=1 d B 带通滤波器的性能指标:fp1=1 200 Hz, fp2=3 000 HZ, fs1=1 000 Hz, fs2=3 200 Hz, αs=100d B, αp=1 d B 其中fp表示通带截止频率;fs为阻带截止频率;αp表示最大通带衰减;αs表示最小阻带衰减。
当得出相关的技术指标后便可以利用经典滤波器来设计低通滤波器, 这里采用巴特沃斯滤波器来设计模拟低通滤波器, 并得到低通滤波器的系统函数, 即H (s) 。得到一个可以实现相关功能的模拟低通滤波器后将会采用频率变换的方法通过低通滤波器的系统函数变换出相关的高通、带通或带阻滤波器的系统函数。
二、部分源代码
function varargout = main(varargin)
% MAIN MATLAB code for main.fig
% MAIN, by itself, creates a new MAIN or raises the existing
% singleton*.
%
% H = MAIN returns the handle to a new MAIN or the handle to
% the existing singleton*.
%
% MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MAIN.M with the given input arguments.
%
% MAIN('Property','Value',...) creates a new MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to main_OpeningFcn via varargin.
%
% *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 main
% Last Modified by GUIDE v2.5 25-Dec-2017 23:52:39
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_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 main is made visible.
function main_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 command line arguments to main (see VARARGIN)
% Choose default command line output for main
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = main_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 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)
%---------------------------利用函数wavread对语音信号的采集--------------------------------%
global wav_in;
global wav_in_1;
global Fs;
global bits;
global n;
global f1;
[filename pathname]=uigetfile({'*.wav'}, 'File Selector');
[wav_in,Fs] = audioread([pathname '\' filename]);
handles.wav_in = wav_in;
guidata(hObject, handles);
axes(handles.axes1);
% aa=abs(fftshift(wav_in));
% plot(aa);title('')
N=length(wav_in);
n=0:N-1;
plot(n,wav_in); %画出原始语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
f1=fft(wav_in,N); %对语音号进行快速傅里叶变换,得出频谱
% GX=fft(wav_in,512);
三、运行结果
四、matlab版本及参考文献
1 matlab版本 2014a
2 参考文献 [1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019. [2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019. [3]宋云飞,姜占才,魏中华.基于MATLAB GUI的语音处理界面设计[J].科技信息. 2013,(02) [4]韩长军.基于MATLAB的语音信号去噪方法应用[J].辽东学院学报(自然科学版). 2017,24(01)
3 备注 简介此部分摘自互联网,仅供参考,若侵权,联系删除
|