2013-02-18 11 views

Antwort

2

Eine Alternative ist, Modelica.Blocks.Noise zu verwenden, um zu vermeiden, externen Code selbst zu schreiben (hinzugefügt in Modelica Standard Library 3.2.2 freigegeben am 3. April 2016; es hätte nicht geholfen, wenn die ursprüngliche Frage gestellt wurde).

Ein Vorteil von Modelica.Blocks.Noise ist, dass die kniffligen Fragen mit Sampling, mehreren Samen usw. gelöst werden.

8

Sie können weißes Rauschen in Wolfram SystemModeler über externen C-Code hinzufügen.

Modelica-Code (Ich habe die Diagramm Anmerkungen aus dem Code entfernt, so dass es vielleicht leichter lesen):

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; 

Externer Code:

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

Ich würde eine alternative 'ext_initRandomNormaWithSeed'-Funktion hinzufügen, um dem Benutzer zu erlauben, einen Seed-Wert zu übergeben. Auf diese Weise können Sie das Rauschsignal reproduzieren. Was ist der Punkt der Variable 'seed' in' ext_RandomNormal'? Fehle ich etwas? Es scheint berechnet, aber nie benutzt zu werden. –

+3

Um noch rigoroser zu sein, möchten Sie vielleicht ein 'ExternalObject' verwenden, das den Zustand erhält. Wenn Sie unter Verwendung des obigen Codes verschiedene 'WhiteNoise'-Quellen verwenden müssen," interagieren "sie miteinander (einer beeinflusst den anderen). –

Verwandte Themen