The two steps in scheduling an SDF graph are:
A ------> B ------> C 20 10 20 10When A executes, it produces 20 tokens. When B executes, it consumes 10 tokens and produces 20 tokens. When C executes, it consumes 10 tokens.
The repetitions vector is computed by the following linear-time algorithm :
For the SDF graph below,
--> A ------> B ----
| 4 20 10 20 |
| |
| |
----[4]---- C <----------
2 10
where [4] means a four-sample delay, a repetitions vector cannot be found.
If the firing rate for A is set to 1, then the firing rate of B would
be 2, and so the firing rate of C would be 4, and so the firing rate
of A should be 2, which it is not.
We can modify this graph as shown below to make it consistent:
--> A ------> B ----
| 4 20 10 20 |
| |
| |
----[4]---- C <----------
1 10
FileRead ------> Median ------> FileWrite
1 1 1 1
This is an example of homogeneous SDF:
-------- ----------- --------- --------
-->| filter |-->| down by 2 |-->| up by 2 |-->| filter |--
| -------- ----------- --------- -------- | 1
| 1 1 2 1 1 2 1 1 | -----
| ->| |
---| | + |-->
| ->| |
| | -----
| -------- ----------- --------- -------- | 1 1
-->| filter |-->| down by 2 |-->| up by 2 |-->| filter |--
-------- ----------- --------- --------
1 1 2 1 1 2 1 1
-----------
| first |
-->| polyphase |----
| | filter | |
1 | ----------- | 1
------------- | 1 1 | ------------
| |-- -->| |
--->| Distributor | | Commutator |--->
| |-- -->| |
------------- | ----------- | ------------
2 1 | | second | | 1 2
-->| polyphase |----
| filter |
-----------
1 1
FileRead ------> FFT ------> FileWrite
1 16 16 1
The Fast Fourier Transform takes N tokens as input and produces N tokens
as output.
Assuming that the tokens are scalars, the Fast Fourier Transform
implements the equation
N-1 2 Pi k n
--- - j --------
\ N
X[k] = | x[n] e for k = 0, 1, ..., N - 1
/
---
n=0
In the above diagram, even though the system does not change sampling
rates, the load balancing produces a repetitions vector [16 1 16] that
seems as if the sampling rates are being changed.
---------------> Fork -------------> Add ---->
| ^
-------\ /--------
X
-------/ \--------
| v
-----> Scale --> Fork --- Negate --> Add ---->