微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > 学习LabVIEW(十二)——公式节点

学习LabVIEW(十二)——公式节点

时间:01-09 来源:互联网 点击:
除了MATLAB节点,LabVIEW还提供了公式节点。在公式节点中可以用非常接近C的语法编写代码实现计算。之所以说是“非常接近C”是因为在一些细节上它和C还是有些许差别。
这次拿之前在《学习LabVIEW(八)——用循环处理数组》中给出的代码做实验,将最内层的循环改用公式节点来实现。之前的最内层循环如下图所示:


其实现的运算相当于:
z = 0
for k in range(128):
z = z * z input;
if abs(z) > 2:
break

还没有习惯G语言的时候看到这个框图还真是一眼难以看出运算的表达式。对于常年使用文本形式的编程语言的人而言,用公式节点改写这个迭代过程的话一定会直观很多吧。
但是一旦用起来才发现一个严重的问题:公式节点不支持复数!想来也在意料之中,毕竟是基于C的语法,而C在C99标准之前没有内置的复数支持。也许对复数的支持是未来语言的趋势,已经有越来越多的语言或是内置,或是以库的方式提供了对复数的支持。但不管怎么样,我们现在用的公式节点是没有复数支持的,如http://digital.ni.com/public.nsf/allkb/9A31DC2FF5C7C5DF86256B45007AA115所述。如果用极坐标的方式描述复数,我们就得手动展开复数的加法,如果用直角坐标的形式描述,就得手动展开复数的乘法。想想还是用直角坐标的形式吧。
一开始写了如下的一段代码,可是运行怎么也不对:


复数的展开怎么看也没有错误啊。
最后在MATLAB中试着算了一下,终于发现出问题的地方了:在for循环内部,将实部的计算结果赋值给了zReal,在下一行计算zImag时,用的zReal就已经是新的zReal值了,而这里所需要的是上一次的zReal值。居然会犯这种错误,难道是很多年前写Verilog代码的后遗症?
解决方法很简单,在第一行计算实部的时候,将计算结果保存在另一个变量temp中,等zImag计算完成之后,再将temp中存储的值赋给zReal。修正的程序如下图所示:


还有一点需要注意的就是公式节点似乎没有“double”,取而代之的是“float64”。
总结一下感想,公式节点不支持复数,Array Programming也不及MATLAB,对其描述能力有点失望。但因为不用像MATLAB节点那样通过ActiveX通道进行进程间的通信,效率应该还是可以的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top