2013-02-18 8 views
6

मैं एक अनुकरण करने के लिए माप शोर जोड़ने के लिए कोशिश कर रहा हूँ उत्पन्न करें। उदाहरण के लिए सिमुलिंक करना संभव है लेकिन मॉडलिका और सिस्टममोडेलर में अधिक कठिन लगता है।माडेलिका (SystemModeler) में सफेद शोर

यह कैसे करें इस पर कोई विचार है?

उत्तर

2

एक वैकल्पिक Modelica.Blocks.Noise उपयोग करने के लिए बाहरी कोड अपने आप को (माडेलिका स्टैंडर्ड लाइब्रेरी 3.2.2 3 अप्रैल, वर्ष 2016 में जारी की में जोड़ा लेखन से बचने के लिए है, यानी जब मूल प्रश्न पूछा गया तो इससे मदद नहीं मिली होगी)। Modelica.Blocks.Noise की

एक लाभ यह है कि नमूना, कई बीज, आदि के साथ मुश्किल सवाल हल कर रहे हैं।

8

आप बाहरी सी-कोड के माध्यम से Wolfram SystemModeler में सफेद शोर जोड़ सकते हैं।

माडेलिका कोड (मैं कोड से आरेख एनोटेशन हटा दिया है, ताकि इसे पढ़ने के लिए आसान हो सकता है):

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' में' बीज' चर का बिंदु क्या है? क्या मैं कुछ भूल रहा हूँ? ऐसा लगता है कि गणना की जाती है लेकिन कभी भी इसका इस्तेमाल नहीं किया जाता है। –

+3

और भी कठोर होने के लिए, आप एक 'बाहरी ऑब्जेक्ट' का उपयोग करना चाहेंगे जो राज्य को संरक्षित करता है। यदि आपको उपरोक्त कोड का उपयोग करके अलग-अलग 'व्हाइटनोइस' स्रोतों को अलग करना है, तो वे एक दूसरे के साथ "बातचीत" करेंगे (एक दूसरे को प्रभावित करेगा)। –

संबंधित मुद्दे