2013-02-18 6 views

答えて

2

代わりにModelica.Blocks.Noiseを使用して、自分自身で外部コードを書くことを避けることができます(Modelica Standard Library 3.2.2、2016年4月3日リリース、すなわち、元の質問が尋ねられたときに助けにならなかった)。

Modelica.Blocks.Noiseのメリットの1つは、サンプリング、複数のシードなどの難しい問題が解決されていることです。

8

Wolfram SystemModelerで外部Cコードを使用してホワイトノイズを追加することができます。

Modelicaコードは(読みやすくなるかもしれないので、私は、コードからダイアグラムの注釈を削除しました):

package WhiteNoise "Package for generating white noise" 
    extends Modelica.Icons.Library; 

    block NoiseNormal "Normally distributed random noise" 
    parameter Real mean=0 "Mean value of random noise"; 
    parameter Real stdev=1 "Standard deviation of random noise"; 
    parameter Real tSample=0.01 "Noise sample time"; 
    Modelica.Blocks.Interfaces.RealOutput y; 
    equation 
    when initial() then 
     WhiteNoise.initRandomNormal(); 
    end when; 
    when sample(0, tSample) then 
     y=mean + stdev*WhiteNoise.RandomNormal(time); 
    end when; 
    end NoiseNormal; 

    function initRandomNormal 
    external "C" ext_initRandomNormal() annotation(Include="#include \"ext_initRandNormal.c\""); 
    end initRandomNormal; 

    function RandomNormal 
    output Real y; 
    input Real u; 
    external "C" y=ext_RandomNormal(u) annotation(Include="#include \"ext_RandNormal.c\""); 
    end RandomNormal; 

end WhiteNoise; 

外部コード:

ext_intRandNormal.c

#include <math.h> 
#include <limits.h> 

void ext_initRandomNormal() 
{ 
    srand(time(NULL)); 
} 

ext_RandNormal.c

#include <math.h> 
#include <limits.h> 
double ext_RandomNormal(double timein) 

{ 
    unsigned int seed = 0; 
    double v1, v2, r; 

    timein /= 100; 
    seed = (timein - floor(timein)) * UINT_MAX; 

    do 
    { 
     v1 = 2 * ((double) rand()) /((double) RAND_MAX) - 1; 
     v2 = 2 * ((double) rand()) /((double) RAND_MAX) - 1; 
     r = v1 * v1 + v2 * v2; 
    } while((r >= 1.0) || (r == 0.0)); 

    return v1 * sqrt(- 2.0 * log(r)/r); 
} 
+2

私は別の 'ext_initRandomNormaWithSeed'関数を追加して、ユーザがシード値を渡すことができるようにします。この方法で、ノイズ信号を再現することができます。 'ext_RandomNormal'の' seed'変数のポイントは何ですか?何か不足していますか?それは計算されているようだが使用されていない。 –

+3

さらに厳格にするには、状態を保存する 'ExternalObject'を使いたいかもしれません。あなたが上記のコードを使って異なる 'WhiteNoise'ソースを持っていなければならない場合、それらはお互いに"相互作用 "します(一方は他方に影響します)。 –

関連する問題