void->void pipeline BeamFormer { int numChannels = 12; int numSamples = 1024; int numBeams = 4; int numCoarseFilterTaps = 64; int numFineFilterTaps = 64; int coarseDecimationRatio = 1; int fineDecimationRatio = 2; int numSegments = 1; int numPostDec1 = numSamples/coarseDecimationRatio; int numPostDec2 = numPostDec1/fineDecimationRatio; int mfSize = numSegments*numPostDec2; int pulseSize = numPostDec2/2; int predecPulseSize = pulseSize*coarseDecimationRatio*fineDecimationRatio; int targetBeam = numBeams/4; int targetSample = numSamples/4; int targetSamplePostDec = targetSample/coarseDecimationRatio/fineDecimationRatio; float dOverLambda = 0.5; float cfarThreshold = 0.95 * dOverLambda*numChannels* (0.5*pulseSize); add splitjoin { split roundrobin(0); for (int i=0; ifloat filter InputGenerate (int myChannel, int numberOfSamples, int tarBeam, int targetSample, float thresh) { int curSample; boolean holdsTarget; init { curSample = 0; holdsTarget = (tarBeam == myChannel); } work push 2 { if( holdsTarget && (curSample == targetSample) ) { push(sqrt(curSample*myChannel)); push(sqrt(curSample*myChannel)+1); } else { push(-sqrt(curSample*myChannel)); push(-(sqrt(curSample*myChannel)+1)); } curSample++; if (curSample >= numberOfSamples) { curSample = 0; } } } float->void filter FloatPrinter { work pop 1 { println ( pop() ); } } float->float filter BeamFirFilter (int numTaps, int inputLength, int decimationRatio) { float[numTaps] real_weight; float[numTaps] imag_weight; int numTapsMinusOne; float[numTaps] realBuffer; float[numTaps] imagBuffer; int count; int pos; init { int i; numTapsMinusOne = numTaps-1; pos = 0; for (int j=0; jfloat filter Decimator(int decimationFactor) { init {} work pop 2*decimationFactor push 2 { push(pop()); push(pop()); for (int i=1; ifloat filter CoarseBeamFirFilter (int numTaps, int inputLength, int decimationRatio) { float[numTaps] real_weight; float[numTaps] imag_weight; init { int i; for (int j=0; jfloat filter BeamForm (int myBeamId, int numChannels) { float[numChannels] real_weight; float[numChannels] imag_weight; init { for (int j=0; jfloat filter Magnitude { init {} work pop 2 push 1 { float f1 = pop(); float f2 = pop(); push (mag(f1, f2)); } float mag(float real, float imag) { return (float) sqrt(real*real + imag*imag); } } float->void filter Detector (int _myBeam, int numSamples, int targetBeam, int targetSample, float cfarThreshold) { int curSample; int myBeam; boolean holdsTarget; float thresh; init { curSample = 0; holdsTarget = (_myBeam == targetBeam); myBeam = _myBeam+1; thresh = 0.1; } work pop 1 { float inputVal = pop(); float outputVal; if(holdsTarget && targetSample == curSample) { if( !(inputVal >= thresh) ) { outputVal = 0; } else { outputVal = myBeam; } } else { if( !(inputVal >= thresh) ) { outputVal = 0; } else { outputVal = -myBeam; } } outputVal = inputVal; println (outputVal); curSample++; if( curSample >= numSamples ) curSample = 0; } }