float->float pipeline BandPassFilter (float rate, float low, float high, int taps) { add BPFCore(rate, low, high, taps); add Subtracter(); } float->float splitjoin BPFCore (float rate, float low, float high, int taps) { split duplicate; add LowPassFilter(rate, low, taps, 0); add LowPassFilter(rate, high, taps, 0); join roundrobin; } float->float filter Subtracter { work pop 2 push 1 { push(peek(1) - peek(0)); pop(); pop(); } } float->float filter LowPassFilter(float rate, float cutoff, int taps, int decimation) { float[taps] coeff; init { int i; float m = taps - 1; float w = 2 * pi * cutoff / rate; for (i = 0; i < taps; i++) { if (i - m/2 == 0) coeff[i] = w/pi; else coeff[i] = sin(w*(i-m/2)) / pi / (i-m/2) * (0.54 - 0.46 * cos(2*pi*i/m)); } } work pop 1+decimation push 1 peek taps { float sum = 0; for (int i = 0; i < taps; i++) sum += peek(i) * coeff[i]; push(sum); for (int i=0; ivoid pipeline BPFProgram { add FloatSource(); add BandPassFilter(250000000, 1000, 1200, 64); add FloatPrinter(); } void->float filter FloatSource { float x; init { x = 0; } work push 1 { push(x); x = x + 1.0; } } float->void filter FloatPrinter { work pop 1 { println(pop()); } }