我正在尝试自己实现DFT,因为OpenModelica中的FFT示例对我不起作用,我也不知道为什么。 但是我已经困住了对正弦函数采样并将采样值分配给缓冲区数组的麻烦。 这就是为什么我试图使其更简单,并且只将一个计数器变量“ 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
答案 0 :(得分:3)
经过长时间的搜索和尝试并发现错误,我发现神奇的单词“ discrete”解决了我的问题!我尚无法解释原因,但请参见下面的工作示例:
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;
希望这对某人有所帮助!
答案 1 :(得分:2)
初始化iTick
和y_buf
后,“ Symbolisch Warnung”将消失。但是,该代码仍然无法正常工作。 OpenModelica模拟了它,但是y_buf
的项目从未更新。
此问题可能与delay
运算符在算法部分中不起作用的this问题有关。因此,我建议采取类似的解决方法:尽量避免使用算法部分。通过方程式部分和正确的初始化,您的最小示例如下所示:
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;