︠b4f2dc56-bf6d-4a73-8d32-fb8b5a6e9448i︠
%html
ここでは、sage上でFastICAを使って独立成分分析をする方法に説明します。
残念ながら、sage上にはFastICAのアルゴリズムは実装されていません。 そこで、以下のpythonライブラリをインストールします。
MDPのインストール手順を説明します。
$ cd ~/local/mdp-2.5 $ ~/local/sage/local/bin/python setup.py install
audiolabは、 libsndfileを内部で使用しており、 他のライブラリも必要とするため、 以下のようにインストールしました。
$ sudo port install py26-scikits-audiolab内部でgcc version4をインストールするので、結構時間がかかります。
include_dirs = /opt/local/include library_dirs = /opt/local/lib libraries = sndfile,vorbis,vorbisenc,FLAC,ogg
$ cd ~/local/scikits.audiolab-0.10.2 $ ~/local/sage/local/bin/python setup.py install
A simple FastICA example の例題に沿ってsage上で独立成分分析(ICA)を試してみましょう。
例では、2つのモノラル信号を配合を少し変えて混合した音源を2個、左右の音に録音したWavファイル を入力とします。
2つの信号を混合した音(右クリックでファイルをダウンロードして再生してください)
必要なインポート文は、以下の通りです。
︡037c000a-3b94-4818-af95-e2a9e2d65484︡{"html": "\r\n\t\r\n\t\u3053\u3053\u3067\u306f\u3001sage\u4e0a\u3067FastICA\u3092\u4f7f\u3063\u3066\u72ec\u7acb\u6210\u5206\u5206\u6790\u3092\u3059\u308b\u65b9\u6cd5\u306b\u8aac\u660e\u3057\u307e\u3059\u3002\r\n\t
\r\n\t\r\n\r\n\r\n\r\n\t\r\n\t\t\u6b8b\u5ff5\u306a\u304c\u3089\u3001sage\u4e0a\u306b\u306fFastICA\u306e\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306f\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\r\n\t\t\u305d\u3053\u3067\u3001\u4ee5\u4e0b\u306epython\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\r\n\t\t
\r\n\t\tMDP\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\u3092\u8aac\u660e\u3057\u307e\u3059\u3002\t\t\r\n\t\t
\r\n\uff04 cd ~/local/mdp-2.5\r\n\uff04 ~/local/sage/local/bin/python setup.py install\r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\t
\r\n\t\taudiolab\u306f\u3001 libsndfile\u3092\u5185\u90e8\u3067\u4f7f\u7528\u3057\u3066\u304a\u308a\u3001 \u4ed6\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3082\u5fc5\u8981\u3068\u3059\u308b\u305f\u3081\u3001\r\n\t\t\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3057\u305f\u3002\r\n\t\t
\r\n\uff04 sudo port install py26-scikits-audiolab\r\n\t\r\n\t\t\t\u5185\u90e8\u3067gcc version4\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306e\u3067\u3001\u7d50\u69cb\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3059\u3002\r\n\t\t\t\r\n\t\t\t
\r\ninclude_dirs = /opt/local/include\r\nlibrary_dirs = /opt/local/lib\r\nlibraries = sndfile,vorbis,vorbisenc,FLAC,ogg\r\n\r\n\t\t\t
\r\n\uff04 cd ~/local/scikits.audiolab-0.10.2\r\n\uff04 ~/local/sage/local/bin/python setup.py install\r\n\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\t
\r\n\t\tA simple FastICA example\r\n\t\t\u306e\u4f8b\u984c\u306b\u6cbf\u3063\u3066sage\u4e0a\u3067\u72ec\u7acb\u6210\u5206\u5206\u6790\uff08ICA\uff09\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\r\n\t
\r\n\t\r\n\t\t\u4f8b\u3067\u306f\u30012\u3064\u306e\u30e2\u30ce\u30e9\u30eb\u4fe1\u53f7\u3092\u914d\u5408\u3092\u5c11\u3057\u5909\u3048\u3066\u6df7\u5408\u3057\u305f\u97f3\u6e90\u30922\u500b\u3001\u5de6\u53f3\u306e\u97f3\u306b\u9332\u97f3\u3057\u305fWav\u30d5\u30a1\u30a4\u30eb\r\n\t\t\u3092\u5165\u529b\u3068\u3057\u307e\u3059\u3002\r\n\t
\r\n\t\r\n\r\n\r\n\r\n\t\r\n\t\t\u5fc5\u8981\u306a\u30a4\u30f3\u30dd\u30fc\u30c8\u6587\u306f\u3001\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002\r\n\t
\r\n"}︡ ︠b52e76ae-5bfb-448d-a882-8bbbefa4f348︠ # 必要なインポート from mdp import fastica from scikits.audiolab import wavread, wavwrite from numpy import abs, max ︡8193eaa6-21b1-4a75-86ce-d5708393d59a︡︡ ︠bf97b7be-7203-4b48-8de5-239b67c69284i︠ %htmlWAVファイルの読み込み関数wavreadを使ってオーディオファイルの音源を 2個の配列に取り込みます。
︡a6b5d84f-9075-4692-8747-e42c061ceff2︡{"html": "\r\n\t\r\n\t\tWAV\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u95a2\u6570wavread\u3092\u4f7f\u3063\u3066\u30aa\u30fc\u30c7\u30a3\u30aa\u30d5\u30a1\u30a4\u30eb\u306e\u97f3\u6e90\u3092\r\n\t\t2\u500b\u306e\u914d\u5217\u306b\u53d6\u308a\u8fbc\u307f\u307e\u3059\u3002\t\t\r\n\t
\t\r\n"}︡ ︠f30c00b3-61a0-49dc-bb47-b1fd0e896af1︠ # 2つの信号を混合したWavファイルを読み込む recording, fs, enc = wavread(DATA + 'mixed.wav') ︡9d3c617f-70c7-4ac2-bcd6-8a42b0cbd348︡︡ ︠914561d4-08ef-4b69-adc7-d6ff6081a397i︠ %htmlfastica関数を使って2個の音源を分離します。
︡fd03739a-1b27-41d9-832c-eacf583057f3︡{"html": "\r\n\t\r\n\t\tfastica\u95a2\u6570\u3092\u4f7f\u3063\u30662\u500b\u306e\u97f3\u6e90\u3092\u5206\u96e2\u3057\u307e\u3059\u3002\r\n\t
\r\n"}︡ ︠b57d6793-a566-4d85-b498-b3b404e32fbd︠ # 左右2チャンネルの信号に対して、FastICAを適用する sources = fastica(recording) # 出力レベルを1にノーマライズする sources /= max(abs(sources), axis = 0) ︡cca782af-f41e-4158-8f06-b6ed4fe339ae︡︡ ︠66ec5327-804e-47fd-b11f-9594022b4efci︠ %html抽出された2個の音源を左右の音に持つオーディオファイルを作成します。
︡7abdb420-b19c-4d72-bb8c-246240a728fc︡{"html": "\r\n\t\r\n\t\t\u62bd\u51fa\u3055\u308c\u305f2\u500b\u306e\u97f3\u6e90\u3092\u5de6\u53f3\u306e\u97f3\u306b\u6301\u3064\u30aa\u30fc\u30c7\u30a3\u30aa\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\r\n\t
\r\n"}︡ ︠bf55e641-eafb-4ac4-a2ba-b509e0a68dfb︠ wavwrite(sources, DATA + 'source.wav', fs, enc) ︡e3cb3e3c-9fdd-40bf-807b-ce30c48836f5︡︡ ︠4a87fea8-3120-4e09-a640-eee3dd97dad1i︠ %html残念ながらsageで直接オーディオファイルを再生することができないため、 以下のようにファイルをダウンロードして再生してください。
︡0e180c2e-b5c0-4295-8b8d-f6a1386d8f41︡{"html": "\r\n\t\r\n\t\t\u6b8b\u5ff5\u306a\u304c\u3089sage\u3067\u76f4\u63a5\u30aa\u30fc\u30c7\u30a3\u30aa\u30d5\u30a1\u30a4\u30eb\u3092\u518d\u751f\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u305f\u3081\u3001\r\n\t\t\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u518d\u751f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n\t
\r\n"}︡ ︠69ae47d9-6fef-4390-91d2-79515eb7a6e8︠ # 結果を確認する方法 html('結果(右クリックでファイルをダウンロードして再生してください)') ︡b43deb24-904f-450a-b180-e001ac9eaace︡{"html": "\u7d50\u679c\uff08\u53f3\u30af\u30ea\u30c3\u30af\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u518d\u751f\u3057\u3066\u304f\u3060\u3055\u3044\uff09"}︡