#freeze [[FrontPage]] #contents 2010/03/22からのアクセス回数 &counter; ここでは、sage上でFastICAを使って独立成分分析をする方法に説明します。 このページのsageノートブックは、以下のURLで見ることができます。 http://www15191ue.sakura.ne.jp:8000/home/pub/21/ ** 必要なライブラリ [#p5f4ece3] 残念ながら、sage上にはFastICAのアルゴリズムは実装されていません。 そこで、以下のpythonライブラリをインストールします。 - MDP: pythonでFastICAを実装したライブラリ - Audiolab: pythonでオーディオファイルを扱うためのライブラリ *** MDPのインストール [#o47db201] [[MDP>http://mdp-toolkit.sourceforge.net/]]のインストール手順を説明します。 - http://sourceforge.net/projects/mdp-toolkit/files/から最新のソースをダウンロードします - ダウンロードしたファイルを適当な場所(ここでは~/local)で解凍します 解凍したディレクトリに移動して、sageのpython(~/local/sage/local/bin/python)を使って以下のコマンドを実行すると、 インストールは完了です。 #pre{{ $ cd ~/local/mdp-2.5 $ ~/local/sage/local/bin/python setup.py install }} *** audiolabのインストール [#c104b11f] audiolabは、 libsndfileを内部で使用しており、 他のライブラリも必要とするため、 以下のようにインストールしました。 - MacPortを使ってaudiolabをインストールします #pre{{ $ sudo port install py26-scikits-audiolab }} 内部でgcc version4をインストールするので、結構時間がかかります。 - audiolabの最新ソースをダウンロードを [[ここ>http://pypi.python.org/pypi/scikits.audiolab/]] からダウンロードし、~/localにて解凍します - MacPortのライブラリを使うように、site.cfgを以下のように作成します #pre{{ include_dirs = /opt/local/include library_dirs = /opt/local/lib libraries = sndfile,vorbis,vorbisenc,FLAC,ogg }} - sageのpython(~/local/sage/local/bin/python)を使ってインストールします #pre{{ $ cd ~/local/scikits.audiolab-0.10.2 $ ~/local/sage/local/bin/python setup.py install }} ** 簡単な例題を解く [#t9f7eb6c] [[A simple FastICA example>http://www.endolith.com/wordpress/2009/11/22/a-simple-fastica-example/]] の例題に沿ってsage上で独立成分分析(ICA)を試してみましょう。 例では、2つのモノラル信号を配合を少し変えて混合した音源を2個、左右の音に録音したWavファイル を入力とします。 [[2つの信号を混合した音(右クリックでファイルをダウンロードして再生してください)>http://www.pwv.co.jp/sound/mixed.wav]] *** 必要なインポート [#ja2bb28c] 必要なインポート文は、以下の通りです。 sageへの入力: #pre{{ # 必要なインポート from mdp import fastica from scikits.audiolab import wavread, wavwrite from numpy import abs, max }} *** オーディオファイルの読み込み [#vd635083] WAVファイルの読み込み関数wavreadを使ってオーディオファイルの音源を 2個の配列に取り込みます。 sageへの入力: #pre{{ # 2つの信号を混合したWavファイルを読み込む recording, fs, enc = wavread(DATA + 'mixed.wav') }} *** ICAを解く [#bdcc9bcc] fastica関数を使って2個の音源を分離します。 sageへの入力: #pre{{ # 左右2チャンネルの信号に対して、FastICAを適用する sources = fastica(recording) # 出力レベルを1にノーマライズする sources /= max(abs(sources), axis = 0) }} *** オーディオファイルへの書き込み [#h684e398] 抽出された2個の音源を左右の音に持つオーディオファイルを作成します。 sageへの入力: #pre{{ wavwrite(sources, DATA + 'source.wav', fs, enc) }} *** 結果ファイルの確認方法 [#qa37b265] 残念ながらsageで直接オーディオファイルを再生することができないため、 以下のようにファイルをダウンロードして再生してください。 sageへの入力: #pre{{ # 結果を確認する方法 html('<a href="source.wav">結果(右クリックでファイルをダウンロードして再生してください)</a>') }} [[結果(右クリックでファイルをダウンロードして再生してください)>http://www.pwv.co.jp/sound/sources.wav]] ** コメント [#g867fa73] #vote(おもしろかった[6],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha