読者です 読者をやめる 読者になる 読者になる

Rでウェーブレット変換をしたい!

結論から言うとまだできていませんよ。
期待して読まない方がいいですよ。

契機

諸般の事情で、Rでウェーブレット変換をすることになりました。
「信号処理」が研究グループの名前に冠されており、研究室のボスは信号処理の大御所らしいのですが、早々と信号処理からはドロップアウトして現在信号処理とは関係ないことをしているというゆとりっぷり全開な状況ですので、現在のスキルは以下のようになります。

  • ウェーブレット変換は名前を知っている。
  • フーリエ変換は一通りやったが、既に忘却の彼方
  • 最近Rをちょいちょい勉強しているのでRレベル3くらい(自称)

このスキルである問題点は、ドキュメントを読んでもウェーブレット用語が理解できない可能性が高いということですね。
この関数は○○を××します、と言われても処理の対象である○○の意味が分からず、従って処理内容である××が何を行っているのか分からない、という2重苦に陥りそうで怖い。

それはともかく、ざっと調べたところあまり良さそうな入門記事が見当たらない。
唯一日本語でまともにRでウェーブレット変換について触れていたのはここ。理工系学生の遊歩道 R でウェーブレット解析4
Rwaveが主に紹介されていたみたいので、色々調べてみたところ、こいつは連続ウェーブレット変換用のパッケージらしい。
今欲しいのは離散ウェーブレット変換用のパッケージなんだぜ、ということで、waveletsとかいうパッケージを見つけた。

wavelets

離散ウェーブレット変換を扱っているっぽいパッケージ

Desciption

このパッケージは離散ウェーブレット変換(discrete wavelet transforms:DWT)と最大重複ウェーブレット変換?(aimal overlap discrete wavelet transforms:MODWT)及び、それらの逆変換を計算し、プロットするための関数郡を含んでいる。
さらに、多重解像度分析と同様に、上述の分解において使用されるウェーブレット変換のフィルターを計算しプロットするための機能を含んでいる。

これだ!
というわけで関数とかを調べていく。

方針

DescriptとUsageをざっと見ていって、それっぽいのを探す。

align:ウェーブレット変換係数を揃える

Description

wt.filter.shiftによって計算され位相シフト値(phase shift values)を用いてクラスdwt,modwt,dwptそして,modwptのウェーブレット(ハイパス)とスケーリング(ローパス)係数の両方を揃える。

phase shift valuesが何かよく分からない上に何か二つ係数があるのかー。
とにかく2つの係数を揃えるらしい。
それがどういう意味があるのかはよく分からない。

Usage

align(wt, coe=FALSE, inverse=FALSE)

Arguments
  • wt
    • クラスdwt,modwt,dwpt,modwptのオブジェクト
  • coe
    • 位相シフトの計算において中央エネルギー法?(center of energy method)を使用するかどうかの理論値
  • inverse
    • もとの場所へ揃えられたオブジェクトのウェーブレットとスケーリング係数をシフトするかどうかの理論値

dwt:離散ウェーブレット変換オブジェクト

Description

離散ウェーブレット変換の情報を含んでいるS4オブジェクト

未だにS4オブジェクトがよく分かっていない><
ああ、これはオブジェクトの話だな。

こっちが関数の方ですね。

dwt:離散ウェーブレット変換

Description

一変量あるいは多変量の時系列データの離散ウェーブレット変換係数を計算する。

Usage

dwt(X, filter="la8", n.levels, boundary="periodic", fact=TRUE)

Arguments
    • X
      • 一変量あるいは多変量時系列データ。数値のベクトル、マトリクス、データフレームが受け付けられる。
    • filter
      • wt.filterオブジェクト、分解においてどのウェーブレットフィルターを用いるかという文字列、あるいは、ウェーブレット係数(スケーリング係数ではない)数値のベクトル。受け付けられるフィルター名のためにhelp(wt.filter)を参照のこと。
    • n.levels
      • 分解レベルを特定する整数値。デフォルトでは、これはXの長さが少なくとも、レベルJのウェーブレットフィルターの長さが同じ大きさとなる最小のJであるが、レベルJ+1のウェーブレットフィルターの長さよりは小さい。このようにして、J \le log \( \frac{N-1}{L-1} + 1 \)となる。ここで、NXの長さである。
    • boundary
      • どの境界メソッド?(boundary method)を用いるかを示す文字列である。boundary="periodic"とboundary="reflection"がサポートされているだけである。
    • fast
      • 論理フラグであり、もしtrueなら、ピラミッドアルゴリズムが内部C関数?(internal C function)とともに計算される。そうでなければ、Rのコードのみが全ての計算において用いられる。

internal C functionはC言語の関数ってことかな。

だらだらとドキュメントを訳してみたけど、うーん、これでやりたいことはできるっぽいなぁ。
少なくとも簡単なウェーブレット変換はこれでOKなのかも。
明日試してみよう。