時間領域の1次元実数データの順方向フーリエ変換を行い、
interleaved format の複素数データを出力する
Namespace: fvalgcliAssembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)
Syntax
C# |
---|
public static int fnFIE_fft_fwd_UC8toC( FHANDLE hFFT, UCHAR_PTR ucpSrc, FCOMPLEX_PTR vpDst, int iOrder ) |
Visual Basic |
---|
Public Shared Function fnFIE_fft_fwd_UC8toC ( hFFT As FHANDLE, ucpSrc As UCHAR_PTR, vpDst As FCOMPLEX_PTR, iOrder As Integer ) As Integer |
Parameters
- hFFT
- Type: fvalgcli..::..FHANDLE
FFTハンドル
- ucpSrc
- Type: fvalgcli..::..UCHAR_PTR
時間領域の1次元の実数入力データのポインタ
- vpDst
- Type: fvalgcli..::..FCOMPLEX_PTR
周波数領域の1次元の複素数データのポインタ
- iOrder
- Type: System..::..Int32
データ長の次数。入出力データ長は N=2^iOrder になります。
Return Value
Type: Int32以下のエラーコードを返します。
エラーコード:
f_err | 内容 |
---|---|
F_ERR_NONE | 正常終了 |
F_ERR_INVALID_OBJECT | hFFT , ucpSrc , vpDst のいずれかに IntPtr.Zero が渡された |
F_ERR_INVALID_PARAM |
|
F_ERR_FFT_INVALID_SPEC | 指定された hFFT ハンドルはこの処理に使用できない |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Examples
C# | Copy |
---|---|
// $Revision: 1.1 $ using System; using System.Collections.Generic; using System.Text; using fvalgcli; namespace TC { public partial class FIE { /// <summary> /// 時間領域の1次元実数データの順方向フーリエ変換(interleaved format の複素数データ出力). /// </summary> [FvPluginExecute] public void fnFIE_fft_fwd_UC8toC() { int status = (int)f_err.F_ERR_NONE; int iOrder = 5; // データ長の次数. int length = 1 << iOrder; // 入力データの長さ. FHANDLE hFFT = FHANDLE.Zero; // FFTハンドル. UCHAR_PTR pDataSrc = UCHAR_PTR.Zero; // 入力データ. FCOMPLEX_PTR pDataDst = FCOMPLEX_PTR.Zero; // 出力データ. try { // データの作成. pDataSrc = UCHAR_PTR.alloc(length); for (int i = 0; i < length; i++) { pDataSrc[i] = (byte)i; } pDataDst = FCOMPLEX_PTR.alloc(length); for (int i = 0; i < length; i++) { pDataDst[i] = FCOMPLEX.init(0.0, 0.0); } // FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(ref hFFT, iOrder, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_FCOMPLEX, f_fft_data_type.F_1D_FFT_FCOMPLEX); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status); // 処理の実行. status = api.fnFIE_fft_fwd_UC8toC(hFFT, pDataSrc, pDataDst, iOrder); // エラー判定. Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status); // 結果比較(処理前の値と変わっていることの確認). bool result = false; for (int i = 0; i < length; i++) { if (0.0 != pDataDst[i].real || 0.0 != pDataDst[i].image) { result = true; break; } } if (!result) { Assert.Fail("処理前と値が変わっていません"); } } finally { // オブジェクトの開放. hFFT.Dispose(); pDataSrc.Dispose(); pDataDst.Dispose(); } } /// <summary> /// 1次元データの順方向/逆方向フーリエ変換. /// </summary> /// <remarks> /// UCHAR 配列 ――順方向フーリエ変換―→ FCOMPLEX 配列. /// UCHAR 配列 ←―逆方向フーリエ変換―― FCOMPLEX 配列. /// 以上の処理で元のデータに戻る(一致する)ことを確認する. /// [注意] /// 処理対象のデータ長は2のべき乗であること. /// </remarks> [FvPluginExecute] public void fnFIE_fft_TEST_UC8toC_CtoUC8() { int status = (int)f_err.F_ERR_NONE; int iOrder = 5; // データ長の次数. int length = 1 << iOrder; // 入力データの長さ. UCHAR_PTR pDataSrc = UCHAR_PTR.Zero; // (順方向フーリエ変換)入力データ. FCOMPLEX_PTR pDataDst = FCOMPLEX_PTR.Zero; // (順方向フーリエ変換)出力データ. UCHAR_PTR pDataInv = UCHAR_PTR.Zero; // (逆方向フーリエ変換)出力データ. FHANDLE hFFTFwd = FHANDLE.Zero; // (順方向フーリエ変換)FFTハンドル. FHANDLE hFFTInv = FHANDLE.Zero; // (逆方向フーリエ変換)FFTハンドル. try { // 入力データ配列の作成. pDataSrc = UCHAR_PTR.alloc(length); for (int i = 0; i < length; i++) { pDataSrc[i] = (byte)i; } // 出力データ配列の作成 pDataDst = FCOMPLEX_PTR.alloc(length); for (int i = 0; i < length; i++) { pDataDst[i] = FCOMPLEX.init(0.0, 0.0); } // (順方向フーリエ変換)FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(ref hFFTFwd, iOrder, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_FCOMPLEX, f_fft_data_type.F_1D_FFT_FCOMPLEX); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "(順方向フーリエ変換)FFTハンドルの初期化 : エラーが発生しました。({0})", (f_err)status); // 順方向フーリエ変換の実行. status = api.fnFIE_fft_fwd_UC8toC(hFFTFwd, pDataSrc, pDataDst, iOrder); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft_fwd_UC8toC : エラーが発生しました。({0})", (f_err)status); // (逆フーリエ変換)出力データ配列の生成. pDataInv = UCHAR_PTR.alloc(length); // (逆フーリエ変換)FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(ref hFFTInv, iOrder, f_fft_direction.F_FFT_INVERSE, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_REAL, f_fft_data_type.F_1D_FFT_FCOMPLEX); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "(逆フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", (f_err)status); // 逆フーリエ変換の実行 status = api.fnFIE_fft_inv_CtoUC8(hFFTInv, pDataDst, pDataInv, 1.0, iOrder ); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_fft_inv_CtoUC8: エラーが発生しました。({0})", (f_err)status); // 確認 { for (int i = 0; i < length; i++) { Assert.IsTrue(compare(pDataInv[i], pDataSrc[i], 0.0), "元のデータと一致しません。"); } } } finally { // オブジェクトの開放. pDataSrc.Dispose(); pDataDst.Dispose(); pDataInv.Dispose(); hFFTFwd.Dispose(); hFFTInv.Dispose(); } } } } |
Visual Basic | Copy |
---|---|
' $Revision: 1.1 $ Imports System.Collections.Generic Imports System.Text Imports fvalgcli Public Partial Class FIE ''' <summary> ''' 時間領域の1次元実数データの順方向フーリエ変換(interleaved format の複素数データ出力). ''' </summary> <FvPluginExecute> _ Public Sub fnFIE_fft_fwd_UC8toC() Dim status As Integer = CInt(f_err.F_ERR_NONE) Dim iOrder As Integer = 5 ' データ長の次数. Dim length As Integer = 1 << iOrder ' 入力データの長さ. Dim hFFT As FHANDLE = FHANDLE.Zero ' FFTハンドル. Dim pDataSrc As UCHAR_PTR = UCHAR_PTR.Zero ' 入力データ. Dim pDataDst As FCOMPLEX_PTR = FCOMPLEX_PTR.Zero ' 出力データ. Try ' データの作成. pDataSrc = UCHAR_PTR.alloc(length) For i As Integer = 0 To length - 1 pDataSrc(i) = CByte(i) Next pDataDst = FCOMPLEX_PTR.alloc(length) For i As Integer = 0 To length - 1 pDataDst(i) = FCOMPLEX.init(0.0, 0.0) Next ' FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(hFFT, iOrder, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_FCOMPLEX, f_fft_data_type.F_1D_FFT_FCOMPLEX) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err)) ' 処理の実行. status = api.fnFIE_fft_fwd_UC8toC(hFFT, pDataSrc, pDataDst, iOrder) ' エラー判定. Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err)) ' 結果比較(処理前の値と変わっていることの確認). Dim result As Boolean = False For i As Integer = 0 To length - 1 If 0.0 <> pDataDst(i).real OrElse 0.0 <> pDataDst(i).image Then result = True Exit For End If Next If Not result Then Assert.Fail("処理前と値が変わっていません") End If Finally ' オブジェクトの開放. hFFT.Dispose() pDataSrc.Dispose() pDataDst.Dispose() End Try End Sub ''' <summary> ''' 1次元データの順方向/逆方向フーリエ変換. ''' </summary> ''' <remarks> ''' UCHAR 配列 ――順方向フーリエ変換―→ FCOMPLEX 配列. ''' UCHAR 配列 ←―逆方向フーリエ変換―― FCOMPLEX 配列. ''' 以上の処理で元のデータに戻る(一致する)ことを確認する. ''' [注意] ''' 処理対象のデータ長は2のべき乗であること. ''' </remarks> <FvPluginExecute> _ Public Sub fnFIE_fft_TEST_UC8toC_CtoUC8() Dim status As Integer = CInt(f_err.F_ERR_NONE) Dim iOrder As Integer = 5 ' データ長の次数. Dim length As Integer = 1 << iOrder ' 入力データの長さ. Dim pDataSrc As UCHAR_PTR = UCHAR_PTR.Zero ' (順方向フーリエ変換)入力データ. Dim pDataDst As FCOMPLEX_PTR = FCOMPLEX_PTR.Zero ' (順方向フーリエ変換)出力データ. Dim pDataInv As UCHAR_PTR = UCHAR_PTR.Zero ' (逆方向フーリエ変換)出力データ. Dim hFFTFwd As FHANDLE = FHANDLE.Zero ' (順方向フーリエ変換)FFTハンドル. Dim hFFTInv As FHANDLE = FHANDLE.Zero ' (逆方向フーリエ変換)FFTハンドル. Try ' 入力データ配列の作成. pDataSrc = UCHAR_PTR.alloc(length) For i As Integer = 0 To length - 1 pDataSrc(i) = CByte(i) Next ' 出力データ配列の作成 pDataDst = FCOMPLEX_PTR.alloc(length) For i As Integer = 0 To length - 1 pDataDst(i) = FCOMPLEX.init(0.0, 0.0) Next ' (順方向フーリエ変換)FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(hFFTFwd, iOrder, f_fft_direction.F_FFT_FORWARD, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_FCOMPLEX, f_fft_data_type.F_1D_FFT_FCOMPLEX) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "(順方向フーリエ変換)FFTハンドルの初期化 : エラーが発生しました。({0})", CType(status, f_err)) ' 順方向フーリエ変換の実行. status = api.fnFIE_fft_fwd_UC8toC(hFFTFwd, pDataSrc, pDataDst, iOrder) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft_fwd_UC8toC : エラーが発生しました。({0})", CType(status, f_err)) ' (逆フーリエ変換)出力データ配列の生成. pDataInv = UCHAR_PTR.alloc(length) ' (逆フーリエ変換)FFTハンドルの初期化. status = api.fnFIE_fft_1D_alloc(hFFTInv, iOrder, f_fft_direction.F_FFT_INVERSE, f_fft_normalize_type.F_FFT_DIV_BY_SQRTN, f_fft_data_type.F_1D_FFT_REAL, f_fft_data_type.F_1D_FFT_FCOMPLEX) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "(逆フーリエ変換)FFTハンドルの初期化: エラーが発生しました。({0})", CType(status, f_err)) ' 逆フーリエ変換の実行 status = api.fnFIE_fft_inv_CtoUC8(hFFTInv, pDataDst, pDataInv, 1.0, iOrder) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_fft_inv_CtoUC8: エラーが発生しました。({0})", CType(status, f_err)) ' 確認 If True Then For i As Integer = 0 To length - 1 Assert.IsTrue(compare(pDataInv(i), pDataSrc(i), 0.0), "元のデータと一致しません。") Next End If Finally ' オブジェクトの開放. pDataSrc.Dispose() pDataDst.Dispose() pDataInv.Dispose() hFFTFwd.Dispose() hFFTInv.Dispose() End Try End Sub End Class |