#include "block.h" class BarkerSequenceCorrelator : public Block { private: InPort < bool > * in; OutPort < bool > * out; Parameter < long > * thresholdPar; long threshold; Parameter < long > * NPar; long N; bool delayline[13]; long currentIdx; public: BarkerSequenceCorrelator(const Blockopt & blockopt): Block(blockopt) {} void makeParameters() { thresholdPar = new Parameter < long > (this, "threshold", 0); NPar = new Parameter < long > (this, "N", 7); } void makeIOPorts() { in = new InPort < bool > (this, "in", 1); out = new OutPort < bool > (this, "out", 1); } void initialize() { threshold=thresholdPar->value(); N=NPar->value(); if ((3!=N) && (4!=N) && (5!=N) && (7!=N) && (11!=N) && (13!=N)) simend("unknown code length"); for (long i=0;i<13;i++) { delayline[i]=false; } currentIdx=0; // newest symbol always at position "currentIdx" } void go() { currentIdx=(currentIdx+1)%N; delayline[currentIdx]=in->read(); long hammingDistance=N; switch(N) { case 3: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; break; case 4: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+3 +N)%N ]) hammingDistance--; break; case 5: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+3 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+4 +N)%N ]) hammingDistance--; break; case 7: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+3 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+4 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+5 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+6 +N)%N ]) hammingDistance--; break; case 11: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+3 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+4 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+5 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+6 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+7 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+8 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+9 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+10 +N)%N ]) hammingDistance--; break; case 13: if (true == delayline[(currentIdx-(N-1)+0 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+1 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+2 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+3 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+4 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+5 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+6 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+7 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+8 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+9 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+10 +N)%N ]) hammingDistance--; if (false == delayline[(currentIdx-(N-1)+11 +N)%N ]) hammingDistance--; if (true == delayline[(currentIdx-(N-1)+12 +N)%N ]) hammingDistance--; break; } if (hammingDistance<=threshold) { out->write(true); } else { out->write(false); } } }; PUBLISH(BarkerSequenceCorrelator);