我正在嘗試將測量噪聲添加到模擬中。這可以在Simulink中實現,但在Modelica和SystemModeler中似乎更困難。Modelica中生成白噪聲(SystemModeler)
有關如何做到這一點的任何想法?
我正在嘗試將測量噪聲添加到模擬中。這可以在Simulink中實現,但在Modelica和SystemModeler中似乎更困難。Modelica中生成白噪聲(SystemModeler)
有關如何做到這一點的任何想法?
另一種方法是使用Modelica.Blocks.Noise
來避免自己編寫外部代碼(在2016年4月3日發佈的Modelica標準庫3.2.2中添加;即當原始問題被問到時它沒有幫助)。
Modelica.Blocks.Noise
的一個好處是,解決了抽樣,多種子等棘手問題。
您可以通過外部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);
}
我會添加一個替代'ext_initRandomNormaWithSeed'函數來允許用戶傳入一個種子值。這樣,您可以重現噪聲信號。 'ext_RandomNormal'中'seed'變量的意義是什麼?我錯過了什麼嗎?它似乎是計算,但從未使用過。 – 2013-02-19 13:40:34
爲了更加嚴謹,您可能希望使用一個保留狀態的'ExternalObject'。如果使用上面的代碼必須使用不同的'WhiteNoise'源代碼,它們將互相「交互」(一個會影響另一個)。 – 2013-02-19 13:43:30