splitted format の複素数画像間の乗算

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_fft2_mul_DDtoDD(
	FHANDLE hSrc1Re,
	FHANDLE hSrc1Im,
	FHANDLE hSrc2Re,
	FHANDLE hSrc2Im,
	FHANDLE hDstRe,
	FHANDLE hDstIm
)
Visual Basic
Public Shared Function fnFIE_fft2_mul_DDtoDD ( 
	hSrc1Re As FHANDLE,
	hSrc1Im As FHANDLE,
	hSrc2Re As FHANDLE,
	hSrc2Im As FHANDLE,
	hDstRe As FHANDLE,
	hDstIm As FHANDLE
) As Integer

Parameters

hSrc1Re
Type: fvalgcli..::..FHANDLE
1つ目の入力複素数画像の実部画像 ( type: double )
hSrc1Im
Type: fvalgcli..::..FHANDLE
1つ目の入力複素数画像の虚部画像 ( type: double )
hSrc2Re
Type: fvalgcli..::..FHANDLE
2つ目の入力複素数画像の実部画像 ( type: double )
hSrc2Im
Type: fvalgcli..::..FHANDLE
2つ目の入力複素数画像の虚部画像 ( type: double )
hDstRe
Type: fvalgcli..::..FHANDLE
出力複素数画像の実部画像 ( type: double )
hDstIm
Type: fvalgcli..::..FHANDLE
出力複素数画像の虚部画像 ( type: double )

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_INVALID_IMAGE不正な画像ハンドルが渡された
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Examples

C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// splitted format の複素数画像間の乗算.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_fft2_mul_DDtoDD()
        {
            int status = (int)f_err.F_ERR_NONE;

            FHANDLE hsrc1Re = FHANDLE.Zero;        // 入力データ1の実部.
            FHANDLE hsrc1Im = FHANDLE.Zero;        // 入力データ1の虚部.
            FHANDLE hsrc2Re = FHANDLE.Zero;        // 入力データ2の実部.
            FHANDLE hsrc2Im = FHANDLE.Zero;        // 入力データ2の虚部.
            FHANDLE hdstRe = FHANDLE.Zero;        // 出力データの実部.
            FHANDLE hdstIm = FHANDLE.Zero;        // 出力データの虚部.

            try
            {
                const int width = 3;
                const int height = 2;

                // 領域確保.                
                hsrc1Re = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hsrc1Im = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hsrc2Re = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hsrc2Im = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hdstRe = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);
                hdstIm = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height);

                // テストデータの作成.
                DOUBLE_PTR psrc1Re = api.fnFIE_img_get_adrs(hsrc1Re);
                DOUBLE_PTR psrc1Im = api.fnFIE_img_get_adrs(hsrc1Im);
                DOUBLE_PTR psrc2Re = api.fnFIE_img_get_adrs(hsrc2Re);
                DOUBLE_PTR psrc2Im = api.fnFIE_img_get_adrs(hsrc2Im);
                var src1Re_step = api.fnFIE_img_get_step(hsrc1Re);
                var src1Im_step = api.fnFIE_img_get_step(hsrc1Im);
                var src2Re_step = api.fnFIE_img_get_step(hsrc2Re);
                var src2Im_step = api.fnFIE_img_get_step(hsrc2Im);
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        psrc1Re[x] = (y + 1) * 10 + (x + 1) * 0.1;
                        psrc1Im[x] = (y + 1) * 10 + (x + 1) * 0.2;
                        psrc2Re[x] = (y + 1) * 2 + (x + 1) * 0.1;
                        psrc2Im[x] = (y + 1) * 2 + (x + 1) * 0.2;
                    }

                    psrc1Re += src1Re_step;
                    psrc1Im += src1Im_step;
                    psrc2Re += src2Re_step;
                    psrc2Im += src2Im_step;
                }

                // 処理の実行.
                status = api.fnFIE_fft2_mul_DDtoDD(hsrc1Re, hsrc1Im, hsrc2Re, hsrc2Im, hdstRe, hdstIm);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 結果.
                int errors_Re = 0;
                int errors_Im = 0;
                psrc1Re = api.fnFIE_img_get_adrs(hsrc1Re);
                psrc1Im = api.fnFIE_img_get_adrs(hsrc1Im);
                psrc2Re = api.fnFIE_img_get_adrs(hsrc2Re);
                psrc2Im = api.fnFIE_img_get_adrs(hsrc2Im);
                DOUBLE_PTR pdstRe = api.fnFIE_img_get_adrs(hdstRe);
                DOUBLE_PTR pdstIm = api.fnFIE_img_get_adrs(hdstIm);
                var dstRe_step = api.fnFIE_img_get_step(hdstRe);
                var dstIm_step = api.fnFIE_img_get_step(hdstIm);
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        var ans = api.fnFIE_cmul(FCOMPLEX.init(psrc1Re[x], psrc1Im[x]), FCOMPLEX.init(psrc2Re[x], psrc2Im[x]));
                        if (!(ans.real - defs.DBL_EPS <= pdstRe[x] && pdstRe[x] <= ans.real + defs.DBL_EPS))
                        {
                            errors_Re += 1;
                        }
                        if (!(ans.image - defs.DBL_EPS <= pdstIm[x] && pdstIm[x] <= ans.image + defs.DBL_EPS))
                        {
                            errors_Im += 1;
                        }

                        Console.WriteLine("{0},{1}: {2,5:F1} * {3,5:F1} = {4,13:F9} (expected {5,13:F9})", y, x, psrc1Re[x], psrc2Re[x], pdstRe[x], ans.real);
                        Console.WriteLine("{0},{1}: {2,5:F1} * {3,5:F1} = {4,13:F9} (expected {5,13:F9})", y, x, psrc1Im[x], psrc2Im[x], pdstIm[x], ans.image);
                    }

                    psrc1Re += src1Re_step;
                    psrc1Im += src1Im_step;
                    psrc2Re += src2Re_step;
                    psrc2Im += src2Im_step;
                    pdstRe += dstRe_step;
                    pdstIm += dstIm_step;
                }
                if (errors_Re > 0 || errors_Im > 0)
                {
                    Assert.Fail("処理結果に誤りがあります。Re={0}, Im={1}", errors_Re, errors_Im);
                }
            }
            finally
            {
                // オブジェクトの開放.
                hsrc1Re.Dispose();
                hsrc1Im.Dispose();
                hsrc2Re.Dispose();
                hsrc2Im.Dispose();
                hdstRe.Dispose();
                hdstIm.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Runtime.InteropServices
Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    ''' <summary>
    ''' splitted format の複素数画像間の乗算. 
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_fft2_mul_DDtoDD()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        ' 入力データ1の実部.
        Dim hsrc1Re As FHANDLE = FHANDLE.Zero
        ' 入力データ1の虚部.
        Dim hsrc1Im As FHANDLE = FHANDLE.Zero
        ' 入力データ2の実部.
        Dim hsrc2Re As FHANDLE = FHANDLE.Zero
        ' 入力データ2の虚部.
        Dim hsrc2Im As FHANDLE = FHANDLE.Zero
        ' 出力データの実部.
        Dim hdstRe As FHANDLE = FHANDLE.Zero
        ' 出力データの虚部.
        Dim hdstIm As FHANDLE = FHANDLE.Zero

        Try
            Const width As Integer = 3
            Const height As Integer = 2

            ' 領域確保.                
            hsrc1Re = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)
            hsrc1Im = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)
            hsrc2Re = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)
            hsrc2Im = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)
            hdstRe = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)
            hdstIm = api.fnFIE_img_root_alloc(f_imgtype.F_IMG_DOUBLE, 1, width, height)

            ' テストデータの作成.
            Dim psrc1Re As DOUBLE_PTR = api.fnFIE_img_get_adrs(hsrc1Re)
            Dim psrc1Im As DOUBLE_PTR = api.fnFIE_img_get_adrs(hsrc1Im)
            Dim psrc2Re As DOUBLE_PTR = api.fnFIE_img_get_adrs(hsrc2Re)
            Dim psrc2Im As DOUBLE_PTR = api.fnFIE_img_get_adrs(hsrc2Im)
            Dim src1Re_step As SIZE_T = api.fnFIE_img_get_step(hsrc1Re)
            Dim src1Im_step As SIZE_T = api.fnFIE_img_get_step(hsrc1Im)
            Dim src2Re_step As SIZE_T = api.fnFIE_img_get_step(hsrc2Re)
            Dim src2Im_step As SIZE_T = api.fnFIE_img_get_step(hsrc2Im)
            For y As Integer = 0 To height - 1
                For x As Integer = 0 To width - 1
                    psrc1Re(x) = (y + 1) * 10 + (x + 1) * 0.1
                    psrc1Im(x) = (y + 1) * 10 + (x + 1) * 0.2
                    psrc2Re(x) = (y + 1) * 2 + (x + 1) * 0.1
                    psrc2Im(x) = (y + 1) * 2 + (x + 1) * 0.2
                Next

                psrc1Re += src1Re_step
                psrc1Im += src1Im_step
                psrc2Re += src2Re_step
                psrc2Im += src2Im_step
            Next

            ' 処理の実行.
            status = api.fnFIE_fft2_mul_DDtoDD(hsrc1Re, hsrc1Im, hsrc2Re, hsrc2Im, hdstRe, hdstIm)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 結果.
            Dim errors_Re As Integer = 0
            Dim errors_Im As Integer = 0
            psrc1Re = api.fnFIE_img_get_adrs(hsrc1Re)
            psrc1Im = api.fnFIE_img_get_adrs(hsrc1Im)
            psrc2Re = api.fnFIE_img_get_adrs(hsrc2Re)
            psrc2Im = api.fnFIE_img_get_adrs(hsrc2Im)
            Dim pdstRe As DOUBLE_PTR = api.fnFIE_img_get_adrs(hdstRe)
            Dim pdstIm As DOUBLE_PTR = api.fnFIE_img_get_adrs(hdstIm)
            Dim dstRe_step As SIZE_T = api.fnFIE_img_get_step(hdstRe)
            Dim dstIm_step As SIZE_T = api.fnFIE_img_get_step(hdstIm)
            For y As Integer = 0 To height - 1
                For x As Integer = 0 To width - 1
                    Dim ans As FCOMPLEX = api.fnFIE_cmul(FCOMPLEX.init(psrc1Re(x), psrc1Im(x)), FCOMPLEX.init(psrc2Re(x), psrc2Im(x)))
                    If Not (ans.real - defs.DBL_EPS <= pdstRe(x) AndAlso pdstRe(x) <= ans.real + defs.DBL_EPS) Then
                        errors_Re += 1
                    End If
                    If Not (ans.image - defs.DBL_EPS <= pdstIm(x) AndAlso pdstIm(x) <= ans.image + defs.DBL_EPS) Then
                        errors_Im += 1
                    End If

                    Console.WriteLine("{0},{1}: {2,5:F1} * {3,5:F1} = {4,13:F9} (expected {5,13:F9})", y, x, psrc1Re(x), psrc2Re(x), pdstRe(x), ans.real)
                    Console.WriteLine("{0},{1}: {2,5:F1} * {3,5:F1} = {4,13:F9} (expected {5,13:F9})", y, x, psrc1Im(x), psrc2Im(x), pdstIm(x), ans.image)
                Next

                psrc1Re += src1Re_step
                psrc1Im += src1Im_step
                psrc2Re += src2Re_step
                psrc2Im += src2Im_step
                pdstRe += dstRe_step
                pdstIm += dstIm_step
            Next
            If errors_Re > 0 OrElse errors_Im > 0 Then
                Assert.Fail("処理結果に誤りがあります。Re={0}, Im={1}", errors_Re, errors_Im)
            End If
        Finally
            ' オブジェクトの開放.
            hsrc1Re.Dispose()
            hsrc1Im.Dispose()
            hsrc2Re.Dispose()
            hsrc2Im.Dispose()
            hdstRe.Dispose()
            hdstIm.Dispose()
        End Try
    End Sub
End Class

See Also