123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #include "set_sign.h"
- const char set_sign_id[] = "@(#)$Id $" set_sign_h;
- #include "typedef.h"
- #include "basic_op.h"
- #include "count.h"
- #include "inv_sqrt_ex.h"
- #include "cnst.h"
-
- void set_sign(Word16 dn[],
- Word16 sign[],
- Word16 dn2[],
- Word16 n
- )
- {
- Word16 i, j, k;
- Word16 val, min;
- Word16 pos = 0;
-
-
-
- for (i = 0; i < L_CODE; i++) {
- val = dn[i]; move16 ();
-
- test ();
- if (val >= 0) {
- sign[i] = 32767; move16 ();
- } else {
- sign[i] = -32767; move16 ();
- val = negate_ex(val);
- }
- dn[i] = val; move16 ();
- dn2[i] = val; move16 ();
- }
-
-
-
- for (i = 0; i < NB_TRACK; i++)
- {
- for (k = 0; k < (8-n); k++)
- {
- min = 0x7fff; move16 ();
- for (j = i; j < L_CODE; j += STEP)
- {
- test (); move16 ();
- if (dn2[j] >= 0)
- {
- val = sub_ex(dn2[j], min);
- test ();
- if (val < 0)
- {
- min = dn2[j]; move16 ();
- pos = j; move16 ();
- }
- }
- }
- dn2[pos] = -1; move16 ();
- }
- }
-
- return;
- }
- void set_sign12k2 (
- Word16 dn[],
- Word16 cn[],
- Word16 sign[],
- Word16 pos_max[],
- Word16 nb_track,
- Word16 ipos[],
- Word16 step
- )
- {
- Word16 i, j;
- Word16 val, cor, k_cn, k_dn, max, max_of_all;
- Word16 pos = 0;
- Word16 en[L_CODE];
- Word32 s;
-
-
-
- s = 256; move32 ();
- for (i = 0; i < L_CODE; i++)
- {
- s = L_mac_ex (s, cn[i], cn[i]);
- }
- s = Inv_sqrt_ex (s); move32 ();
- k_cn = extract_h_ex (L_shl_ex (s, 5));
-
- s = 256; move32 ();
- for (i = 0; i < L_CODE; i++)
- {
- s = L_mac_ex (s, dn[i], dn[i]);
- }
- s = Inv_sqrt_ex (s); move32 ();
- k_dn = extract_h_ex (L_shl_ex (s, 5));
-
- for (i = 0; i < L_CODE; i++)
- {
- val = dn[i]; move16 ();
- cor = round_ex (L_shl_ex (L_mac_ex (L_mult_ex (k_cn, cn[i]), k_dn, val), 10));
-
- test ();
- if (cor >= 0)
- {
- sign[i] = 32767; move16 ();
- }
- else
- {
- sign[i] = -32767; move16 ();
- cor = negate_ex (cor);
- val = negate_ex (val);
- }
-
- dn[i] = val; move16 ();
- en[i] = cor; move16 ();
- }
-
- max_of_all = -1; move16 ();
- for (i = 0; i < nb_track; i++)
- {
- max = -1; move16 ();
-
- for (j = i; j < L_CODE; j += step)
- {
- cor = en[j]; move16 ();
- val = sub_ex (cor, max);
- test ();
- if (val > 0)
- {
- max = cor; move16 ();
- pos = j; move16 ();
- }
- }
-
- pos_max[i] = pos; move16 ();
- val = sub_ex (max, max_of_all);
- test ();
- if (val > 0)
- {
- max_of_all = max; move16 ();
-
- ipos[0] = i; move16 ();
- }
- }
-
-
-
- pos = ipos[0]; move16 ();
- ipos[nb_track] = pos; move16 ();
-
- for (i = 1; i < nb_track; i++)
- {
- pos = add_ex (pos, 1);
- test ();
- if (sub_ex (pos, nb_track) >= 0)
- {
- pos = 0; move16 ();
- }
- ipos[i] = pos; move16 ();
- ipos[add_ex(i, nb_track)] = pos; move16 ();
- }
- }
|