語音信號處理——線性預測編碼LPC

語音信號處理二:乾淨語音的特徵提取:

今天的信號與系統,DSP知識點參考 Spoken Language Processing 第5, 6 章

LPC方程的Durbin算法推導:語音信號數字處理(楊行峻,遲惠生)第四章,數字語音處理(Rabiner)第九章

作業是自己實現語音信號的LPC預測算法:輸入一段語音信號,選定不同階數p,在最小二乘準則下,用自相關法估計預測係數aia_i,對比重建語音和原始語音的時域&短時頻譜差別

自相關法可以用普通的矩陣求逆,和Durbin算法做對比。

語音信號的生成模型:激勵-濾波模型:

在這裏插入圖片描述
語音信號的激勵部分:聲門激勵

  • 聲門:選擇激勵源
  • 聲帶振動:週期性信號
    • 聲帶打開:產生激勵
    • 聲帶閉合:信號爲0
    • 對應:濁音/元音
    • 聲帶有個開閉的過程
  • 聲帶鬆弛:白噪聲(與頻率無關)
    • 時域:高斯分佈
    • 短時頻譜:均勻分佈
      在這裏插入圖片描述

語音信號的濾波部分:無損聲管模型

  • 聲管:聲道各個器官的抽象模型
    在這裏插入圖片描述
    H(z)=X(z)E(z)=11k=1pakzk=1A(z)H(z)=\frac{X(z)}{E(z)}=\frac{1}{1-\sum_{k=1}^pa_kz^{-k}}=\frac{1}{A(z)}

  • 鼻腔的作用:並行的通道

    • 簡化:不考慮口鼻同時打開的情況
      在這裏插入圖片描述

聲源是由聲帶產生的,聲帶向聲道提供激勵信號,這種激勵可以是週期性的或非週期性的。當聲帶處於發聲狀態(振動)時,會產生有聲聲音(例如,元音);而當聲帶處於無聲狀態時,會產生無聲聲音(例如,輔音)。聲道可以看作是一個濾波器,它可以對來自聲帶的激勵信號頻譜進行整形以產生各種聲音。

線性預測編碼(LPC):Linear Predictive Coding

LPC編碼的基本思想:

“一個語音取樣的現在值可以用若干個語音取樣過去值的加權線性組合來逼近”,用過去p個樣本點預測當前值:
x~[n]=k=1pakx[nk]\widetilde{x}[n]=\sum_{k=1}^pa_kx[n-k]

在線性組合中的加權係數aka_k稱爲預測器係數。通過使實際語音抽樣和線性預測抽樣之間差值的平方和達到最小值,能夠決定唯一的一組預測器係數。

預測誤差:
e[n]=x[n]x~[n]=x[n]k=1pakx[nk] e[n]=x[n]-\widetilde{x}[n] = x[n] - \sum_{k=1}^pa_kx[n-k]

m個語音信號樣本片段的週期延拓:xm[n]=x[m+n]x_m[n] = x[m+n]

短時預測誤差:
Em=nem2[n]=n(xm[n]x~m[n])2=n(xm[n]j=1pajxm[nj])2E_m=\sum_ne_m^2[n] = \sum_n\left(x_m[n]-\widetilde{x}_ m[n]\right)^2=\sum_n\left(x_m[n]-\sum_{j=1}^pa_jx_m[n-j]\right)^2

線性預測編碼通過估計共振峯、剔除它們在語音信號中的作用、估計保留的蜂鳴音強度與頻率來分析語音信號。剔除共振峯的過程稱爲逆濾波,經過這個過程剩餘的信號稱爲殘餘信號(residue)。

描述峯鳴強度與頻率、共鳴峯、殘餘信號的數字可以保存、發送到其它地方。線性預測編碼通過逆向的過程合成語音信號:使用蜂鳴參數與殘餘信號生成源信號、使用共振峯生成表示聲道的濾波器,源信號經過濾波器的處理就得到語音信號。
J=E[e2(k)]=E[(s(k)p=1Paps(kp))2]J=E\left[e^{2}(k)\right]=E\left[\left(s(k)-\sum_{p=1}^{P}a_{p}s(k-p)\right)^{2}\right]

LPC特點:

  • LPC分析/AR模型

  • 把聲道抽象爲一個全極點模型:
    H(z)=X(z)E(z)=11k=1pakzk=1A(z)H(z)=\frac{X(z)}{E(z)}=\frac{1}{1-\sum_{k=1}^pa_kz^{-k}}=\frac{1}{A(z)}

  • p:級聯聲管個數,LPC分析階數

  • 時域表示:
    x[n]=k=1pakx[nk]+e[n] x[n] = \sum_{k=1}^pa_kx[n-k]+e[n]

LPC分析的正交性原理:

  • 預測誤差與當前樣本正交:
    <em,xmi>=nem[n]xm[ni]=01ip <e_m,x_m^i>=\sum_ne_m[n]x_m[n-i] =0 \quad\quad1≤i≤pnxm[ni]xm[n]=j=1pajnxm[ni]xm[nj]i=1,2,...,p\sum_nx_m[n-i]x_m[n]=\sum_{j=1}^pa_j\sum_nx_m[n-i]x_m[n-j]\quad\quad i=1,2,...,p

  • 相關係數:ϕm[i,j]=nxm[ni]xm[nj]\phi_m[i,j]=\sum_nx_m[n-i]x_m[n-j]

  • Yule-Walker Equations:j=1pajϕm[i,j]=ϕm[i,0]i=1,2,...,p\sum_{j=1}^pa_j\phi_m[i,j]=\phi_m[i,0]\quad i=1,2,...,p

  • 預測誤差:
    Em=nxm2[n]j=1pajnxm[n]xm[nj]=ϕ[0,0]j=1pajϕ[0,j]E_m=\sum_nx_m^2[n]-\sum_{j=1}^pa_j\sum_nx_m[n]x_m[n-j]=\phi[0,0]-\sum_{j=1}^pa_j\phi[0,j]

  • 預測誤差的能量歸一化:
    em[n]=Gum[n]num2[n]=1Em=nem2[n]=G2num2[n]=G2e_m[n]=Gu_m[n]\quad\quad \sum_nu_m^2[n]=1\quad\quad E_m=\sum_ne_m^2[n]=G^2\sum_nu_m^2[n]=G^2

LPC方程求解

  • Yule-Walker Equations j=1pajϕm[i,j]=ϕm[i,0]i=1,2,...,p\sum_{j=1}^pa_j\phi_m[i,j]=\phi_m[i,0]\quad\quad i=1,2,...,p
    • 本質:矩陣求逆,但是存在有效解法
  • 方差矩陣法(Spoken Language Processing , Section 6.3.2.1)
    在這裏插入圖片描述
  • 自相關法
    • 加窗 xm[n]=x[m+n]w[n]x_m[n]=x[m+n]w[n]
    • 預測誤差 Em=n=0N+p1em2[n]E_m=\sum_{n=0}^{N+p-1}e_m^2[n]
    • 自相關
      ϕm[i,j]=n=0N+p1xm[ni]xm[nj]=n=0N1(ij)xm[n]xm[n+ij]\phi_m[i,j]=\sum_{n=0}^{N+p-1}x_m[n-i]x_m[n-j]=\sum_{n=0}^{N-1-(i-j)}x_m[n]x_m[n+i-j]ϕm[i,j]=Rm[ij]\phi_m[i,j]=R_m[i-j]Rm[k]=n=0N1kxm[n]xm[n+k]R_m[k]=\sum_{n=0}^{N-1-k}x_m[n]x_m[n+k]

語音生成模型

參考線性預測編碼
語音生成模型:在這裏插入圖片描述

LPC正是基於這個模型的語音生成技術。在該模型中,語音信號是由一個激勵信號 e(k)e(k)經過一個時變的全極點濾波器產生。全極點濾波器的係數取決於所產生的特定聲音的聲道形狀。激勵信號eke_{k}要麼是濁音語音的脈衝序列,要麼是無聲聲音的隨機噪聲。生成語音信號 s(k)s(k)可以表示爲:
s(k)=p=1Paps(kp)+e(k)s(k)=\sum_{p=1}^{P}a_{p}s(k-p)+e(k)
其中, P 是濾波器的階數, apa_{p} 是濾波器的係數。LPC就是在已知 s(k)s(k) 的情況下獲取 apa_{p} .

求取 apa_{p} 最常用的一個方法就是最小化真實信號與預測信號之間的均方誤差(Mean Squared Error, MSE)。MSE函數可以表示爲
J=E[e2(k)]=E[(s(k)p=1Paps(kp))2]J=E\left[e^{2}(k)\right]=E\left[\left(s(k)-\sum_{p=1}^{P}a_{p}s(k-p)\right)^{2}\right]
然後,計算 J 關於每個濾波器係數的偏導,並令其值等於0,可得(3):
Jap=0(3)\frac{\partial J}{\partial a_{p}}=0\quad\quad\quad(3)

通過對(3)計算,可以得到(4):
u=1PauE[s(kp)s(ku)]=E[s(k)s(ku)], 1up(4)\sum_{u=1}^{P}a_{u}E\left[s(k-p)s(k-u)\right]=E\left[s(k)s(k-u)\right],~1\leq u\leq p\quad\quad\quad(4)

其中, 1pP1\leq p \leq P 。用數值 1,2,…,P 分別替換(4)中的變量 p ,我們可以得到 P 個關於濾波器係數的線性方程組,求解該線性方程組,即可得到濾波器係數的解。求解該方程組最常用高效的方法是Levinson-Durbin算法。

Matlab參考:

  1. https://wenku.baidu.com/view/25a086fc19e8b8f67c1cb938.html
  2. https://blog.csdn.net/kaixinshier/article/details/72142889

上述MSE期望也可以寫作:e(n)=x(n)x~(n)=x(n)i=1paix(ni)e(n)=x(n)-\widetilde{x}(n)=x(n)-\sum_{i=1}^pa_ix(n-i)
aia_i求偏導可得:
nx(n)x(nj)=i=1painx(ni)x(nj)\sum_nx(n)x(n-j)=\sum_{i=1}^pa_i\sum_nx(n-i)x(n-j)E=n[x(n)]2i=1painx(n)x(ni)E=\sum_n[x(n)]^2-\sum_{i=1}^pa_i\sum_nx(n)x(n-i)
寫成自相關形式(Yule-Walker方程):
R(j)=i=1paiR(ji)1jpR(j)=-\sum_{i=1}^pa_iR(j-i)\quad\quad\quad1≤j≤p

拆寫加權式子,即爲Toeplize矩陣:在這裏插入圖片描述
使用Durbin算法來求解Toeplize矩陣,即可計算出濾波器係數aia_i

Matlab中自帶lpc函數,數學推導過程看《語音信號數字處理(L.R.Rabiner)》。

Matlab程序:

[x,fs] = audioread('1.wav');   %這裏讀取的雙聲道信號 x數據,fs採樣率
sound(x,fs);    %播放音頻

x1 = x(:,1);	
% figure
% plot(t,x1)
n = 200; % n is the length of a frame.  % n行   
p0 = 50; % p0 is the overlap length.    % 在前面填充p0個0。自相關法 兩端都需要加P個零取樣值,會造成譜估計失真
xx = buffer(x1, n, p0);  % 列:L/(n-p0),列理解爲幀數

m = 8; % (m)th frame of data.
y = xx((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.就是前面的濾波器係數a_i
est_x = filter([0 -ar(2:end )],1,y); % calculate the predicted signal. 建立語音幀的正則方程
err = y - est_x; % calculate the residual signal.

figure
plot(x1)
title('原始信號');
figure
subplot(2,2,1); 
plot(y,'r');
title('原始一幀');
subplot(2,2,2); 
plot(est_x);
title('lpc預測的一幀');
subplot(2,2,3); 
plot(err,'r');
title('殘餘信號');

效果圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章