欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 10:23:16
...

一. 语音信号数字模型

条件:

1. 忽略鼻音/摩擦音/**音等

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

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

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

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

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

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

1. 模型建立:

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

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

写成差分方程形式:

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

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

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

MSE期望值:

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

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

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

结果化简为:

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

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

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

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

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

使用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.

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

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

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.

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

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

2. 预测信号

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

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

这里,设定每帧信号样点数 n = 200, 相邻帧重叠长度 p0 = 150, 滤波器阶数p = 12。
语音信号线性预测(LPC)分析

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

相关标签: 预测 语音合成