フーリエ変換 メモ2 -フーリエ変換の変数の意味と使用例-
【3】フーリエ変換の変数
どの言語でも対応できるようにしたいので実際のコードではなく、あくまで具体的な利用法を文章で記述していきます
まず現実の音データを受け取ったものを f(x) とします
前回のフーリエ変換の定義式の f(x) に対応しています
さて、前回ディリクレの条件を満たすあらゆる関数はsin波とcos波の足し合わせで出来ていることを説明しました
これは受け取る音データに関しても言えることです。ちなみにある関数をsin波とcos波の足し合わせで表現できる形に直すことをフーリエ変換といいます。
これから受け取ったデータをフーリエ変換しよう、つまり「sin波とcos波で表現しよう」というのですから、そのデータはディリクレの条件を満たしていると仮定して進めていくことになります
というか基本的に無視しても問題ないと思います
前回の定義式は
でした
音に関しては f (x)のxは時間経過で増えていくサンプルの数になります
例えばサンプリングレートが44100Hz(1秒間に44100回サンプルを取る)で一秒間録音した場合
一番最初のサンプルの値はf(0 ) 、一番最後のものはf (44099)に入っています
ここで定義式の中の変数の具体的な意味を見ていきましょう
まずは2πですこれは言わずもがな、360度であり、円です
次にN、これは周期です
周期で2πを割るということは1周期で丁度1回転しますね
Σで変化させている x は2π/Nを0から2πギリギリまで変化させています
周期の単位は「秒」ですからxは時間による変化を示す変数と言えます
では t は何を示す変数なのでしょうか
t = 1のときのcos と sin の中身について考えて見ましょう
t = 1のときのcos と sin の中身は共に 2πx/N
先ほども説明したとおり x は 2π/Nを0から2πギリギリまで変化させます
要するに t = 1のときは丁度周期Nで一周する周波数のフーリエ変換と言えます
この波形を示すとこうなります
では次にtを2にした波形を示します
横軸の長さは変わらす繰り返しの回数が増えましたね?
ではt=3のときは?もう画像を貼らなくても分かりますね?繰り返しの回数は3回になります
そう、t は周波数を制御する変数といえます
こと音に関して言えばフーリエ変換とは
時間の関数を周波数の関数に写像する変換
ということができます
では周波数 t はどこからどこまでの範囲にすればいいの?
という話になりますね
私の経験則で申し訳ないのですが音データのサンプル数/2まで移動させれば大丈夫です
もし不十分な場合は音データのサンプル数と同じHz(サンプル数が10000なら10000Hz)まで移動させれば確実です
以上までがフーリエ変換の詳しい話です
【4】フーリエ変換の具体的な使用法
いよいよもって具体的な利用法です
といっても[3]で殆ど説明してしまったのでまとめるだけになります
虚数を格納する変数 image と実数を格納する変数 real を用意します
変数 k を1ずつ増やして、音データ数の半分になるまでループ
{
real (k) = 0で初期化
image (k) = 0で初期化
変数 t を 周期-1 まで1ずつ増やしてループする
{
real ( k ) = real ( k ) + real ( t ) * cos(2πtx / N)
imag( k ) = imag( k ) + image( t ) * sin(2πtx / N)
}
}
こんな形になります
ね?簡単でしょ?
#初稿2015年4月1日