本节书摘来自华章出版社《信息物理融合系统(cps)设计、建模与仿真——基于 ptolemy ii 平台》一书中的第3章,第3.1节,作者:[美]爱德华·阿什福德·李(edward ashford lee),更多章节内容可以访问云栖社区“华章计算机”公众号查看
本文第二部分主要介绍一些常用于系统设计、建模和仿真的计算模型。虽然不是一个很全面的集合,但也是一个比较有代表性的集合。这里提到的计算模型(model of computation,moc)是相对成熟、容易理解并完全可以实现的计算模型。这些计算模型在ptolemy ii之外的工具上大部分也是可以实现的,但除ptolemy ii外没有工具可全部实现它们。
ptolemy ii 能够使异构系统的开发和仿真一同进行,将开发和仿真作为整个系统建模的一部分。正如前两章讨论的那样,不同于其他设计和建模环境,ptolemy ii的一个关键创新在于支持多种计算模型,这些计算模型可被剪裁以适应具体的建模问题。这些计算模型定义模型的行为,计算模型的种类由模型中使用的指示器决定。在ptolemy ii的术语中,指示器实现了一个域,这是对计算模型的实现。因此,监视器、域和计算模型就被绑定在一起。比如说,当构建一个包含sdf指示器(一种同步数据流指示器)的模型时,实际上已经通过sdf计算模型建立了一个“sdf域”模型。
本章对当前ptolemy ii中的可用数据流域(dataflow domain)进行描述,其包含同步(静态)数据流模型和动态数据流模型。数据流域适用于那些涉及数据值流处理的应用,这些数据值流在一系列角色间流动,角色以一定的方式进行数据值流的转化。这些模型通常叫作管道和滤波器(pipe and filter)模型,因为角色之间的连接类似于承载流的管道,并且角色就像对这些流做了一些改变的滤波器。数据流域几乎是忽略时间的,尽管同步数据流(sdf)有能力在迭代之间建立有均匀时间间隔的流模型。后续的章节将讨论其他的域,以及其选择和使用。
同步数据流(synchronous dataflow,sdf)域,也称为静态数据流(static dataflow),由lee and messerschmitt(1987b)提出,是ptolemy ii最先开发的域(或者计算模型)之一。它是数据流模型的一种特殊类型。在数据流模型中,当角色需要的数据输入并可用时,角色开始执行(其被点火)。sdf是一种相对简单的数据流,角色的执行顺序是静态的,不依赖被处理的数据(令牌的值在角色之间传递)。
在一个同构sdf(homogeneous sdf)模型中,当角色的每一个输入端口都有令牌时,角色被点火,并在每一个输出端口产生一个令牌。在这种情况下,指示器仅需确保当角色获得数据后再点火,并且模型中的一次迭代包含每个角色的一次点火。第2章的大多数例子就是同构sdf模型。
然而不是所有的角色每次点火都只会产生和消耗一个令牌,某些角色在它们点火前需要多个输入令牌并产生多个输出令牌。负责决定角色执行顺序的sdf调度程序支持比同构sdf更复杂的模型。只要指定每个端口上的每个角色点火所产生和消耗的令牌数量来给出这些速率,sdf调度器就能够对任意数据速率角色的执行进行调度。
例3.1 有些角色需要多个输入令牌才能点火,spectrum角色就是这样一个例子。如图3-1所示为一个可以计算带噪声正弦波的频谱的系统,该系统与图2-20中构造的相同。spectrum角色有一个单独的参数,用来指定快速傅里叶变换(fft)的采样点位数(order)。快速傅里叶变换用来进行频谱的计算。如图3-1显示了order设置为8以及迭代次数设置为1的模型的输出(见17.2节)。

图3-1 一个多速率sdf模型。spectrum角色需要256个令牌才能点火,所以这个模型的迭代需要256个sinewave、channel、sequenceplotter firings角色的点火以及一次spectrum角色的点火
当order参数设置为8时,spectrum角色的点火需要28(256)个输入样本,并产生28个输出样本。为了使spectrum角色点火一次,为它提供输入数据的sinewave和channel角色必须各自点火256次。sdf指示器提取该关系,并定义模型的一个迭代由sinewave、channel、sequenceplotter角色的256个点火行为和spectrum角色的一个点火行为组成。
这个例子实现了一个多速率(multirate)模型,即角色的点火速率并不是完全相同的。特别是,spectrum角色的执行速率比其他角色慢。对于多速率模型的执行,有且只有一次迭代是很常见的。在下一节,指示器将使用平衡方程来决定每次迭代中各个角色的点火次数。
3.1.1 平衡方程
考虑a和b两个角色之间的单一连接,如图3-2所示。图中符号表示当a点火时,它在输出端产生m个令牌,当b点之火时,它在输入端消耗n个令牌。m和n是非负整数。a点火qa次,b点火qb次。
当且仅当满足下面的平衡方程时,a所产生的令牌才能都被b消耗掉,
qam = qbn(3-1)
给定的qa和qb满足式(3-1)时,系统保持平衡,即a产生的令牌与b消耗的令牌数量一样。
假设希望能处理任意数量的令牌,典型的流应用就是此类情况。一个简单的策略是点火角色aqa次(qa为任意大的数)并点火角色bqb次,其中qa和qb满足式(3-1)。然而,该策略是一个低级策略,因为它需要在一个缓冲区中存储一个任意大数量的未消耗令牌。一个较优的策略是求出满足式(3-1)的最小正整数qa和qb。然后建立一个调度表,点火角色aqa次,角色bqb次,并且也可以多次重复调度,而不需要更大的存储空间来存储未消耗的令牌。也就是说,可以在有界缓冲区(bounded buffer)(缓冲区中未消耗的令牌数量有限)内完成无限的执行(unbounded execution)(处理任意数量令牌的执行)。在每轮调度(被称为一次迭代)中,角色b消耗的令牌数量与角色a产生的令牌数量恰好一致。
例3.2 假设在图3-2中,m = 2,n = 3。这里有多种可能解来匹配平衡方程,其中一种是qa=3和qb=2。根据这些值,可以重复以下调度:
a, a, a, b, b
另一个调度也可以使用:
a, a, b, a, b
事实上,后面这种调度有一个优势,它用来存储中间令牌的存储器更少。一旦有足够的令牌b就会点火,而不是等待a完成整个循环。
式(3-1)的另一组解是qa = 6和qb = 4。与上一个使系统保持严格平衡的解相比,这组解包含了更多次的点火行为。
qa = 0和qb = 0也满足式(3-1),但是如果角色点火的数量是零,就会无法完成工作。显然,这不是想要的解,负的解也是毫无意义的。
在默认情况下,sdf指示器为平衡方程求最小的正整数解,并且依据该组解构建调度表,使模型中的角色保持应有的点火次数。对于一个执行序列,若每个角色的点火次数都与方程解出的结果完全一致,则称为一次完整迭代(complete iteration)。
在更复杂的sdf模型中,每个角色之间的连接都会导致一个平衡方程。因此,模型定义一个方程组并求最小正整数解是重要的。
例3.3 图3-3展示了一个由3个sdf角色组成的网络。这些连接产生了如下平衡方程组:
qa = qb
2qb = qc
2qa = qc
这些方程的最小正整数解是:qa = qb = 1,qc = 2,所以下面的调度可以一直重复从而得到一个有界缓冲区内无限执行的情况:
a, b, c, c
平衡方程并不是总有非零解,如下所述。
例3.4 图3-4显示了一个有3个sdf角色的网络,其平衡方程的唯一解是一个无效解,qa = qb = qc = 0。结果就是,对于该模型来说,没有可以在有界缓冲区进行无限执行的可能。即它不能保持平衡。
拥有平衡方程非零解的sdf模型称为一致的(consistent)。如果唯一解是零解,那么它是不一致的(inconsistent)。一个不一致的模型不存在在有界缓冲区进行无限执行的情况。
lee and messerschmitt (1987b)说明如果平衡方程有非零解,那么它也总有一个对于所有的角色i,qi都是非负整数的解。此外,对于连接模型(其中任意两个角色之间都有通信路径),他们给出了求最小正整数解的过程。该过程形成了sdf模型调度器的基础。
例3.5 图3-5显示了一个sdf模型,它大量使用了sdf的多速率功能。模型在机器上运行,audiocapture角色从机器的麦克风中捕获声音,在每秒8000次采样的默认速率下产生一系列样本。chop角色从包含500个样本的输入块中提取128个样本块(见3.1.3节补充阅读)。spectrum角色计算功率谱,得到功率随着频率变化的情况,即功率是频率的函数。两个sequencetoarray角色构造数组,然后arrayplotter角色将数组用图形表示(见第17章)。图中两个特殊点是对哨声的响应。注意,频谱的峰值约出现在1700hz
和-1700hz处。
模型中的sdf指示器计算出每点火一次chop、spectrum、sequencetoarray和绘图仪都需要点火audiocapture角色500次。
图3-5 该模型从麦克风中获取声音信号并计算其功率谱。此图展示了一个频率大约为1700hz的哨声功率谱
补充阅读:sdf调度器
使用sdf的一个关键优势是,对于包含一些并行执行角色的给定模型),有多种可能的调度。在这种情况下,数据流图中的角色可以被映射到多核结构或者分布式体系结构中不同的处理器中以便提高性能。lee and messerschmitt (1987a)通过把sdf图转换为一个无环优先图(apg),将一些经典作业车间调度算法(coffman, 1976),特别是hu(1961)提出的那些算法,运用在sdf中。lee and ha(1989)将调度策略分为完全动态调度(fully dynamic scheduling)(所有调度决策在运行时完成)、静态分配调度(static assignment scheduling)(除了处理器分配的决策外其他所有决策都在运行时完成)、自定时调度(self-timed scheduling)(只有角色点火的时间安排在运行时决定)和完全静态调度(fully-static scheduling)(调度的每个方面都在运行时前完成)。sih and lee (1993a)对作业车间调度技术进行了解释,用以说明解释处理器之间的通信开销(见 sih and lee (1993b))。pino et al. (1994)展示了如何构建异构多处理器的调度。falk et al.(2008)给出了一个基于聚类的并行调度策略,并说明了该策略在多媒体应用中可带来显著的性能提升。
除了并行调度策略外,其他的调度优化也很有用(见bhattacharyya et al.(1996b))。ha and lee (1991)放松了sdf的限制,允许数据依赖的角色迭代点火(一种称为准静态调度(quasi-static scheduling)的技术)。bhattacharyya and lee(1993)为角色迭代调用提出优化调度策略(也见bhattacharyya et al. (1996a))。bhat-tacharyya et al.(1993)提出的优化调度主要减少对内存的使用,随后并将这些优化应用到嵌入式处理器的代码生成中(bhattacharyya et al.,1995)。murthy and bhattacharyya (2006)收集通过调度和缓冲区共享来最小化内存使用的算法。geilen et al.(2005)的研究表明,模型检测技术可以用于内存优化。stuijk et al. (2008)探究吞吐量与缓冲之间的折中(见moreira et al. (2010))。sriram and bhattacharyya (2009)开发了减少并行sdf中同步操作数量的调优化度。同步确保一个角色在它接收需要点火的数据前不会被点火,然而,如果一个之前的同步已经确保数据准时到达,那么该同步就不需要了。通过操作调度,可以减少所需同步点的数量。
补充阅读:频率分析
sdf域对信号处理特别有效。信号分析的一种基本操作方式是将时域信号转换成频域信号,反之亦然(见lee and varaiya(2011))。支持这一操作的角色可以在actors→ signalprocessing →spectrum库中找到,如下所示。
fft和ifft利用快速傅里叶变换算法对一个信号分别进行离散傅里叶变换(dft)和逆变换。order参数用于指定每个fft计算的输入令牌数。它是“基2”算法,这意味着需要的令牌数是2的幂,且order参数指定指数的值。比如,如果order=10,那么用于每个点火的输入令牌数就是210=1024。剩下的角色可实现多种频谱估计算法,它们都是使用fft作为组件的复合角色。这些算法以分贝(db)为单位输出信号功率,作为频率的函数。输出频率范围为-fn~fn,
其中fn是奈奎斯特频率(采样频率的一半)。也就是说,最先输出的一半代表负频率,余下的一半代表正频率。
spectrum是最简单的谱估计器。它计算输入信号的fft,并将结果转换为以分贝计量的功率。
smoothedperiodogram通过首先估计输入的自相关性来计算功率谱。该方法对输入进行平均,并且对噪声不敏感。
maximumentropyspectrum是一个参数谱估计器。它使用levinson-durbin算法构造回归(ar)模型的参数,该模型能合理地产生输入信号。然后选择最大化熵的模式(见kay (1988))。它是最复杂的谱估计器,通常产生最平滑的估计。
如图3-6所示为3个谱估计器输出的比较,其中输入由3个含噪声的正弦曲线组成。为一个应用选择正确的谱估计器是个复杂的主题,超出了本书的范围。
图3-6 spectrum、smootheperiodogram和maximumentropyspectrum谱估计技术的比较
3.1.2 反馈回路
在sdf中,一个反馈回路必须至少包含一个sampledelay角色的实例(在flowcontrol→
sequencecontrol子库中)。若没有该角色,回路将产生死锁(deadlock),即反馈回路中的角色将无法点火,因为它们依赖彼此的令牌。sampledelay角色通过在模型开始点火前在它的输出端产生初始令牌来解决这一问题。初始令牌通过initialoutputs参数来指定,该参数定义了一个令牌数组。这些初始令牌能使下游角色点火,并打破无初始令牌时将在反馈回路中的循环依赖。
例3.6 如图3-7中所示的模型。为一个同构sdf模型,其使用反馈回路产生一个计数序列。sampledelay角色通过在它的输出能产生一个值为0的令牌来开始该过程。这个令牌与从const角色来的一个令牌一起,能使addsubtract角色点火。该角色的输出能使下一个sampledelay点火。在初始点火之后,sampledelay角色将输入无修改地复制到输出。输入到它的输出不变。
图3-7 带反馈回路的sdf模型其中必须至少有一个sampledelay角色的实例
一致性对保证缓存区有界是充分条件,但是并不足以保证一个模型的无限执行。即使模型是一致的,它也可能产生死锁。sdf指示器分析模型的一致性和死锁。为了允许反馈,它对待延时角色(delay actor)与其他角色不同。延时角色在它接收到输入令牌之前能够产生初始输出令牌。它之后的行为与普通的sdf角色类似,在每次点火时消耗与产生固定数量的令牌。在sdf域中,初始令牌理解为执行的初始条件,而不是执行本身的一部分。因此,调度器将保证在sdf执行开始前产生所有的初始令牌。从概念上,sampledelay角色可以被放在反馈连接上的初始令牌代替。
例3.7 如图3-8所示为一个在反馈回路上有初始令牌的sdf模型,平衡方程为:
3qa = 2qb
2qb = 2qa
最小正整数解存在,是:qa=2、qb=3,因此模型是一致的。如图3-8所示,在反馈连接上有4个初始令牌,下面的调度可以一直迭代
a, b, a, b, b
这个调度从角色a开始,因为在执行的开始;仅有角色a可以点火,因为角色b没有足够的令牌。当a点火时,它从4个初始令牌中消耗3个令牌,留下1个令牌。它传送3个令牌给b。此时,仅有b可以点火,消耗由a发送来的3个令牌中的2个。并且又提供2个令牌给它的输出。此时,角色a可以再次点火,因为它的输入端有3个令牌。它将消耗所有令牌并产生3个令牌。在此,b在它的输入拥有4个令牌,能够点火2次。在那2次点火之后,2个角色都已经点火了必要的次数,并且反馈缓冲区再一次拥有了4个令牌。调度由此将数据流图返回到它的初始情况。
然而,若在反馈路径上的初始令牌少于4个,模型就会死锁。例如,如果只有3个令牌,那么a可以在b之后点火,但是不会有足够的输入令牌使其再次点火。
lee and messerschmitt (1987b) 讨论了求解平衡方程的过程,还讨论了一个要么为无限执行提供调度,要么证明这样的调度不存在的过程。通过这些过程,sdf模型的有界缓冲区和死锁就可解决 (这意味着,ptolemy可以确定在任何sdf模型中是否会发生死锁或者存在无界缓冲区)。
3.1.3 数据流模型中的时间
到目前为止,在已示的sdf例子中,使用了sequenceplotter角色,而不是timedplotter角色(见第17章)。这是因为sdf域通常不使用其模型中的时间概念。在默认情况下,时间不会随着sdf模型的执行而推进(即使sdf指示器确实包含了一个称为period的参数,该参数可以通过在模型的每次迭代中的一个固定量来推进时间)。因此,在大多数的sdf模型中,timedplotter角色显示的时间轴通常等于零。相比之下,sequenceplotter角色进行一个非基于时间值序列的描述,因此经常用于sdf模型。在第7章和第9章中讨论的离散事件和连续域包含了大量的更强的时间概念,因此经常使用timeplotter。
补充阅读:多速率数据流角色
ptolemy ii的库提供了一些产生“与/或”的角色,它们在每点火一次需要消耗多个令牌。最基本的一些如下所示:
commutator和distributor在flowcontrol→aggregators子库中,将来自多个信号的令牌转换为一个令牌序列,反之亦然。commutator有一个多重端口输入,在每次点火时,它从每个输入通道中读取固定数量的令牌(由其blocksize参数给出),并把所有来自输入通道的令牌输出为一个序列。distributor则为其逆过程。
downsample和upsample位于signalprocessing→filtering中,丢弃或者插入令牌。downsample 读取固定数量的令牌(由它的factor参数给出),并输出其中一个令牌(由phase参数选择)。upsample在输入令牌之间插入固定数量的零值令牌。
repeat位于flowcontrol→sequencecontrol中,除了用迭代方式输入令牌代替插入零值令牌外,其他方面类似于upsample。
arraytosequence和sequencetoarray位于array库中,将数组令牌转换为一个令牌序列,反之亦然。两个角色都有一个arraylength参数,它指定传入(或传出)数组的长度。arraytosequence 也有一个enforcearraylength参数,如果其设置为真,将导致在接收到一个错误长度的数组时角色将产生一个错误信息。在sequencetoarray中,arraylength是端口参数(portparameter,)因此读取的输入令牌数量可以不同。仅当数组长度为常数时,这些角色是sdf角色。
chop,在flowcontrol→sequencecontrol中,读取指定数量的输入令牌并产生这些输入的特定子集,可以用零值令牌或者以前消耗的令牌填充。
补充阅读:信号处理角色
除了前文描述的频谱分析角色,ptolemy ii还包含了其他几个信号处理角色,如下所示。
iir 实现无限脉冲响应滤波器,也称为递归滤波器(见lee and varaiya(2011))。滤波器系数由两个数组提供,一个提供传输函数的分子多项式,一个提供传输函数的分母多项式。
fir实现有限脉冲响应滤波器,也称为抽头延迟线滤波器,它的系数由taps参数来指定。而iir是同构sdf(单速率)角色,fir是内在的多速率角色。当decimation(interpolation)参数不等于1时,滤波器的行为就好像在使用downsample(upsample)角色之后(之前)。然而,该实现比使用upsample或downsample角色实现会更高效,内部使用了多相结构,避免了不必要的内存使用和乘零操作。用这种方法通过合理的因素可以完成对任意样本速率的转换。
delayline产生一个数组而不是像fir那样产生一个标量。delayline 不输出加权平均延迟线的内容(这是fir产生的),而是仅仅简单地输出延迟线为一个数组。
variablefir与fir相同,除了系数是由输入端口(因此可以改变)的数组提供而不是由角色参数来定义外。
lmsadaptive类似于fir,除了在每次点火时使用梯度下降自适应滤波算法来调整系数外,该算法试图在错误的(error)输入端口将信号的功率最小化。
除了这里描述的角色外,信号处理(signal processing)库还包括固定点(?xed)和自适应格型(lattice)滤波器、统计分析角色等、通信系统的角色(如源和通道编码器与解码器)音频采集和回放、图像和视频处理角色等。
补充阅读:动态变化速率
sdf的变体,称为参数化的sdf(psdf),由bhattacharya and bhattacharyya (2000)提出,它端口的产生速率和消耗速率是由参数给出,而不是常数。参数的值允许改变,但仅仅是在两次完整的迭代之间改变。当这个参数的值改变时,新的调度必须用于下一次完整的迭代。
图3-9中的例子说明如何用ptolemy ii中的sdf指示器实现psdf。首先,注意指示器的allowratechanges参数已经设置为真。这表明指示器可能需要计算不止一个调度,因此在执行模型期间(rate)速率参数可能改变。
其次,注意repeat角色的numberoftimes参数设置为与模型参数rate相等,其初始值为零。因此,当模型执行它的第一次迭代时,repeat角色将产生零个令牌,因此display角色不会点火。ramp角色的初始输出为1,将不会被显示。
在第一次迭代期间,expression和setvariable角色都只点火一次。expression 角色设置它的输出等于输入,除非它的输入等于interations(迭代)参数(它没在这个首次迭代中)的值。 setvariable角色设置rate参数的值为1。在默认情况下,setvariable有一个delayed参数的值为真,这意味着只有在当前迭代完成之后rate参数才能改变。
在第二次迭代中,rate参数的值是1,因此repeat角色复制一次它的输入(值为2)给输出。expression和setvariable 角色把现在的rate参数设置为2,因此在第三次迭代中,repeat角色复制它的输入(有值为3)两次给它的输出。因此显示的输出序列为2,3,3,4,4,4...。
为了终止模型,指示器的iterations参数设置为5。在最后一次执行迭代中,expression角色保证rate参数重置为0。因此,在下一次模型执行时,它将会随着rate参数设置为0重新开始。
在这个例子中,每次rate参数变化,sdf指示器都会重新计算调度。在psdf更好的实现中,它在计算调度前预计算调度与缓存,但是这个实现做不到预计算与缓存。它仅仅在迭代之间重新计算调度。
图3-9 一个有动态变化速率的sdf模型
补充阅读:streamit
thies et al.(2002)给出一种基于sdf的文本程序语言——streamlt,该语言主要针对使用流数据的应用(如多媒体)。软件组件(称为滤波器而不是角色)产生和消耗固定数量数据。该语言为组成角色的常见模式提供紧凑的结构设计,如滤波器链、并行滤波器链和反馈回路等。
streamit中的一个关键创新是消息传递(teleport message)的概念(thies et al., 2005)。消息传递通过允许一个角色偶尔地发送一个消息给另一个角色来提高sdf的表达力。也就是说,不是每一个点火行为都发送消息,而是某些点火行为发送消息。尽管消息传递机制采用以下方式:当发送角色每次点火发出消息时,接收角色会产生同样的点火行为,确保该信息被接收。但是它避免了为每个点火行为发送消息的开销。这种方法建立了一个通信通道模型,其中令牌的产生和消耗不是总存在的而是偶尔存在的。但是它保留了sdf模型的确定性,任何有效调度执行的结果都相同。
补充阅读:其他数据流的变体
sdf的一个缺点是每个角色必须产生和消耗固定数量的数据。生产和消耗的速率不能取决于数据。ddf(3.2节)取消了这一限制,代价是不能再对点火进行静态调度。此外,正如前面章节中所讨论的,分析所有模型的死锁和有界缓冲区已经不再可能了(这些问题是不可判定的。但是,研究人员已经开发了大量的数据流变种,它们比sdf更富有表达力,但仍然服从某些静态分析的形式。
循环静态数据流(cyclo-static dataflow,csdf)允许产生和消耗的速率呈周期性变化(bilsen et al.,1996)。一个例子是singletokencommutator角色(在flowcontrol→
aggregators中)。这个角色类似于commutator角色,但是它不是在单次点火行为中消耗所有输入,而是一次点火仅消耗其中一个通道的输入,并且通过在连续点火行为中的输入通道旋转。对于每个输入通道,消耗速率在0和1之间交替。这个角色在反馈系统中很有用,其中第二通道的输入依赖于第一通道的输入。
sdf也可以分层地结合有限状态机(fsm)来创建模态模型,这将在第8章介绍。有限状态机的每个状态与子模型相关联(其中每个模型的细化都可以有不同的产生和消耗速率)。如果有限状态机的状态转换被限制为只发生在某些时刻,那么该模型仍然是确定的。这种结合由girault et al.(1999)提出,他称之为异步数据流(heterochronous dataflow,hdf)。sdf scenarios(geilen and stuijk, 2010)类似于hdf,因为它们也使用一个fsm,但不是模型细化,在sdf scenarios中有限状态机的每个状态与一组单一sdf模型的产生和消耗相关联。bhattacharya and bhattacharyya (2000)提出了参数化的sdf(psdf),其中产生和消耗速率可以依赖输入数据,同样的依赖关系可以在参数化的调度中表示。
murthy and lee (2002) 介绍了多维sdf(multidimensional sdf ,mdsdf)。mdsdf中的一个通道传递一个令牌的多维数组,而sdf中的一个通道传递一个令牌序列。也就是说,令牌的记录可以增加为多个维度。这个模型对表示确定种类的信号处理应用是很有效的,特别是图像处理、音频处理、雷达和声呐。
补充阅读:petri网络
petri网,以carl adam petri的名字命名,是一种流行的与数据流相关的建模形式(murata,1989)。它们有两种类型的元素,库所(place)和变迁(transition),分别用白色圆圈和矩形表示。一个库所可以包含任意数量的令牌,表示为黑色圆点。如果所有的库所都连接到变迁,则变迁将被使能,它的输入至少包含了一个令牌。
一旦变迁被使能,它可以被点火(fire),从每个输入的库所消耗一个令牌,并在每个输出库所存放一个令牌。网络的状态,称为标记(marking),是网络中的每个库所上令牌的数量。上图显示了一个在点火行为之前和之后的简单网络的标记。如果一个库所提供输入给不止一个变迁,那么库所的一个令牌可能触发其中的一个目标变迁的点火(非确定的一个或其他点火)。
petri网的变迁类似于数据流角色。当有足够的输入可用时它们将点火。在基本的petri网中,令牌没有值,变迁的点火行为并不涉及任何令牌的计算。点火行为仅仅扮演移动令牌从一个库所到另一个库所的角色。另外,与数据流缓冲区不同,库所不会维持令牌顺序。与同构sdf一样,变迁是通过每个输入库所上的令牌使能的。与sdf不同,一个库所可能供给了不止一个变迁,导致了模型的不确定性。
有很多petri网的变种,至少有一种与sdf等价。特别地,令牌可以拥有值(这些令牌在文献中被称为着色令牌(colored token),其中令牌的颜色代表它的值)。变迁可以操控令牌颜色(类似于数据流的点火功能)。连接库所和变迁的弧可以被加权,这意味着点火变迁需要多个令牌,或者一个变迁产生多个令牌。这类似于sdf的产生和消耗速率。最后,petri网图结构可以被约束,这样对于每个库所,都有一个明确的源变迁和一个明确的目的变迁。这种有保序库所的petri网是sdf图。
补充阅读:逻辑角色
这些角色可以在logic库中找到,它们对建立控制逻辑很有帮助:
comparator角色比较两个double类型的值(或者任何可以无损地转换成double的类型,如第14章所解释的那样)。可用的比较操作是>、>=、<、<=和==。输出为布尔值。
equals角色比较任意数量的任意类型输入令牌的相等性,如果它们相等,则输出一个布尔真值,否则输出假。
ispresent角色:如果它的输入在点火时到达,则输出布尔真值,否则输出假。在数据流域,输入总是会到达,因此输出总是为真。这个角色在sr和de域会更有用(第5章和第7章)。
logicalnot接收一个输入布尔值并输出该布尔值的相反值。
logicgate实现以下6个逻辑功能(不同的逻辑功能对应不同的图标):
truegate角色:当输入为布尔真值时,它产生一个布尔真值输出;否则,它不产生任何令牌。这很明显不是sdf角色,但它可以与ddf一起使用。它在sr中同样有用(第5章)。