Невозможно присвоить значения массиву при использовании функции sample () - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь реализовать DFT самостоятельно, потому что пример FFT в OpenModelica не работает для меня, и я не могу понять, почему. Но я уже застрял, выбирая синусоидальную функцию и присваивая выборочные значения массиву буферов. Вот почему я попытался сделать это еще проще и просто присвоить счетчику переменную "iTick" для массива, который все еще не работает. Смотрите базовый пример.

Может кто-нибудь сказать мне, почему это не работает и как я могу на самом деле присвоить значение массиву при использовании функции sample () ??

block DFT
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick;
  Real y_buf[N];


algorithm

when sample(0, 0.1) then     
  iTick :=iTick + 1;

  if iTick >= 1 and iTick <= N then
    y_buf[iTick] := iTick;
  end if;
end when;

end DFT;
[358] 14:56:15 Symbolisch Warnung
The linear system: 
1 : $PRE.y_buf[2] = y_buf[2]
2 : y_buf[2] = $PRE.y_buf[2]
[
  -1.0 , 1.0 ;
  1.0 , -1.0
]
  *
[
  y_buf[2] ;
  $PRE.y_buf[2]
]
  =
[
  0.0 ;
  0.0
]
 might be structurally or numerically singular for variable $PRE.y_buf[2] since U(2,2) = 0.0. It might be hard to solve. Compilation continues anyway.

[359] 14:56:15 Symbolisch Warnung
The linear system: 
1 : $PRE.y_buf[1] = y_buf[1]
2 : y_buf[1] = $PRE.y_buf[1]
[
  -1.0 , 1.0 ;
  1.0 , -1.0
]
  *
[
  y_buf[1] ;
  $PRE.y_buf[1]
]
  =
[
  0.0 ;
  0.0
]
 might be structurally or numerically singular for variable $PRE.y_buf[1] since U(2,2) = 0.0. It might be hard to solve. Compilation continues anyway.

[360] 14:56:15 Übersetzung Warnung
Assuming fixed start value for the following 2 variables:
         y_buf[360]:DISCRETE(fixed = false )  type: Real  [360]
         iTick:DISCRETE(fixed = false )  type: Integer 

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

После долгих поисков, попыток и ошибок я обнаружил, что волшебное слово «дискретный» решает мою проблему! Я пока не могу объяснить почему, но смотри ниже рабочий пример:

model Test
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  discrete Real y_buf[N](start=fill(0,N), fixed=fill(true, N));


algorithm

when sample(0, 0.1) then     
  iTick :=iTick + 1;

  if iTick >= 1 and iTick <= N then
    y_buf[iTick] := iTick;
  end if;
end when;
end Test;

Надеюсь, это кому-нибудь поможет!

2 голосов
/ 09 июля 2019

Ваш "Symbolisch Warnung" исчезает после инициализации iTick и y_buf.Тем не менее, код по-прежнему не работает.OpenModelica имитирует его, но элементы y_buf никогда не обновляются.

Эта проблема может быть связана с этим вопросом, где оператор delay не работает в разделах алгоритма.Поэтому я предлагаю аналогичный обходной путь: старайтесь избегать раздела алгоритма.С разделом уравнения и правильной инициализацией ваш минимальный пример может выглядеть следующим образом:

block DFT
  import Modelica.Constants.pi;

  parameter Integer N = 360 "Total number of samples";

  Integer iTick(start=0, fixed=true);
  Real y_buf[N](start=fill(0, N), fixed=fill(true, N));

equation 

  when sample(0, 0.1) then
    iTick = pre(iTick) + 1;
  end when;

  for i in 1:N loop
    when iTick >= i then
      y_buf[i] =  iTick;
    end when;
  end for;

end DFT;
...