写在前面:仅作为个人学习笔记,便于以后查阅,如对你有帮助,荣幸之至,如有错误,欢迎评论指正
编程软件:matlab R2018b
系统: win10
系列文章目录
滤波
将.m4a的录音文件转化为.wav格式的语言文件后,对语音文件中接收到的语音信号进行消除趋势项和滤波处理。
消除多项式趋势:即减弱硬件设备对语音信号的影响。在采集语音信号数据的过程中,由于测试系统的某些原因在时间序列中会产生一个线性的或者慢变的趋势误差,例如放大器随温度变化产生的零漂移等,总之使语音信号的零线偏离基线,甚至偏离基线的大小随时间变化。零线随时间偏离基线被称为信号的趋势项。趋势项误差的存在,会使相关函数、功率谱函数在处理计算中出现变形,甚至可能使低频段的谱估计完全失去真实性和正确性,所以应去除语音信号的趋势项。常用的消除多项式趋势项的方法是用多项式最小二乘法。具体代码如下:
polydetrend.m
:
function [y,xtrend]=polydetrend(x, fs, m)
x=x(:); % 把语音信号x转换为列数据
N=length(x); % 求出x的长度
t= (0: N-1)'/fs; % 按x的长度和采样频率设置时间序列
a=polyfit(t, x, m); % 用最小二乘法拟合语音信号x的多项式系数a
xtrend=polyval(a, t); % 用系数a和时间序列t构成趋势项
y=x-xtrend; % 从语音信号x中清除趋势项
使用方法如下:
[xPoly, xtrend] = polydetrend(x, fs, 3);%%% wave filtering——Clear polynomial trend
% xPoly为去除多项式趋势后的语音信号,xtrend为得到的多项式趋势项,x为语音信号,fs为信号采样率,3为多项式级数
滤波(Wave filtering):是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。
设计带通滤波器:本案例参考了网上教程,使用matlab自带的滤波器对语音信号进行滤波,具体操作流程如下所示:
- matlab命令行中输入
filterDesigner
- 本案例选择使用带通滤波器,下截止频率为17KHZ,上截止频率为21KHZ,通带为18KHZ~20KHZ。
点击下部的Design Filter
,设计出的滤波器频域如下所示:
- 依次点击"file"->“Generate MATLAB Code”->“Filter Design Functions”,matlab将自动生成滤波器的相关函数
- 对接收到的信号进行滤波处理,滤波前后的信号时域图及频域图如下所示:
设计好的滤波器代码如下,本案例将matlab自动生成的滤波器保存为bPFilter_18_20.m
:
function Hd = bPFilter_16_18
%BPFILTER_16_18 Returns a discrete-time filter object.
% MATLAB Code
% Generated by MATLAB(R) 9.5 and Signal Processing Toolbox 8.1.
% Generated on: 08-Dec-2020 14:51:28
% FIR Window Bandpass filter designed using the FIR1 function.
% All frequency values are in Hz.
Fs = 48000; % Sampling Frequency
Fstop1 = 15000; % First Stopband Frequency
Fpass1 = 16000; % First Passband Frequency
Fpass2 = 18000; % Second Passband Frequency
Fstop2 = 19000; % Second Stopband Frequency
Dstop1 = 1e-05; % First Stopband Attenuation
Dpass = 0.057501127785; % Passband Ripple
Dstop2 = 1e-05; % Second Stopband Attenuation
flag = 'scale'; % Sampling Flag
% Calculate the order from the parameters using KAISERORD.
[N,Wn,BETA,TYPE] = kaiserord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 ...
1 0], [Dstop1 Dpass Dstop2]);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);
Hd = dfilt.dffir(b);
% [EOF]
滤波器调用方法:y = filter(bPFilter_18_20, x);
,其中x
为待滤波的语音信号,y
为滤波后的语音信号。
分帧处理
加窗和分帧都是语音信号提取特征的预处理阶段。
分帧:简单来说,一段语音信号整体上看不是平稳的,但在局部上可以看作是平稳的。在后期的语音处理中需要输入的是平稳信号,所以要对整段语音信号分帧,也就是切分成很多段。在10-30ms范围内都可以认为信号是稳定的,一般以不少于20ms为一帧,1/2左右时长为帧移分帧。帧移是相邻两帧间的重叠区域,是为了避免相邻两帧的变化过大。
加窗:按上述方法加窗后,每一帧的起始段和末尾端会出现不连续的地方,所以分帧越多与原始信号的误差也就越大。加窗就是为了解决这个问题,使分帧后的信号变得连续,每一帧就会表现出周期函数的特征。在语音信号处理中一般加汉明窗。
可使用maltab内置的分帧函数