2019年11月16日

FFTってものがありましてん・・・・まだやってんのーー

どうもモヤモヤ感があっていかんが、モヤモヤの原因は分かった。窓関数の話だ。信号波形の切り取り方によっては繰り返しのつなぎが不連続になる。その場合には高い成分にノイズが生ずる、といった書き方を見たことがある。これがモヤモヤの原因の一つであった。

不連続な部分は高成分のノイズとなって観測される・・・とか「C言語による科学技術計算」小池・CQ 1987年 には書いてある。だから窓関数を使うという話になる。
この説明は正しいとは言えまい。間違っているとも言えないが。
image

こういう信号は変化が急なところがあって高調波を生む。これはフーリエ級数でもFFTでも結果は同じだ。(FFTの場合には条件があるが。)

窓関数によってスペクトルが幅を持つ・・・というのは次のような場合。

N = 256,  1Hz の信号ではなくて1.5Hzの信号である。

image

FFTの結果 右側の成分は負の周波数相当、でスペクトルが広がってしまった。縦0付近の線分も若干だが太くなっている。左端部を拡大しよう。
image

拡大
image

横軸は整数目盛りであり1.5Hzという点はない。結果は、0,1,2,3,4,5…と成分が出てきた。1Hz, 2Hzの成分が大きい。
1.5HzだとDFTは繰り返し前提だし繰り返し部分は不連続・・・か? 谷の部分が生じて急激な変化はあるが、そういうものは全波整流の波形だってある。
ここでスペクトルが広がるのは不連続な部分が高域成分を持つからではない。
N = 256での処理は意識しないが矩形波で切り取っている。その矩形波のスペクトルと信号のスペクトルが問題なのだねー。
y( t) = x( t)×h( t)      x( t) 信号、h( t) 矩形波, y(t ) 諸つ力とすれば周波数領域では
Y(ω) = X(ω) ⦿H(ω)    ⦿畳み込み積分

まーようするに窓関数のスペクトルと信号のスペクトルの畳み込み積分なんだが、上のN = 256の時に入力信号の周波数が整数であればスペクトルは広がらないのである。窓関数の影響は出ない。
が、入力信号を整数にしろ・・・・ってのはFFTの学習レベルでの話であって実際は周波数成分がわからないからFFTを使って調べるのでありましてん。

「CAIディジタル信号処理」コロナ社 2000年頃、 「高速フーリエ変換とその応用」昭晃堂 1992  で窓関数のところを読んだら解説があった次第である。
とりあえず、上の場合には入力信号が整数であるとスペクトルは広がらない。1Hzの全波整流の場合にはフーリエ級数と同じ結果になる。窓関数の影響はない。

ところが、モヤモヤは残ったのである。それはなにか。
もともとフーリエ級数は任意の波形はsin(), cos()の合成で実現できると言う。すると上の場合の1.5Hzは成分としては0,1,2,3, Hzといった成分で記述できるのか? 
  つまり、sin(1.5Hz) = 係数sin(1Hz) + 係数sin(2Hz) + 係数sin(3Hz) …という式で表せるものなの?  どうなの?  
まてまて、フーリエ級数は無限大が出てくるぞ。実際は無限大まで計算しないけど。DFTは有限なので好き・・って話ではないけどなあ。
で、上の結果のグラフは数表としてファイルに落としているので実数部、虚数部の値を使ってsin(),cos()の合成計算してみるか。
その結果、sin(1.5Hz)に近いグラフが得られたらワタクシとしては納得しますわ。

256は多いので128でやろうかなっと。sin(1.5Hz)が近似できるはずだ!! えいえいおー。

蛇足だが気づいたので追記。上の広がったスペクトルの係数を使ってExcelで計算して戻してみた。すると1.5Hzの波形が出てきた。ただし、係数は6次まで使った。これで傾向がわかればいいんだもん。
と、やってみて、あららら、上のグラフのFFT係数を使って元の波形に戻すって、逆FFTのことじゃん。IFFTとも言う。上のプログラムはFFTしてから、IFFTして波形がもとに戻る事はとっくに確認しておるのである。
IFFTと同じことを自分で計算してみたって(Excel使ってだけど)・・・・。

上の例。1.5Hzだとスペクトルが広がる・・・・ そのFFTの結果を使ってIFFTすると元に戻る・・・うむうむ。
まーいいや。理解が進んだということにしておく。m(_ _)m

posted by toinohni at 08:46| 東京 ☀| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください