语音信号线性预测(LPC)分析

来源:互联网 发布:寂寥而莫我知也翻译 编辑:程序博客网 时间:2024/06/06 04:49

一. 语音信号数字模型

条件:

1. 忽略鼻音/摩擦音/爆破音等

2. 语音信号短时不变,帧长10-30 ms(可近似为线性时不变系统)

这里写图片描述

声道的声管模型-一系列截面积不等的无损声管级联

这里写图片描述

那么语音信号的产生过程简化为:单位脉冲序列(肺部产生的气流)激励声道模型(声管)。线性预测lpc模型的本质即探究声管模型的性质(参数)。

二.线性预测模型(计算LPC系数)

1. 模型建立:

根据上面的条件,分帧后的语音信号产生可以等效为单位脉冲序列激励声道管,该过程为线性时不变系统:

这里写图片描述

写成差分方程形式:

这里写图片描述

x(n)为真实信号,加权项为预测信号,e(n)为预测误差。根据e(n)的最小均方误差(MSE)准则来计算滤波器系数ai。

这里写图片描述

MSE期望值:

这里写图片描述

求ai为多少的情况下,E可取极小值,对ai求偏导:

这里写图片描述

结果化简为:

这里写图片描述

写成自相关形式(Yule-Walker方程):

这里写图片描述

拆写加权式子,即为Toeplize矩阵:

这里写图片描述

使用Durbin算法来求解Toeplize矩阵,即可计算出滤波器系数ai。

二.MATLAB中的lpc函数

原理说这么多,MATLAB里面,一个lpc函数就能解决所有的问题,我们来看看这个函数。

[a, g] = lpc(x, p);% [a,g] = lpc(x,p) finds the coefficients of a pth-order linear predictor (FIR filter) that predicts the current value of the real-valued time series x based on past samples.

帮助文档给出线性预测过程的差分方程为:

这里写图片描述

a = [1 a(2) … a(p+1)]

注意,这里的a(0)取值为 0,a(1)=1,使用lpc系数的时候一定要注意a(0)的取值。

三. MATLAB结果

1. 预测误差

[x,fs] = audioread('file.wav');sound(x,fs);n = 200; % n is the length of a frame.p0 = 50; % p0 is the overlap length.xx = buffer(x, n, p0);m = 8; % (m)th frame of data.y = x((m-1)*n+1:m*n); % select a frame of data.p = 12; % p is the order of the AR model.ar = lpc(y,p); % calculate the coefficients of AR model.est_x = filter([0 -ar(2:end )],1,y); % calculate the predicted signal.err = y - est_x; % calculate the residual signal.

画出某一帧预测残差信号的波形:

这里写图片描述

2. 预测信号

先小结一下信号处理的过程

  • 分帧(Framing)
  • 计算线性预测系数LPC coefficients
  • 计算预测信号
  • 合成语音信号 (Overlap Add)

这里,设定每帧信号样点数 n = 200, 相邻帧重叠长度 p0 = 150, 滤波器阶数p = 12。
这里写图片描述

图中,蓝色波形为真实语音信号,黑色波形为线性预测的结果。为什么预测信号的幅值比真实信号大?因为合成过程用到了重叠相加(Overlap Add), 相邻帧信号之间有3/4重叠部分。

1 0
原创粉丝点击