Scilabで離散ウェーブレット変換
最近ウェーブレット変換を勉強していますが、
雰囲気が掴みきれていないので実際にやってみることにした。
前回書いたライブラリ実装は理解や実装に時間がかかりそうなので、
別の方法としてScilabのWavelet Toolboxを使ったら結構楽にできました。
今回使用したOSはWindows 7 64BitですがMacやUnixでも動く模様。
Scilabとは
Scilabは、 INRIA (フランス国立 コンピュータ科学・制御研究所)と ENPC で 開発された高機能な科学技術ソフトウエアです。 2003年にScilab の開発は Scilab コンソーシアムに移管され、 現在は更にDigiteoに統合されて、 その1部門として Scilab コンソーシアムの活動を行っています。 2008年以降、Scilabは、GPL互換の FLOSS ライセンスに基づく オープンソースソフトウエアとして配布が行われています。
環境構築
Scilabのインストール
"http://www.scilab.org"から、
インストーラ(2014/01/16 時点 Ver5.4.1)をダウンロード。
ダウンロードしたインストーラをインストール。
データ処理
データの読込
振幅10, 2Hzの正弦波と、
振幅1 , 100Hzの正弦波を足し合わせた信号を作成。
Fs=1024; t=soundsec(1,Fs); wave=10*(sin(2*%pi*t*2))+(sin(2*%pi*t*100));
離散ウェーブレット変換の実行
[C,L]=wavedec(wave,2,"haar");
・戻り値
C:ウェーブレット係数列
L:分割レベル毎のウェーブレット係数のデータ数
・引数
第1引数:離散ウェーブレット変換をしたい信号。
第2引数:レベル(分解数)
第3引数:マザーウェーブレット
"haar": ハールウェーブレット
"db1":ドベシ―ウェーブレット(N=1)
"db2":ドベシ―ウェーブレット(N=2)
haar( "haar"), daubechies ("db1" to "db20"), coiflets ("coif1" to "coif5"), symlets ("sym2" to "sym20"), legendre ("leg1" to "leg9"), bathlets("bath4.0" to "bath4.15" and "bath6.0" to "bath6.15"), dmey ("dmey"), beyklin ("beylkin"), vaidyanathan ("vaidyanathan"), biorthogonal B-spline wavelets ("bior1.1" to "bior6.8"), "rbior1.1" to "rbior6.8"
引用元:help wavedec
結果出力
パラメータの取得
ウェーブレット変換を行うと、
信号はApproximation(低周波成分)と、Detail(高周波成分)に分かれるので、
ウェーブレット係数列Cからそれぞれのパラメータを取得する。
・Approximation
変換時に指定したレベルのApproximationを取得。
Ap2 = appcoef(C,L,"haar",2);
第1引数:ウェーブレット係数列
第2引数:分割レベル毎のウェーブレット係数のデータ数
第3引数:マザーウェーブレット
第4引数:レベル(分解数)
・Detail
分割数が2以上のときは、
レベル毎にDetailを取得。
De1 = detcoef(C,L,1);
De2 = detcoef(C,L,2);
第1引数:ウェーブレット係数列
第2引数:分割レベル毎のウェーブレット係数のデータ数
第3引数:レベル(分解数)
パラメータのプロット
上から順に
元信号
Approximation(低周波成分 level2)
Detail(高周波成分 level1)
Detail(高周波成分 level2)
を並べてグラフ描画
subplot(411)
plot(wave)
plot(Ap2)
subplot(411)
plot(wave)
subplot(412)
plot(Ap2)
subplot(413)
plot(De1)
subplot(414)
plot(De2)
元信号が離散ウェーブレット変換により分解され、
高周波(200Hz)と低周波(2Hz)に信号が分かれているはず。
参考
MATLAB-Wavelet Toolbox-
http://www.mathworks.com/tagteam/58032_TT031_Wavelet_Tlbx_Manual.pdf