XLPack 7.0
XLPack 数値計算ライブラリ (Excel VBA) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Rfft2c()

Sub Rfft2c ( L As  Long,
M As  Long,
R() As  Double,
C() As  Complex,
Info As  Long 
)

Rfft2fによるフーリエ変換の2次元複素データ

目的
本ルーチンは, Rfft2fにより求められた圧縮形式の2次元フーリエ変換を2次元複素データに展開する. 圧縮形式についてはRfft2fの説明を参照せよ.
引数
[in]L入力データ行列の行数. (L >= 1)
[in]M入力データ行列の列数. (M >= 1)
[in]R()配列 R(LR1 - 1, LR2 - 1) (LR1 >= L, LR2 >= M)
Rfft2fによりフーリエ変換された圧縮形式の2次元フーリエ変換データ.
[in]C()配列 C(LC1 - 1, LC2 - 1) (LC1 >= L, LC2 >= M)
R()の圧縮された2次元フーリエ変換データを展開した2次元複素データ.
[out]Info= 0: 正常終了.
= -1: パラメータ L の誤り. (L < 1)
= -2: パラメータ M の誤り. (M < 1)
= -3: パラメータ R() の誤り. (配列R()の大きさが不足)
= -5: パラメータ C() の誤り. (配列C()の大きさが不足)
使用例
4行4列の2次元ランダムデータのフーリエ変換をRfft2fにより求め, 結果の圧縮形式データをRfft2cにより2次元複素データに展開する. そのフーリエ逆変換をCfft2bにより求め元のデータと比較する.
Sub Ex_Rfft2c()
Const L = 4, M = 4
Dim Wsave() As Double, R(L - 1, M - 1) As Double, R0(L - 1, M - 1) As Double
Dim C(L - 1, M - 1) As Complex
Dim LWsave As Long, Info As Long, I As Long, J As Long
'-- Initialization
LWsave = L + 3 * M + Log(L) / Log(2) + 2 * Log(M) / Log(2) + 12
ReDim Wsave(LWsave - 1)
Call Rfft2i(L, M, Wsave, Info)
If Info <> 0 Then GoTo Err
'-- Generate test data
For I = 0 To L - 1
For J = 0 To M - 1
R(I, J) = Rnd()
R0(I, J) = R(I, J)
Next
Next
'-- Forward transform
Call Rfft2f(L, M, R(), Wsave(), Info)
If Info <> 0 Then GoTo Err
'-- Convert to full complex data
Call Rfft2c(L, M, R(), C(), Info)
'-- Initialization for Cfft2b
LWsave = 2 * (L + M) + Log(L) / Log(2) + Log(M) / Log(2) + 8
ReDim Wsave(LWsave - 1)
Call Cfft2i(L, M, Wsave, Info)
If Info <> 0 Then GoTo Err
'-- Backward transform by Cfft2b
Call Cfft2b(L, M, C(), Wsave(), Info)
If Info <> 0 Then GoTo Err
'-- Print result
For J = 0 To M - 1
For I = 0 To L - 1
Debug.Print R0(I, J), Creal(C(I, J)), Cimag(C(I, J)), Creal(C(I, J)) - R0(I, J)
Next
Debug.Print
Next
Exit Sub
Err:
Debug.Print "Error in Rfft2i/Rfft2f/Rfft2b: Info =", Info
End Sub
Function Cimag(A As Complex) As Double
複素数の虚数部
Function Creal(A As Complex) As Double
複素数の実数部
Sub Rfft2c(L As Long, M As Long, R() As Double, C() As Complex, Info As Long)
Rfft2fによるフーリエ変換の2次元複素データ
Sub Rfft2i(L As Long, M As Long, Wsave() As Double, Info As Long)
Rfft2fおよびRfft2bのための作業データの初期化
Sub Rfft2f(L As Long, M As Long, R() As Double, Wsave() As Double, Info As Long)
2次元実フーリエ変換
Sub Cfft2b(L As Long, M As Long, C() As Complex, Wsave() As Double, Info As Long)
2次元複素フーリエ逆変換
Sub Cfft2i(L As Long, M As Long, Wsave() As Double, Info As Long)
Cfft2fおよびCfft2bのための作業データの初期化
Sub Rfft2b(L As Long, M As Long, R() As Double, Wsave() As Double, Info As Long)
2次元実フーリエ逆変換
実行結果
0.902888596057892 0.902888596057892 0 0
0.449173510074615 0.449173510074615 0 0
0.91016560792923 0.91016560792923 0 0
0.415564596652985 0.415564596652985 0 0
0.419061899185181 0.419061899185181 0 0
0.52361536026001 0.52361536026001 0 0
0.356703519821167 0.356703519821167 0 0
0.341727256774902 0.341727256774902 0 0
0.614621579647064 0.614621579647064 0 0
0.320736587047577 0.320736587047577 0 0
0.423278748989105 0.423278748989105 0 0
0.214545428752899 0.214545428752899 0 0
0.733203768730164 0.733203768730164 0 0
0.805532574653625 0.805532574653625 0 0
0.942486166954041 0.942486166954041 0 0
0.579672455787659 0.579672455787659 0 0