« パンダエクスプレス りんくうプレミアムアウトレット店でビッグプレート(オレンジチキン、クンパオチキン、モンゴリアンポーク)をいただく。アメリカに住んでいた時、オレンジチキンにハマって月2くらいで通っていた。 | トップページ | UnityでVisual C#用の数値計算ライブラリMath.NET Numericsを使う(5) ルンゲクッタ法でローレンツ方程式を計算して、その軌道通りに球を3D画面で動かし、そこに軌跡が残るようにする。さらにカメラも回転させる。 »

2025年1月27日 (月)

UnityでVisual C#用の数値計算ライブラリMath.NET numericsを使う(4) 高速フーリエ変換(FFT)をしながらそのグラフを3D空間で動かす。

さて今回はFFT編。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(3) 高速フーリエ変換(FFT)を実行する。FourierOptionsにMatlabとNumerical Recipesがあるのが意外。 

を基にやってみる。ただ画面に表示するだけでは面白くない。せっかくUnity使っているのでそのグラフを動かしてみよう。

UnityはObjectはものすごく簡単に動かせるが、今回使うLineRendererはだめらしい…では泥臭いがアップデートするたびに計算し直す。

フレーム内で計算が終わるかの確認にもなる。メインカメラの方もちょっと回してます。

コードはこんな感じで。


using MathNet.Numerics.IntegralTransforms;
using System.Numerics;
using System;
using UnityEngine;
using Vector3 = UnityEngine.Vector3;

public class MathNET04 : MonoBehaviour
{
    LineRenderer realLine;
    LineRenderer imagLine;
    int n;
    float z, span, delta;

    void Start()
    {
     
        // 実部用
        GameObject RealObject = GameObject.Find("RealLine");
        realLine = RealObject.GetComponent<LineRenderer>();
        // 虚部用
        GameObject ImagObject= GameObject.Find("ImagLine");
        imagLine = ImagObject.GetComponent<LineRenderer>();

        n = 256;
        z = 0;
        span  =0.1f;
        delta = 0;
        realLine.positionCount = n;
        realLine.widthMultiplier = 0.02f;
        realLine.startColor = Color.blue;
        realLine.endColor = Color.blue;

        imagLine.positionCount = n;
        imagLine.widthMultiplier = 0.02f;
        imagLine.startColor = Color.red;
        imagLine.endColor = Color.red;

       

    }

    private void Update()
    {
        delta += Time.deltaTime;
        if (delta > span)
        {
            Vector3[] realPoints = new Vector3[n];
            Vector3[] imagPoints = new Vector3[n];

            double[] t = new double[n];
            Complex[] y = new Complex[n];
            Complex imag = Complex.ImaginaryOne;

            for (int i = 0; i < t.Length; i++)
            {
                t[i] = Convert.ToDouble(i);
                y[i] = Math.Sin(t[i]);
            }

            Fourier.Forward(y, FourierOptions.Matlab);

            double[] freq = Fourier.FrequencyScale(256, 1.0);

            for (int i = 0; i < freq.Length; i++)
            {
                realPoints[i] = new Vector3((float)freq[i], (float)y[i].Real / 200f, MathF.Sin(z));
                imagPoints[i] = new Vector3((float)freq[i], (float)y[i].Imaginary / 200f, MathF.Sin(z));

            }

            realLine.SetPositions(realPoints);
            imagLine.SetPositions(imagPoints);
            z += 0.1f;
            if (z >= MathF.PI) z = 0f;
            delta = 0;
        }
    }

}

実行結果:

静止画

Unitymathfft

動画

なかなかシュール。では次行ってみよう(続く)。

 

« パンダエクスプレス りんくうプレミアムアウトレット店でビッグプレート(オレンジチキン、クンパオチキン、モンゴリアンポーク)をいただく。アメリカに住んでいた時、オレンジチキンにハマって月2くらいで通っていた。 | トップページ | UnityでVisual C#用の数値計算ライブラリMath.NET Numericsを使う(5) ルンゲクッタ法でローレンツ方程式を計算して、その軌道通りに球を3D画面で動かし、そこに軌跡が残るようにする。さらにカメラも回転させる。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« パンダエクスプレス りんくうプレミアムアウトレット店でビッグプレート(オレンジチキン、クンパオチキン、モンゴリアンポーク)をいただく。アメリカに住んでいた時、オレンジチキンにハマって月2くらいで通っていた。 | トップページ | UnityでVisual C#用の数値計算ライブラリMath.NET Numericsを使う(5) ルンゲクッタ法でローレンツ方程式を計算して、その軌道通りに球を3D画面で動かし、そこに軌跡が残るようにする。さらにカメラも回転させる。 »

最近の記事

最近のコメント

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  
フォト
無料ブログはココログ