[[FrontPage]]

#contents

2010/03/22からのアクセス回数 &counter;

* FastICAを使って独立成分分析をする [#o1e40607]

ここでは、sage上でFastICAを使って独立成分分析をする方法に説明します。

このページのsageノートブックは、以下のURLで見ることができます。

http://www.sagenb.org/home/pub/1814

** 必要なライブラリ [#ye7fd2c1]

残念ながら、sage上にはFastICAのアルゴリズムは実装されていません。
そこで、以下のpythonライブラリをインストールします。

- MDP: pythonでFastICAを実装したライブラリ

- Audiolab: pythonでオーディオファイルを扱うためのライブラリ


*** MDPのインストール [#y436d924]

[[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のインストール [#fee7b057]

audiolabは、 libsndfileを内部で使用しており、 他のライブラリも必要とするため、
以下のようにインストールしました。

- MacPortを使ってaudiolabをインストールします
#pre{{
$ sudo port install py26-scikits-audiolab
}}	
内部でgcc version4をインストールするので、結構時間がかかります。


- audiolabの最新ソースをダウンロードを
<a href="http://pypi.python.org/pypi/scikits.audiolab/">ここ</a>
からダウンロードし、~/localにて解凍します
</li>

- 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
}}		


** 簡単な例題を解く [#c66e2c6b]

[[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]]


*** 必要なインポート [#abed9662]

必要なインポート文は、以下の通りです。

sageへの入力:
#pre{{
# 必要なインポート
from mdp import fastica
from scikits.audiolab import wavread, wavwrite
from numpy import abs, max
}}

*** オーディオファイルの読み込み [#e0bccc0e]

WAVファイルの読み込み関数wavreadを使ってオーディオファイルの音源を
2個の配列に取り込みます。		

sageへの入力:
#pre{{
# 2つの信号を混合したWavファイルを読み込む
recording, fs, enc = wavread(DATA + 'mixed.wav')
}}


*** ICAを解く [#qf795589]

fastica関数を使って2個の音源を分離します。

sageへの入力:
#pre{{
# 左右2チャンネルの信号に対して、FastICAを適用する
sources = fastica(recording)
# 出力レベルを1にノーマライズする
sources /= max(abs(sources), axis = 0)
}}


*** オーディオファイルへの書き込み [#w8a63616]

抽出された2個の音源を左右の音に持つオーディオファイルを作成します。

sageへの入力:
#pre{{
wavwrite(sources, DATA + 'source.wav', fs, enc)
}}


*** 結果ファイルの確認方法 [#xd175c34]

残念ながらsageで直接オーディオファイルを再生することができないため、
以下のようにファイルをダウンロードして再生してください。



sageへの入力:
#pre{{
# 結果を確認する方法
html('<a href="source.wav">結果(右クリックでファイルをダウンロードして再生してください)</a>')
}}
[[結果(右クリックでファイルをダウンロードして再生してください)>http://www.pwv.co.jp/sound/sources.wav]]

** コメント [#b1a24d5d]
#vote(おもしろかった,そうでもない,わかりずらい)

皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc