| 1 | package ModelicaServices
|
|---|
| 2 | extends Modelica.Icons.Package;
|
|---|
| 3 |
|
|---|
| 4 | package Machine
|
|---|
| 5 | extends Modelica.Icons.Package;
|
|---|
| 6 | final constant Real eps = 1.e-15;
|
|---|
| 7 | final constant Real small = 1.e-60;
|
|---|
| 8 | final constant Real inf = 1.e+60;
|
|---|
| 9 | final constant Integer Integer_inf = OpenModelica.Internal.Architecture.integerMax();
|
|---|
| 10 | end Machine;
|
|---|
| 11 | end ModelicaServices;
|
|---|
| 12 |
|
|---|
| 13 | package Modelica
|
|---|
| 14 | extends Modelica.Icons.Package;
|
|---|
| 15 |
|
|---|
| 16 | package Blocks
|
|---|
| 17 | extends Modelica.Icons.Package;
|
|---|
| 18 |
|
|---|
| 19 | package Interfaces
|
|---|
| 20 | extends Modelica.Icons.InterfacesPackage;
|
|---|
| 21 | connector RealOutput = output Real;
|
|---|
| 22 |
|
|---|
| 23 | partial block SO
|
|---|
| 24 | extends Modelica.Blocks.Icons.Block;
|
|---|
| 25 | RealOutput y;
|
|---|
| 26 | end SO;
|
|---|
| 27 | end Interfaces;
|
|---|
| 28 |
|
|---|
| 29 | package Icons
|
|---|
| 30 | extends Modelica.Icons.IconsPackage;
|
|---|
| 31 |
|
|---|
| 32 | partial block Block end Block;
|
|---|
| 33 | end Icons;
|
|---|
| 34 | end Blocks;
|
|---|
| 35 |
|
|---|
| 36 | package Math
|
|---|
| 37 | extends Modelica.Icons.Package;
|
|---|
| 38 |
|
|---|
| 39 | package Icons
|
|---|
| 40 | extends Modelica.Icons.IconsPackage;
|
|---|
| 41 |
|
|---|
| 42 | partial function AxisCenter end AxisCenter;
|
|---|
| 43 | end Icons;
|
|---|
| 44 |
|
|---|
| 45 | function asin
|
|---|
| 46 | extends Modelica.Math.Icons.AxisCenter;
|
|---|
| 47 | input Real u;
|
|---|
| 48 | output .Modelica.SIunits.Angle y;
|
|---|
| 49 | external "builtin" y = asin(u);
|
|---|
| 50 | end asin;
|
|---|
| 51 |
|
|---|
| 52 | function exp
|
|---|
| 53 | extends Modelica.Math.Icons.AxisCenter;
|
|---|
| 54 | input Real u;
|
|---|
| 55 | output Real y;
|
|---|
| 56 | external "builtin" y = exp(u);
|
|---|
| 57 | end exp;
|
|---|
| 58 | end Math;
|
|---|
| 59 |
|
|---|
| 60 | package Constants
|
|---|
| 61 | extends Modelica.Icons.Package;
|
|---|
| 62 | final constant Real pi = 2 * Math.asin(1.0);
|
|---|
| 63 | final constant .Modelica.SIunits.Velocity c = 299792458;
|
|---|
| 64 | final constant Real mue_0(final unit = "N/A2") = 4 * pi * 1.e-7;
|
|---|
| 65 | end Constants;
|
|---|
| 66 |
|
|---|
| 67 | package Icons
|
|---|
| 68 | extends Icons.Package;
|
|---|
| 69 |
|
|---|
| 70 | partial package ExamplesPackage
|
|---|
| 71 | extends Modelica.Icons.Package;
|
|---|
| 72 | end ExamplesPackage;
|
|---|
| 73 |
|
|---|
| 74 | partial model Example end Example;
|
|---|
| 75 |
|
|---|
| 76 | partial package Package end Package;
|
|---|
| 77 |
|
|---|
| 78 | partial package InterfacesPackage
|
|---|
| 79 | extends Modelica.Icons.Package;
|
|---|
| 80 | end InterfacesPackage;
|
|---|
| 81 |
|
|---|
| 82 | partial package UtilitiesPackage
|
|---|
| 83 | extends Modelica.Icons.Package;
|
|---|
| 84 | end UtilitiesPackage;
|
|---|
| 85 |
|
|---|
| 86 | partial package IconsPackage
|
|---|
| 87 | extends Modelica.Icons.Package;
|
|---|
| 88 | end IconsPackage;
|
|---|
| 89 | end Icons;
|
|---|
| 90 |
|
|---|
| 91 | package SIunits
|
|---|
| 92 | extends Modelica.Icons.Package;
|
|---|
| 93 |
|
|---|
| 94 | package Conversions
|
|---|
| 95 | extends Modelica.Icons.Package;
|
|---|
| 96 |
|
|---|
| 97 | package NonSIunits
|
|---|
| 98 | extends Modelica.Icons.Package;
|
|---|
| 99 | type Temperature_degC = Real(final quantity = "ThermodynamicTemperature", final unit = "degC");
|
|---|
| 100 | end NonSIunits;
|
|---|
| 101 | end Conversions;
|
|---|
| 102 |
|
|---|
| 103 | type Angle = Real(final quantity = "Angle", final unit = "rad", displayUnit = "deg");
|
|---|
| 104 | type Time = Real(final quantity = "Time", final unit = "s");
|
|---|
| 105 | type Velocity = Real(final quantity = "Velocity", final unit = "m/s");
|
|---|
| 106 | type Acceleration = Real(final quantity = "Acceleration", final unit = "m/s2");
|
|---|
| 107 | type Period = Real(final quantity = "Time", final unit = "s");
|
|---|
| 108 | type Frequency = Real(final quantity = "Frequency", final unit = "Hz");
|
|---|
| 109 | type FaradayConstant = Real(final quantity = "FaradayConstant", final unit = "C/mol");
|
|---|
| 110 | end SIunits;
|
|---|
| 111 | end Modelica;
|
|---|
| 112 |
|
|---|
| 113 | package Noise
|
|---|
| 114 | extends Modelica.Icons.Package;
|
|---|
| 115 |
|
|---|
| 116 | model GlobalSeed
|
|---|
| 117 | parameter Integer userSeed = 1;
|
|---|
| 118 | final parameter Integer seed = userSeed;
|
|---|
| 119 | end GlobalSeed;
|
|---|
| 120 |
|
|---|
| 121 | block PRNG
|
|---|
| 122 | extends Modelica.Blocks.Interfaces.SO;
|
|---|
| 123 | outer GlobalSeed globalSeed;
|
|---|
| 124 | parameter Boolean useSampleBasedMethods = false;
|
|---|
| 125 | replaceable function SampleBasedRNG = Noise.RNG.SampleBased.RNG_LCG constrainedby Noise.Utilities.Interfaces.SampleBasedRNG;
|
|---|
| 126 | replaceable function SampleFreeRNG = Noise.RNG.SampleFree.RNG_DIRCS constrainedby Noise.Utilities.Interfaces.SampleFreeRNG;
|
|---|
| 127 | protected
|
|---|
| 128 | function SampleBasedRNG0 = SampleBasedRNG;
|
|---|
| 129 | function SampleFreeRNG0 = SampleFreeRNG;
|
|---|
| 130 | public
|
|---|
| 131 | replaceable function PDF = Noise.PDF.PDF_Uniform constrainedby Noise.Utilities.Interfaces.PDF;
|
|---|
| 132 | protected
|
|---|
| 133 | function SampleBasedPDF0 = PDF(redeclare function RNG = SampleBasedRNG0);
|
|---|
| 134 | function SampleFreePDF0 = PDF(redeclare function RNG = SampleFreeRNG0);
|
|---|
| 135 | public
|
|---|
| 136 | parameter Boolean infiniteFreq = false;
|
|---|
| 137 | protected
|
|---|
| 138 | parameter Modelica.SIunits.Frequency freq = 0.5 * 1 / samplePeriod;
|
|---|
| 139 | public
|
|---|
| 140 | replaceable function PSD = Noise.PSD.PSD_WhiteNoise constrainedby Noise.Utilities.Interfaces.PSD;
|
|---|
| 141 | protected
|
|---|
| 142 | function SampleBasedPSD0 = PSD(redeclare function PDF = SampleBasedPDF0);
|
|---|
| 143 | function SampleFreePSD0 = PSD(redeclare function PDF = SampleFreePDF0);
|
|---|
| 144 | function InfiniteFreqPSD0 = Noise.PSD.PSD_WhiteNoise(redeclare function PDF = SampleFreePDF0);
|
|---|
| 145 | public
|
|---|
| 146 | parameter Modelica.SIunits.Time startTime = 0;
|
|---|
| 147 | parameter Modelica.SIunits.Time samplePeriod = 0.01;
|
|---|
| 148 | parameter Boolean enable = true;
|
|---|
| 149 | parameter Real y_off = 0;
|
|---|
| 150 | replaceable function Seed = Noise.Seed.Seed_MRG(real_seed = 0.0) constrainedby Noise.Utilities.Interfaces.Seed;
|
|---|
| 151 | protected
|
|---|
| 152 | parameter Integer state_size = 33;
|
|---|
| 153 | Integer[state_size] state;
|
|---|
| 154 | Real t_last;
|
|---|
| 155 | public
|
|---|
| 156 | parameter Integer localSeed = 123456789;
|
|---|
| 157 | parameter Boolean useGlobalSeed = true;
|
|---|
| 158 | final parameter Integer seed = if useGlobalSeed then Utilities.Auxiliary.combineSeedLCG(localSeed, globalSeed.seed) else localSeed;
|
|---|
| 159 | final parameter Real DT = 1 / (2 * freq);
|
|---|
| 160 | output Real y_hold;
|
|---|
| 161 | protected
|
|---|
| 162 | discrete Real dummy1;
|
|---|
| 163 | discrete Real dummy2;
|
|---|
| 164 | initial equation
|
|---|
| 165 | if useSampleBasedMethods then
|
|---|
| 166 | pre(state) = Seed(local_seed = localSeed, global_seed = if useGlobalSeed then globalSeed.seed else 0, n = state_size, real_seed = 0.0);
|
|---|
| 167 | pre(t_last) = floor(time / DT) * DT;
|
|---|
| 168 | end if;
|
|---|
| 169 | equation
|
|---|
| 170 | if not enable then
|
|---|
| 171 | y = y_off;
|
|---|
| 172 | y_hold = y_off;
|
|---|
| 173 | t_last = 0;
|
|---|
| 174 | dummy1 = 0;
|
|---|
| 175 | dummy2 = 0;
|
|---|
| 176 | state = zeros(state_size);
|
|---|
| 177 | else
|
|---|
| 178 | if useSampleBasedMethods then
|
|---|
| 179 | when sample(0, DT) then
|
|---|
| 180 | t_last = time;
|
|---|
| 181 | (dummy1, dummy2, state) = SampleBasedPSD0(t = time, dt = DT, t_last = pre(t_last), states_in = pre(state));
|
|---|
| 182 | end when;
|
|---|
| 183 | (y_hold, y) = SampleBasedPSD0(t = time, dt = DT, t_last = t_last, states_in = state);
|
|---|
| 184 | else
|
|---|
| 185 | when initial() then
|
|---|
| 186 | dummy1 = 0;
|
|---|
| 187 | dummy2 = 0;
|
|---|
| 188 | end when;
|
|---|
| 189 | state = Seed(local_seed = localSeed, global_seed = if useGlobalSeed then globalSeed.seed else 0, n = state_size, real_seed = 0.0);
|
|---|
| 190 | t_last = noEvent(2 * abs(time) + 1);
|
|---|
| 191 | if infiniteFreq then
|
|---|
| 192 | (y_hold, y) = InfiniteFreqPSD0(t = time, dt = 0, t_last = t_last, states_in = state);
|
|---|
| 193 | else
|
|---|
| 194 | (y_hold, y) = SampleFreePSD0(t = time, dt = DT, t_last = t_last, states_in = state);
|
|---|
| 195 | end if;
|
|---|
| 196 | end if;
|
|---|
| 197 | end if;
|
|---|
| 198 | end PRNG;
|
|---|
| 199 |
|
|---|
| 200 | package RNG
|
|---|
| 201 | extends Modelica.Icons.Package;
|
|---|
| 202 |
|
|---|
| 203 | package SampleBased
|
|---|
| 204 | extends Modelica.Icons.Package;
|
|---|
| 205 |
|
|---|
| 206 | function RNG_MRG
|
|---|
| 207 | extends Noise.Utilities.Interfaces.SampleBasedRNG;
|
|---|
| 208 | input Integer[:] a = {1071064, 0, 0, 0, 0, 0, 2113664};
|
|---|
| 209 | input Integer c = 0;
|
|---|
| 210 | input Integer m = 2147483629;
|
|---|
| 211 | algorithm
|
|---|
| 212 | assert(size(states_in, 1) >= size(a, 1), "State must have at least as many elements as a!");
|
|---|
| 213 | states_out := states_in;
|
|---|
| 214 | states_out[1] := 0;
|
|---|
| 215 | for i in 1:size(a, 1) loop
|
|---|
| 216 | states_out[1] := states_out[1] + a[i] * states_in[i];
|
|---|
| 217 | end for;
|
|---|
| 218 | states_out[1] := integer(mod(states_out[1] + c, m));
|
|---|
| 219 | for i in 1:size(a, 1) - 1 loop
|
|---|
| 220 | states_out[i + 1] := states_in[i];
|
|---|
| 221 | end for;
|
|---|
| 222 | rand := abs(states_out[1] / (m - 1));
|
|---|
| 223 | end RNG_MRG;
|
|---|
| 224 |
|
|---|
| 225 | function RNG_LCG
|
|---|
| 226 | extends Noise.Utilities.Interfaces.SampleBasedRNG;
|
|---|
| 227 | input Integer a = 69069;
|
|---|
| 228 | input Integer c = 1;
|
|---|
| 229 | input Integer m = 2147483647;
|
|---|
| 230 | algorithm
|
|---|
| 231 | (rand, states_out) := RNG_MRG(instance, states_in, a = {a}, c = c, m = m);
|
|---|
| 232 | end RNG_LCG;
|
|---|
| 233 | end SampleBased;
|
|---|
| 234 |
|
|---|
| 235 | package SampleFree
|
|---|
| 236 | extends Modelica.Icons.Package;
|
|---|
| 237 |
|
|---|
| 238 | function RNG_DIRCS
|
|---|
| 239 | extends Noise.Utilities.Interfaces.SampleFreeRNG;
|
|---|
| 240 | replaceable function Seed = Noise.Seed.Seed_Real constrainedby Noise.Utilities.Interfaces.Seed;
|
|---|
| 241 | replaceable function RNG = Noise.RNG.SampleBased.RNG_MRG(a = {134775813, 134775813}, c = 1) constrainedby Noise.Utilities.Interfaces.RNG;
|
|---|
| 242 | input Integer k = 1;
|
|---|
| 243 | protected
|
|---|
| 244 | Integer[2] states_internal;
|
|---|
| 245 | algorithm
|
|---|
| 246 | states_internal := Seed(real_seed = instance, local_seed = states_in[1], global_seed = 0, n = 2);
|
|---|
| 247 | for i in 1:k loop
|
|---|
| 248 | (rand, states_internal) := RNG(instance = instance, states_in = states_internal);
|
|---|
| 249 | end for;
|
|---|
| 250 | states_out := states_in;
|
|---|
| 251 | end RNG_DIRCS;
|
|---|
| 252 | end SampleFree;
|
|---|
| 253 | end RNG;
|
|---|
| 254 |
|
|---|
| 255 | package PDF
|
|---|
| 256 | extends Noise.Utilities.Icons.PDFPackage;
|
|---|
| 257 |
|
|---|
| 258 | function PDF_Uniform
|
|---|
| 259 | extends Noise.Utilities.Interfaces.PDF;
|
|---|
| 260 | input Real[2] interval = {0, 1};
|
|---|
| 261 | algorithm
|
|---|
| 262 | (rand, states_out) := RNG(instance = instance, states_in = states_in);
|
|---|
| 263 | rand := rand * (interval[2] - interval[1]) + interval[1];
|
|---|
| 264 | end PDF_Uniform;
|
|---|
| 265 | end PDF;
|
|---|
| 266 |
|
|---|
| 267 | package PSD
|
|---|
| 268 | extends Noise.Utilities.Icons.PSDPackage;
|
|---|
| 269 |
|
|---|
| 270 | function PSD_WhiteNoise
|
|---|
| 271 | extends Noise.Utilities.Interfaces.PSD;
|
|---|
| 272 | algorithm
|
|---|
| 273 | if dt > 0 then
|
|---|
| 274 | (rand, states_out) := PDF(instance = floor(t / dt) * dt, states_in = states_in);
|
|---|
| 275 | else
|
|---|
| 276 | (rand, states_out) := PDF(instance = t, states_in = states_in);
|
|---|
| 277 | end if;
|
|---|
| 278 | rand_hold := rand;
|
|---|
| 279 | end PSD_WhiteNoise;
|
|---|
| 280 |
|
|---|
| 281 | function PSD_IdealLowPass
|
|---|
| 282 | extends PSD_Interpolation(redeclare function Kernel = Kernels.IdealLowPass);
|
|---|
| 283 | end PSD_IdealLowPass;
|
|---|
| 284 |
|
|---|
| 285 | function PSD_LinearInterpolation
|
|---|
| 286 | extends PSD_Interpolation(redeclare function Kernel = Kernels.Linear, n = 1);
|
|---|
| 287 | end PSD_LinearInterpolation;
|
|---|
| 288 |
|
|---|
| 289 | function PSD_Interpolation
|
|---|
| 290 | extends Noise.Utilities.Interfaces.PSD;
|
|---|
| 291 | replaceable function Kernel = Noise.PSD.Kernels.IdealLowPass constrainedby Utilities.Interfaces.Kernel;
|
|---|
| 292 | input Integer n = 5;
|
|---|
| 293 | input Integer max_n = n;
|
|---|
| 294 | protected
|
|---|
| 295 | Real raw;
|
|---|
| 296 | Real coefficient;
|
|---|
| 297 | Real scaling;
|
|---|
| 298 | Integer[size(states_in, 1)] states_temp;
|
|---|
| 299 | algorithm
|
|---|
| 300 | rand := 0;
|
|---|
| 301 | scaling := 0;
|
|---|
| 302 | states_temp := states_in;
|
|---|
| 303 | for i in (-max_n):(-n) loop
|
|---|
| 304 | (raw, states_temp) := PDF(instance = (floor(t / dt) + i) * dt, states_in = states_temp);
|
|---|
| 305 | end for;
|
|---|
| 306 | for i in (-n) + 1:n loop
|
|---|
| 307 | (raw, states_temp) := PDF(states_in = states_temp, instance = floor(t / dt + i) * dt);
|
|---|
| 308 | coefficient := if t_last <= t then Kernel(t = t - (t_last + i * dt), dt = dt) else Kernel(t = t - floor(t / dt + i) * dt, dt = dt);
|
|---|
| 309 | rand := rand + raw * coefficient;
|
|---|
| 310 | scaling := scaling + coefficient;
|
|---|
| 311 | if i == 0 then
|
|---|
| 312 | rand_hold := raw;
|
|---|
| 313 | else
|
|---|
| 314 | end if;
|
|---|
| 315 | end for;
|
|---|
| 316 | rand := rand / scaling;
|
|---|
| 317 | (raw, states_out) := PDF(states_in = states_in, instance = floor(t / dt) * dt);
|
|---|
| 318 | end PSD_Interpolation;
|
|---|
| 319 |
|
|---|
| 320 | package Kernels
|
|---|
| 321 | extends Modelica.Icons.Package;
|
|---|
| 322 |
|
|---|
| 323 | function IdealLowPass
|
|---|
| 324 | extends Noise.Utilities.Interfaces.Kernel;
|
|---|
| 325 | input Modelica.SIunits.Frequency B = 1 / 2 / dt;
|
|---|
| 326 | algorithm
|
|---|
| 327 | h := 2 * B * .Noise.Utilities.Math.sinc(2 * .Modelica.Constants.pi * B * t);
|
|---|
| 328 | end IdealLowPass;
|
|---|
| 329 |
|
|---|
| 330 | function Linear
|
|---|
| 331 | extends Noise.Utilities.Interfaces.Kernel;
|
|---|
| 332 | algorithm
|
|---|
| 333 | h := if t < (-dt) then 0 else if t < 0 then 1 + t / dt else if t < dt then 1 - t / dt else 0;
|
|---|
| 334 | end Linear;
|
|---|
| 335 | end Kernels;
|
|---|
| 336 | end PSD;
|
|---|
| 337 |
|
|---|
| 338 | package Seed
|
|---|
| 339 | extends Noise.Utilities.Icons.SeedPackage;
|
|---|
| 340 |
|
|---|
| 341 | function Seed_MRG
|
|---|
| 342 | extends Utilities.Interfaces.Seed;
|
|---|
| 343 | input Integer[:] a = fill(134775813, n);
|
|---|
| 344 | input Integer c = 1;
|
|---|
| 345 | input Integer m = 2147483629;
|
|---|
| 346 | input Integer k = n;
|
|---|
| 347 | protected
|
|---|
| 348 | Real dummy;
|
|---|
| 349 | Integer[max(n, 2)] internal_states;
|
|---|
| 350 | algorithm
|
|---|
| 351 | assert(n > 0, "You are seeding a state vector of size 0!");
|
|---|
| 352 | internal_states := cat(1, {local_seed, global_seed}, fill(0, max(n, 2) - 2));
|
|---|
| 353 | for i in 1:k loop
|
|---|
| 354 | (dummy, internal_states) := RNG.SampleBased.RNG_MRG(instance = real_seed, states_in = internal_states, a = a, c = c, m = m);
|
|---|
| 355 | end for;
|
|---|
| 356 | for i in 1:n loop
|
|---|
| 357 | states[i] := internal_states[i];
|
|---|
| 358 | end for;
|
|---|
| 359 | end Seed_MRG;
|
|---|
| 360 |
|
|---|
| 361 | function Seed_Real
|
|---|
| 362 | extends Utilities.Interfaces.Seed;
|
|---|
| 363 | algorithm
|
|---|
| 364 | states := Noise.Utilities.Auxiliary.SeedReal(local_seed = local_seed, global_seed = global_seed, real_seed = real_seed, n = n);
|
|---|
| 365 | end Seed_Real;
|
|---|
| 366 | end Seed;
|
|---|
| 367 |
|
|---|
| 368 | package Utilities
|
|---|
| 369 | extends Modelica.Icons.Package;
|
|---|
| 370 | extends Modelica.Icons.UtilitiesPackage;
|
|---|
| 371 |
|
|---|
| 372 | package Icons
|
|---|
| 373 | extends Modelica.Icons.IconsPackage;
|
|---|
| 374 |
|
|---|
| 375 | partial function PDF end PDF;
|
|---|
| 376 |
|
|---|
| 377 | partial package PDFPackage
|
|---|
| 378 | extends Modelica.Icons.Package;
|
|---|
| 379 | end PDFPackage;
|
|---|
| 380 |
|
|---|
| 381 | partial function PSD end PSD;
|
|---|
| 382 |
|
|---|
| 383 | partial package PSDPackage
|
|---|
| 384 | extends Modelica.Icons.Package;
|
|---|
| 385 | end PSDPackage;
|
|---|
| 386 |
|
|---|
| 387 | partial function Seed end Seed;
|
|---|
| 388 |
|
|---|
| 389 | partial package SeedPackage
|
|---|
| 390 | extends Modelica.Icons.Package;
|
|---|
| 391 | end SeedPackage;
|
|---|
| 392 | end Icons;
|
|---|
| 393 |
|
|---|
| 394 | package Interfaces
|
|---|
| 395 | extends Modelica.Icons.InterfacesPackage;
|
|---|
| 396 |
|
|---|
| 397 | partial function InputOutput
|
|---|
| 398 | input Modelica.SIunits.Time instance;
|
|---|
| 399 | input Integer[:] states_in;
|
|---|
| 400 | output Real rand;
|
|---|
| 401 | output Integer[size(states_in, 1)] states_out;
|
|---|
| 402 | end InputOutput;
|
|---|
| 403 |
|
|---|
| 404 | partial function RNG
|
|---|
| 405 | extends Interfaces.InputOutput;
|
|---|
| 406 | end RNG;
|
|---|
| 407 |
|
|---|
| 408 | partial function SampleBasedRNG
|
|---|
| 409 | extends Interfaces.RNG;
|
|---|
| 410 | end SampleBasedRNG;
|
|---|
| 411 |
|
|---|
| 412 | partial function SampleFreeRNG
|
|---|
| 413 | extends Interfaces.RNG;
|
|---|
| 414 | end SampleFreeRNG;
|
|---|
| 415 |
|
|---|
| 416 | partial function PDF
|
|---|
| 417 | extends Icons.PDF;
|
|---|
| 418 | extends Interfaces.InputOutput;
|
|---|
| 419 | replaceable function RNG = Noise.RNG.SampleBased.RNG_LCG constrainedby Interfaces.RNG;
|
|---|
| 420 | end PDF;
|
|---|
| 421 |
|
|---|
| 422 | partial function PSD
|
|---|
| 423 | extends Icons.PSD;
|
|---|
| 424 | output Real rand_hold;
|
|---|
| 425 | extends Interfaces.InputOutput(instance = t);
|
|---|
| 426 | input Modelica.SIunits.Time t;
|
|---|
| 427 | input Modelica.SIunits.Period dt;
|
|---|
| 428 | input Modelica.SIunits.Time t_last;
|
|---|
| 429 | replaceable function PDF = Noise.PDF.PDF_Uniform constrainedby Interfaces.PDF;
|
|---|
| 430 | end PSD;
|
|---|
| 431 |
|
|---|
| 432 | partial function Kernel
|
|---|
| 433 | input Real t;
|
|---|
| 434 | input Real dt;
|
|---|
| 435 | output Real h;
|
|---|
| 436 | end Kernel;
|
|---|
| 437 |
|
|---|
| 438 | partial function Seed
|
|---|
| 439 | extends Icons.Seed;
|
|---|
| 440 | input Integer local_seed = 12345;
|
|---|
| 441 | input Integer global_seed = 67890;
|
|---|
| 442 | input Real real_seed = 1.234;
|
|---|
| 443 | input Integer n = 33;
|
|---|
| 444 | output Integer[n] states;
|
|---|
| 445 | end Seed;
|
|---|
| 446 |
|
|---|
| 447 | partial function combineSeed
|
|---|
| 448 | input Integer seed1;
|
|---|
| 449 | input Integer seed2;
|
|---|
| 450 | output Integer newSeed;
|
|---|
| 451 | end combineSeed;
|
|---|
| 452 | end Interfaces;
|
|---|
| 453 |
|
|---|
| 454 | package Auxiliary
|
|---|
| 455 | extends Modelica.Icons.Package;
|
|---|
| 456 |
|
|---|
| 457 | function SeedReal
|
|---|
| 458 | input Integer local_seed;
|
|---|
| 459 | input Integer global_seed;
|
|---|
| 460 | input Real real_seed;
|
|---|
| 461 | input Integer n;
|
|---|
| 462 | output Integer[n] states;
|
|---|
| 463 | external "C" NOISE_SeedReal(local_seed, global_seed, real_seed, n, states);
|
|---|
| 464 | end SeedReal;
|
|---|
| 465 |
|
|---|
| 466 | function combineSeedLCG
|
|---|
| 467 | extends Interfaces.combineSeed;
|
|---|
| 468 | external "C" newSeed = NOISE_combineSeedLCG(seed1, seed2);
|
|---|
| 469 | end combineSeedLCG;
|
|---|
| 470 | end Auxiliary;
|
|---|
| 471 |
|
|---|
| 472 | package Math
|
|---|
| 473 | extends Modelica.Icons.Package;
|
|---|
| 474 |
|
|---|
| 475 | function sinc
|
|---|
| 476 | input Real x;
|
|---|
| 477 | output Real y;
|
|---|
| 478 | algorithm
|
|---|
| 479 | y := if abs(x) > 0.5e-4 then sin(x) / x else 1 - x ^ 2 / 6 + x ^ 4 / 120;
|
|---|
| 480 | end sinc;
|
|---|
| 481 | end Math;
|
|---|
| 482 | end Utilities;
|
|---|
| 483 | end Noise;
|
|---|
| 484 |
|
|---|
| 485 | model ComparePSD
|
|---|
| 486 | extends Modelica.Icons.Example;
|
|---|
| 487 | .Noise.PRNG WhiteNoise(redeclare function PSD = .Noise.PSD.PSD_WhiteNoise, useSampleBasedMethods = false, redeclare function PDF = .Noise.PDF.PDF_Uniform(interval = {-1, 1}));
|
|---|
| 488 | .Noise.PRNG IdealLowPass(redeclare function PSD = .Noise.PSD.PSD_IdealLowPass(n = 10), useSampleBasedMethods = false, redeclare function PDF = .Noise.PDF.PDF_Uniform(interval = {-1, 1}));
|
|---|
| 489 | .Noise.PRNG Linear(redeclare function PSD = .Noise.PSD.PSD_LinearInterpolation(n = 5), useSampleBasedMethods = false, redeclare function PDF = .Noise.PDF.PDF_Uniform(interval = {-1, 1}));
|
|---|
| 490 | inner .Noise.GlobalSeed globalSeed;
|
|---|
| 491 | end ComparePSD;
|
|---|