2013-02-18 106 views

回答

2

另一種方法是使用Modelica.Blocks.Noise來避免自己編寫外部代碼(在2016年4月3日發佈的Modelica標準庫3.2.2中添加;即當原始問題被問到時它沒有幫助)。

Modelica.Blocks.Noise的一個好處是,解決了抽樣,多種子等棘手問題。

8

您可以通過外部C代碼在Wolfram SystemModeler中添加白噪聲。

的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'變量的意義是什麼?我錯過了什麼嗎?它似乎是計算,但從未使用過。 – 2013-02-19 13:40:34

+3

爲了更加嚴謹,您可能希望使用一個保留狀態的'ExternalObject'。如果使用上面的代碼必須使用不同的'WhiteNoise'源代碼,它們將互相「交互」(一個會影響另一個)。 – 2013-02-19 13:43:30