[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Как делать битовый коррелятор - через XOR с подсчетом 1, или через обычные умножения с послед. суммированием - зависит от того, на чем Вы его хотите сделать и что хотите экономить.
Если экономить время вычисл. -на большинстве DSP (если не на всех)
быстрее ,да и удобнее, мне кажется, через умножения. Вх. биты - в слова, можно в 2-х вариантах.
1. Бит = 1 - слово=1, бит=0 - слово=-1. Далее сумма произведений, как уже писали.
2. Бит = 1 - слово=1, бит=0 - слово=0. Далее тоже сумма произведений,
но затем сумма удваивается и из нее вычитается длина опорной последовательности. В этом случае рез-т совпадет с 1. Если удвоение и вычитание не делать - рез-т будет смещен.
Если экономить память - лучше иметь дело с битами, XOR-ть их с опорной последовательностью и считать число 1 после XOR. Далее, как в 2., полученное число удвоить и вычесть длину опоры.
Естественно, необходим сдвиг уже принятых бит с поступлением каждого нового бита.
Но работать с длинными (больше длины слова) битовыми потоками в DSP неудобно - и многословный сдвиг вещь неприятная и подсчет числа 1 тоже. Если все таки решите - могу предложить алгоритм довольно быстрого подсчета 1. На примере 16-р. слова (a la C, для простоты):
1. unsigned int temp=inp_wrd & 0xAAAA; // inp_wrd -вх. слово.
2. temp>>=1;
3. inp_wrd&=0x5555;
4. inp_wrd+=temp; //1-4 - 1-я ступень.
5. temp=inp_wrd&0xCCCC;
6. temp>>=2;
7. inp_wrd&=0x3333;
8. inp_wrd+=temp; //5-8 -2-я
9. temp=inp_wrd&0xF0F0;
10.temp>>=4;
11.inp_wrd&=0x0F0F;
12. inp_wrd+=temp; //9-12 - 3-я
13.temp=inp_wrd&0xFF00;
14. temp>>=8;
15. inp_wrd&=0xFF;
16. inp_wrd+=temp; //последняя, результат в inp_wrd.
При наличии операции косого сдвига выполняется довольно быстро.
Очевидно - легко расширяется до большей разрядности.
Число ступеней =LOG2(SIZE OF WORD).
Есть и другие алгоритмы, у этого особенность - выполняется одно и тоже время независимо от вх. данных. Иногда это важно.
E-mail: info@telesys.ru