式がすっきりするから。次に、誤差関数を偏微分して0とおく。これを整理すると下のk個の連立方程式が得られる。最終的に連立方程式を行列で表すとこれは、次の形に変形できる。この式は、ユール・ウォーカー(Yule-Walker)方程式と呼ばれる。この中の行列は、テプリッツ行列と呼ばれる形式になっていて、テプリッツ行列の特性を使うと、レビンソン・ダービン再帰法というアルゴリズムで高速に解けるとのこと。LPC係数と呼ばれる。kはLPC次数と呼ばれる。先に書いたようにkが大きいほど過去までさかのぼった信号値を用いて予測を行う。Recursion)というアルゴリズム*1を使ってみました。実際は、ユール・ウォーカー方程式をさらに変形してとする。この変形が資料を見てもちょっとわからなかった。ユール・ウォーカー方程式にさらに下の式(残差分散の定義)が追加された連立方程式になっているが、条件を追加してもよいのはなぜ?詳しい人がいたら教えてください。レビンソン・ダービン再帰法は上の式を再帰的に解くアルゴリズムになっている。場合を解くことを意味する。次に、kの場合からk+1の場合を求める再帰的な手順だが、導出は先の資料にまかせて最終的に次の3つのステップを実行するだけでOK。新しくλという変数を導入するのがミソ。このλは、実は重要なパラメータであってPARCOR係数を求めるときにも使える。残差分散を次式で更新する実装では、上の結果をもとにレビンソン・ダービン再帰法をさっそくPythonで実装してみた。show()メイン関数では、オリジナルの曲線と線形予測法で予測した曲線をプロットしている。16と変えてプロットした結果はこちら。LPC次数が大きくなると元の曲線をよく予測できていることがわかる。大きければ大きいほど予測精度は上がるのかな?過学習みたいな概念はないのだろうか。次に、LPC係数をもとにLPCスペクトル包絡を求めてみる。実は、先の資料には、LPC係数からLPCスペクトル包絡を求める方法が書いておらずいろいろ調べ回る必要が出てきた。同じような人がたくさんいるらしく調べていると、「LPC係数からLPCスペクトル包絡をどう求めるのか?」という質問がけっこうたくさんあった。LPC係数をフィルタ係数とみなして周波数応答を求めるというのが正解のようだ。Pythonの場合、scipy.signal.freqz()という関数で求められる。1も入れておく必要がある。このせいでかなりハマった。32と変えてLPCスペクトル包絡を描画してみた。LPC次数が大きいほどスペクトル包絡がより細かくなるようだ。最後に、ケプストラム分析で求まるスペクトル包絡とLPC分析で求まるスペクトル包絡を比較してみよう。以下のケプストラム分析のコードを追加。詳細は、ケプストラム分析(2012/2/11)を参照。linewidth=2)結果は、となった。緑色がケプストラム分析で求めたスペクトル包絡、赤い色がLPC分析で求めたスペクトル包絡。LPC分析の方がスペクトル包絡のピークが鮮明に出ているのがわかる。(8)(2013/2/16)の続き。(7)(2013/1/19)の続き。(6)(2012/8/5)の続き。今回は、SPTK(2012/7/1...2012-10-14類似楽曲検索システムを作ろうもう1年以上かけて音声信号処理の勉強をしてきました(Pythonで...2012-02-25メル周波数ケプストラム係数(MFCC)Pythonで音声信号処理(2011/05/14)の第19回目。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。