FC2ブログ

ホワイトノイズ+フーリエ変換の素敵

機械というものは、何らかの信号が入力されてはじめて動きます。そして、その入力が異なると機械は異なる動きをします。
それゆえに、機械を設計する際にはどんな入力を加えるとどんな動き(出力)をするのかを把握する必要があります。

電気信号にしろ、力学的信号にしろ、機械に入力する信号の中で最も一般的なものは振動する入力です。
制御工学的に安定である(時間とともに出力がある範囲に収まる)機械では、出力の周波数はやがて入力の周波数と同じになります。しかし、その出力の大きさは周波数によって一定にはならず、機械によって大きく動く周波数やほとんど動かない周波数が存在します。
このことは機械だけではなくあらゆる物体にもいえて、例えば、水が入ったヨーヨーの振動に合わせてうまく手で力を加えると振幅は大きくなりますが、あまり高い周波数で力を加えてもヨーヨーはほとんど動きません。

したがって、機械に望み通りの動きをさせるためには、「何ヘルツの信号を入力するとどれだけの大きさの出力となるか」を知ることが重要なわけです。

では、それをどうやって調べればいいのかというと、普通に考えれば低い周波数から高い周波数まで一つ一つ入力してその時の機械の出力を一つ一つ記録して計算すればいいはずです。

しかしこれが非常に面倒くさい。
0.5ヘルツ刻みとかで一つの周波数について複数回実験して、その平均をとって…なんてやってると、「これきりがないな」なんて途方に暮れるわけです。

実際ぼくもそういうもんだと思っていたので、面倒くさいなと思いながらシコシコ実験を繰り返していました。


もし、全ての入力周波数に対する出力が一度で計測できたら、それってめちゃくちゃいいですよね。
実はそんな夢のような方法があることをつい最近知りました。

それが、「ホワイトノイズを入力する」という方法です。
ホワイトノイズとは、同じ大きさの全ての周波数を含んだ信号のことです。

こいつを入力して、出てきた出力を記録します。
入力と出力のそれぞれをエクセルでフーリエ変換します。
(出力のフーリエ変換)/(入力のフーリエ変換)をエクセルのimdivっていう関数で計算します。
imabsっていう関数を使ってその絶対値をとります。

すると、各周波数ごとの(出力の振幅)/(入力の振幅)がわかります。


これ実際にやってみたんですけど、まじヤバいんすよ。超感動もんなんすよ。

どれぐらいすごいかというと、例えば好きな女の子の食べ物の好みを詳しく知りたかったら、無数にある食べ物を一つ一つどれぐらい好きか聞いたりしないといけないじゃないですか。いやべつに好きな女の子じゃなくてもいいんですけど。

そんなことよっぽど長い時間をかけないと普通は無理ですよね。

それが、ありとあらゆる食べ物を同じ量いっぺんに入れてごちゃ混ぜにした料理を食べてもらったら、それぞれの料理がどれぐらい好きかを一度に数値化してくれるみたいな。便利!

これぐらいすごいことなんですよ。
ホワイトノイズとフーリエ変換は!


けど考えみると、この方法機械だけだったらなんとなくいけそうな気もしますよね。人間と違って物理的特性が決まっているので。

だけど、ぼくが扱っているのは人間と機械を合わせたものの特性なんです。
つまり人間の特性を知りたいんです。

人間の物理的特性ってたくさん研究されているんですけど、まぁ完璧なのってないんです。人間は機械と違って複雑怪奇なんです。だからこの方法は試してみるまで通用しないと思っていたんですよ。

そしたら、人間にも通用したんです。
だからさっきのよくわからない食べ物の例えと同じぐらいすげえ!ってなりました。


ちなみに、ホワイトノイズは連続関数でこれをコンピュータで完璧に再現するのは不可能なので、正規乱数っていうガウス分布になる乱数を使うことでホワイトノイズを疑似的に再現できます。

このホワイトノイズを入れる方法は、スピーカーの周波数特性を計測する時等によく用いられる方法で、けっこう一般的な方法のようなので、覚えておいて損はないはずです。