6.フーリエ変換 工学上の問題は, 周期的な性質をもつものが多い。 そこで, 実験データを三角関数の級数に当てはめて 解析することも多い。 ちょっと横道にそれて ジャン・バティスト・ジョゼフ・フーリエ男爵ってどんな人? 1768年3月21日,フランスのオセール生まれ。 [業績] 固体内における熱伝導に関する研究から 熱伝導方程式を導き、 これを解くためにフーリエ解析の手法を 提唱した。 1768/3/21 - 1830/5/16 Jean Baptiste Joseph Fourier 6.1 フーリエ変換 (1)フーリエ変換(Fourier transform)とは 時間信号を f (x) とすると,フーリエ変換 F (x) は F ( x) f ( x) exp( jt )dt で定義される。ここで, t :時間, :各速度, j :虚数単位( j 1 )である (2)離散的フーリエ変換 DFT(discrete Fourier transform) しかし, コンピュータでは,連続量,無限量を扱うことができない 時間に関して連続的な信号を g (x) し,この信号を標本化して 得られるデータを gn とする。 gn は離散的信号(discrete signal)と呼ばれる。 (2)離散的フーリエ変換 DFT(discrete Fourier transform) gn のDFTの定義 N 1 Gk g nexp 2 nk j N , (k 0,1,, N 1) n 0 ここで, N :データ数, j :虚数単位( j 1 ), Gk , gn :複素数である。 表記を簡単化するために… 次のような置き換えを行うことが多い。 WN exp 2 j N WN は,回転因子,ひねり係数(twiddle factor) などと呼ばれる。 回転因子を使って… DFTの定義は,次のように簡単化される。 N 1 Gk g nWNnk , (k 0,1,, N 1) n 0 (3)逆DFT IDFT(inverse discrete Fourier transform) IDFTの定義 1 N 1 g n Gk WNnk , (k 0,1,, N 1) N k 0 ここで, N :データ数, j :虚数単位( j 1 ), Gk , gn :複素数である。 (4)DFT,IDFTのプログラム ①領域の宣言 Public Const Max = 100 Public Type Complex 実部 As Double 虚部 As Double End Type Public X(Max) As Complex Public Y1(Max) As Complex Public Y2(Max) As Complex ‘ 領域サイズ ‘ 複素数のデータタイプ宣言 ‘ 元データ ‘ DFTの結果を格納する ‘ IDFTの結果=元データ ②必要な複素数演算の定義 (VBAに複素数演算がない) Public Function ExpJ(A) As Complex ExpJ.実部 = Cos(A) ExpJ.虚部 = Sin(A) End Function Public Function Add(A As Complex, B As Complex) As Complex Add.実部 = A.実部 + B.実部 Add.虚部 = A.虚部 + B.虚部 End Function Public Function Mult(A As Complex, B As Complex) As Complex Mult.実部 = A.実部 * B.実部 - A.虚部 * B.虚部 Mult.虚部 = A.実部 * B.虚部 + A.虚部 * B.実部 End Function Public Function SetC(R, I) As Complex SetC.実部 = R SetC.虚部 = I End Function Public Function DivR(A As Complex, R) As Complex DivR.実部 = A.実部 / R DivR.虚部 = A.虚部 / R End Function ③データ設定 ■予め波形データの 実数部をB2~B102(101個) 虚数部をC2~C102(101個) に設定しておく。 Private Sub データ設定() With Worksheets("Sheet1") For K = 0 To Max X(K).実部 = Val(.Cells(K + 2, 3)) X(K).虚部 = Val(.Cells(K + 2, 4)) Next End With End Sub ④結果設定とボタンのClickイベントハンドラ Private Sub 結果設定() With Worksheets("Sheet1") For K = 0 To Max .Cells(K + 2, 5) = Y1(K).実部 .Cells(K + 2, 6) = Y1(K).虚部 .Cells(K + 2, 7) = Y2(K).実部 .Cells(K + 2, 8) = Y2(K).虚部 Next End With End Sub Sub ボタン1_Click() データ設定 DFT IDFT 結果設定 End Sub ⑤DFT ■繰返し回数が,MAX2であることに注意 (計算量 O(N2)と表現する) Private Sub For K = 0 Y1(K) = For N = Y1(K) DFT() To Max - 1 SetC(0, 0) 0 To Max - 1 = Add(Y1(K), Mult(X(N), _ ExpJ(-6.28318530717959 * N * K / Max))) Next Next Y1(Max) = Y1(0) End Sub ⑥IDFT ■この計算量もO(N2)であることに注意。 Private Sub For K = 0 Y2(K) = For N = Y2(K) IDFT() To Max - 1 SetC(0, 0) 0 To Max - 1 = Add(Y2(K), Mult(Y1(N), _ ExpJ(6.28318530717959 * N * K / Max))) Next Next For K = 0 To Max - 1 Y2(K) = DivR(Y2(K), Max) Next Y2(Max) = Y2(0) End sub 色々な波形で確認してみよう (5)結果の確認 DFT IDFT (6)色々な波形のフーリエ変換 上段が元データ,下段がフーリエ変換結果である。 (三角波) (余弦波) (連続パルス波) (正弦波)
© Copyright 2024 ExpyDoc