语音信号预处理2——滤波、分帧处理及端点检测

写在前面:仅作为个人学习笔记,便于以后查阅,如对你有帮助,荣幸之至,如有错误,欢迎评论指正

编程软件:matlab R2018b
系统: win10

系列文章目录

  1. chirp信号的生成与接收
  2. 对接收到的chirp信号进行滤波、分帧处理及端点检测
  3. 计算原始chirp信号与滤波后chirp信号的相关性
  4. 绘制接滤波后chirp信号的时域图和频域图
  5. 从1-4完整走一遍

滤波

将.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自带的滤波器对语音信号进行滤波,具体操作流程如下所示:

  1. matlab命令行中输入filterDesigner
    输入filterDesigner
  2. 本案例选择使用带通滤波器,下截止频率为17KHZ,上截止频率为21KHZ,通带为18KHZ~20KHZ。
    滤波参数选择图示
    点击下部的Design Filter,设计出的滤波器频域如下所示:
    滤波器频域图示
  3. 依次点击"file"->“Generate MATLAB Code”->“Filter Design Functions”,matlab将自动生成滤波器的相关函数
    在这里插入图片描述
  4. 对接收到的信号进行滤波处理,滤波前后的信号时域图及频域图如下所示:
    原始信号与滤波后信号对比图

设计好的滤波器代码如下,本案例将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内置的分帧函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值