補間法 - ビジネス

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( jt )dt

で定義される。ここで, t :時間, :各速度,
j :虚数単位( j  1 )である
(2)離散的フーリエ変換
DFT(discrete Fourier transform)
しかし,
コンピュータでは,連続量,無限量を扱うことができない
時間に関して連続的な信号を g (x) し,この信号を標本化して
得られるデータを gn とする。
gn は離散的信号(discrete signal)と呼ばれる。
(2)離散的フーリエ変換
DFT(discrete Fourier transform)
gn のDFTの定義
N 1
Gk    g nexp 2 nk j N , (k  0,1,, N  1)
n 0
ここで, N :データ数, j :虚数単位( j  1 ),
Gk , gn :複素数である。
表記を簡単化するために…
次のような置き換えを行うことが多い。
WN  exp 2 j N 
WN は,回転因子,ひねり係数(twiddle factor)
などと呼ばれる。
回転因子を使って…
DFTの定義は,次のように簡単化される。
N 1
Gk    g nWNnk , (k  0,1,, N  1)
n 0
(3)逆DFT
IDFT(inverse discrete Fourier transform)
IDFTの定義
1 N 1
g n   Gk WNnk , (k  0,1,, N  1)
N k 0
ここで, N :データ数, j :虚数単位( j  1 ),
Gk , gn :複素数である。
(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)色々な波形のフーリエ変換
上段が元データ,下段がフーリエ変換結果である。
(三角波)
(余弦波)
(連続パルス波)
(正弦波)