これまでのページでは LPC 係数 $a[n]$ の値は既知であるとしましたが、実際には未知ですので 1 ページ目で出てきた Yule-Walker 方程式を解いて値を推定する必要があります。
ただし 1 ページ目では Yule-Walker 方程式を解く目的は
「LPC 係数 $a[n]$ が既知であるときに自己相関係数 $\rho[n]$ を求める」
ことでしたが、今回は
「未知である自己相関係数 $\rho[n]$ を標本自己相関関数に置き換えた上で LPC 係数 $a[n]$ の推定値 $\hat{a}[n]$ を求める」ことが目的になります。
なお次数 L の値も未知なので本当ならば AIC 等の方法を用いて L の値も決定する必要がありますが、今回は L は既知であるとします。
※ 次数 L は既知とする
\[ \begin{array}{rrrrrc} R[0]\cdot \hat{a}[1] & +R[1]\cdot \hat{a}[2] & +R[2]\cdot \hat{a}[3] & +\cdots & +R[\textrm{L}-1]\cdot \hat{a}[\textrm{L}] & =-R[1] \\[5pt] R[1]\cdot \hat{a}[1] & +R[0]\cdot \hat{a}[2] & +R[1]\cdot \hat{a}[3] & +\cdots & +R[\textrm{L}-2]\cdot \hat{a}[\textrm{L}] & =-R[2] \\[5pt] R[2]\cdot \hat{a}[1] & +R[1]\cdot \hat{a}[2] & +R[0]\cdot \hat{a}[3] & +\cdots & +R[\textrm{L}-3]\cdot \hat{a}[\textrm{L}] & =-R[3] \\[5pt] & & \vdots & & & \\[5pt] R[\textrm{L}-1]\cdot \hat{a}[1] & +R[\textrm{L}-2]\cdot \hat{a}[2] & +R[\textrm{L}-3]\cdot \hat{a}[3] & +\cdots & +R[0]\cdot \hat{a}[\textrm{L}] & =-R[\textrm{L}] \end{array} \]$\hat{a}[n]$ ・・・ LPC 係数 $a[n]$ の推定値
$R[n]$ ・・・ 実現値 $x[i]$ から求めた標本自己相関関数
※ 理論的には $\hat{a}[n]$ は $x[i]$ の実現値が得られた際の LPC 係数の最尤推定値になります
さてこの Yule-Walker 方程式はただの連立方程式なのでガウス消去法などのアルゴリズムを使って解くことが出来ます。
ただし Yule-Walker 方程式はテプリッツ(Toeplitz)行列という特殊な形をしているので、次に示すレビンソン・ダービン(Levinson-Durbin)・アルゴリズムを使って高速に計算することが可能です。
さらにレビンソン・ダービン・アルゴリズムは計算途中でホワイトノイズの分散の推定値とPARCOR(パーコール)係数と呼ばれる重要なパラメータも同時に計算してくれるというメリットがあります。
※ PARCOR係数は「偏自己相関係数」とも呼び、 $x[i]$ と $x[i+n]$ から $x[i+1], \cdots, x[i+n-1]$ の影響を取り除いた後の $x[i]$ と $x[i+n]$ の間の自己相関を意味します。
変数 hat_a[n] に LPC 係数の推定値 $\hat{a}[n]$ の値が入る
hat_a[1] 〜 hat_a[L] を 0 でクリアする
標本自己相関関数 R[0] 〜 R[L] を計算する
変数 E に R[0] を代入 ※ E はホワイトノイズの分散の推定値
変数 W に R[1] を代入
n = 1 から L までの for ループに入る
hat_a[1] 〜 hat_a[n] の値を tmp_a[1] 〜 tmp_a[n] にバックアップ
変数 P[n] (PARCOR 係数)に W/E を代入
hat_a[n] に -P[n] を代入
i = 1 から n-1 までの for ループに入る
hat_a[i] = tmp_a[i] - P[n] * tmp_a[n-i] と更新
i のループを抜ける
E = E * ( 1 - P[n]*P[n] ) と更新
n+1 <= L なら W = R[n+1] + $\sum_{i=1}^{n}$ { hat_a[i] * R[n+1-i] } と更新
n のループを抜ける