Rubyでフーリエ変換 Numo::FFTE を試してみる

FFTEとは筑波大学の高橋大介さんが作っているフーリエ変換のライブラリとのこと。このFFTEが同じく筑波大学の田中さんが作ってるNumo::NArrayに搭載されているので、試してみたくなった。とはいえ、そもそもフーリエ変換とは何だろう?複素…きょっ、虚数ってなんだ?といった状況なので、大人しくこちらの分かりやすいNumpyの記事を読んで写経・読経して同じような挙動を目指していきます。

現時点での基礎知識

y = sin(x), sin(2x), sin(3x)… y = cos(x), cos(2x), cos(3x)… を適当に重みをかけて足し合わせると、どんな y = f(x) でも表現できるらしい。すごい。

とまあ、そんな数学的事実はどうでもよかろう。フーリエとはいかなる人物なのか。

Wikipediaからジョゼフ・フーリエさんの魅力的なフレーズを抜粋してみた。ジョゼフ・フーリエさんしゅごい。

Fourier
ジョゼフ・フーリエ。フランス中部、ヨンヌ県のオセールで仕立屋の9番目の息子として生まれた。エジプト滞在中に、フーリエには妙な癖がついた。フランスの寒さと湿気を嫌い、健康と思索のためには砂漠のような熱気と乾燥が必要だと考えるようになったのである。彼は四六時中部屋を締め切って蒸し暑い状態にし、全身に真綿と包帯をミイラのようにぐるぐるに巻いて暮らすようになった。この習慣が心臓に負担をかけ、皮肉なことに逆に彼の死期を早めることになったという。また、エジプトから持ち帰った史料の中にあったロゼッタ・ストーンを、自身のサロンに出入りしていた当時12歳のシャンポリオンに初めて見せたのもフーリエだった。刻まれている三種の文字のうちの一つ(ヒエログリフ)が未解読であることを告げられたシャンポリオンは、「自分がいつか読んでみせる」と宣言し、約20年の歳月をかけて解読に成功することになる。

 ライプツィヒの戦いで敗れたナポレオンは、1814年に退位してエルバ島へ流された。しかしフーリエはラプラスらとともに寝返ってルイ18世に忠誠を誓ったため、知事を続けることを認められた。ところが翌1815年3月1日、エルバ島を脱出したナポレオンはフランスに帰還し、パリへ向かって進軍を始めた。捕らえられたフーリエは再びナポレオンに従ってローヌ県知事に任命される。ワーテルローの戦いののちナポレオンはセントヘレナ島へ流され、フランスはみたび王政に戻った。復位したルイ18世は裏切りを許さず、フーリエは罷免された。フーリエはパリで財産を売りながら糊口をしのいでいた。1816年、アカデミー・デ・シアンスはフーリエを会員に推薦したが、ルイ18世はそれを認めなかった。しかしアカデミーは抵抗し、翌年彼は会員に選出された。さらにその後もルイ18世やポアソンの反対にもかかわらず勢力を伸ばして1822年には終身幹事に、1826年にはアカデミー・フランセーズ会員となった。フーリエの晩年はナポレオンに最後まで従ったため悲惨な末路を辿ったモンジュなどと比べれば、名誉に満ちたものであったといえる。権力欲も旺盛だった。

す…凄いけど、なんか立ち回りが上手すぎるちょっと嫌な奴やん。。

Python/Numpyの場合 その1

引用元:Python NumPy SciPy サンプルコード: フーリエ変換処理 その 2

[[ 36.+0.j ]
[ -4.+9.65685425j]
[ -4.+4.j ]
[ -4.+1.65685425j]
[ -4.+0.j ]
[ -4.-1.65685425j]
[ -4.-4.j ]
[ -4.-9.65685425j]]

Ruby/Numo::NArrayの場合 その1

Numo::DComplex(view)#shape=[8,1]
[[36+0i],
[-4+9.65685i],
[-4+4i],
[-4+1.65685i],
[-4+0i],
[-4-1.65685i],
[-4-4i],
[-4-9.65685i]]

NArrayでもフーリエ変換ができました。(DComplexにしないとうまく動かないようです。-1が何なのかわからないが気にもしない。)
ところでこれの数列は一体何を意味しているのだろう。わからん。

Python/Numpyの場合 その2

引用元:Python NumPy SciPy サンプルコード: フーリエ変換処理 その 3

figure_1

Ruby/Numo::NArrayの場合 その2

figure_2

何やら同じような感じで動いてくれているようです。型変換がすこしRuby/NArrayの方が手間かも。モジュールの名前がFFTではなくFFTEなのはためらいだろうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です