Marsel 0 14 мая, 2022 Опубликовано 14 мая, 2022 (изменено) · Жалоба Доброго времени суток, уважаемые знатоки. Столкнулся с проблемой написания программного модуля, который осуществлял бы демодуляцию сигналов данного стандарта. Насколько я разобрался, то проблема заключается в первичной и вторичной синхронизациях, они же синхрокоды. Если первичная прописывается в явном виде что она из себя представляет, то со вторичной возникают проблемы, ибо непонятно каким образом происходит "нарезка" вторичных синхрокодов из общей длины кодов Голда. Благодарен за внимание. Изменено 14 мая, 2022 пользователем Marsel Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stealth-coder 2 20 мая, 2022 Опубликовано 20 мая, 2022 · Жалоба static const i32 z[] = { 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, 1, }; int run_ssc(const Iq16 *iq, unsigned pos, unsigned samples_per_chip, unsigned *scg, unsigned *slot) { unsigned i, j, max_pos; u64 max, ssc_seq = 0; Iq32 ssc[SSC_LEN]; for (i = 0; i < SLOTS_PER_FRAME; ++i) { for (j = 0; j < SSC_LEN; ++j) { const Iq16 *v = &iq[pos + j * samples_per_chip]; // Комплексно-сопряженное умножение ssc[j].re = z[j] * ((i32)v->re + (i32)v->im); ssc[j].im = z[j] * ((i32)v->im - (i32)v->re); } fast_walsh_hadamard_transform_256(ssc); max = 0; for (j = 0; j < SSC_COUNT; ++j) { Iq32 *v = &ssc[16 * j]; u64 a = (i64)v->re * (i64)v->re + (i64)v->im * (i64)v->im; if (a > max) { max = a; max_pos = j; } } ssc_seq = (ssc_seq << 4) | (u64)max_pos; pos += SSC_PERIOD * samples_per_chip; } return (define_scr_code_group(ssc_seq, scg, slot) >= SSC_THRESHOLD); } static void add_iq32(const Iq32 *src1, const Iq32 *src2, Iq32 *dst) { dst->re = src1->re + src2->re; dst->im = src1->im + src2->im; } static void sub_iq32(const Iq32 *src1, const Iq32 *src2, Iq32 *dst) { dst->re = src1->re - src2->re; dst->im = src1->im - src2->im; } static void swap_iq32_ptr(Iq32 **p1, Iq32 **p2) { Iq32 *t = *p1; *p1 = *p2; *p2 = t; } static void fast_walsh_hadamard_transform_256(Iq32 *iq) { Iq32 tmp[256]; Iq32 *ping = iq; Iq32 *pong = tmp; unsigned i, j, k, js, ks; js = 2; ks = 1; for (i = 0; i < 8; ++i) { for (j = 0; j < 256; j += js) { for (k = 0; k < ks; ++k) { unsigned pa = j + k; unsigned pb = j + k + ks; add_iq32(&ping[pa], &ping[pb], &pong[pa]); sub_iq32(&ping[pa], &ping[pb], &pong[pb]); } } js <<= 1; ks <<= 1; swap_iq32_ptr(&ping, &pong); } } u64 scr_code_groups[SCR_CODE_GROUPS_COUNT] = { 0x0001789E79F16E6F, 0x0004F62DF294BDB9, 0x0010E44BF5A1FAEB, 0x0012075414733526, 0x001F55AE4B0EBFA1, 0x0023630442517657, 0x003A23981A19BB82, 0x00455D891C814D0C, 0x005993A6CFAC530F, 0x005C1D1544C980D9, 0x0067461327215534, 0x00698F68E07F7E11, 0x007B883CF40C4B37, 0x007D9D0EE74A3943, 0x0081EEF9670971F8, 0x008E5F1CD9A634B2, 0x0098AE653F41BC2D, 0x00AD3C189BF742E5, 0x00BBCD617D10CA7A, 0x00BE43D2F67519AC, 0x00E32659CB4DF71A, 0x00F2BA8C471D639E, 0x01149FA29A74C2C7, 0x011B2E4724DB878D, 0x0125FBF2CC5681B6, 0x012718ED2D844E7B, 0x01368438A1D4DAFF, 0x013CBB6E941E4C63, 0x014882B7DEBD421E, 0x014A61A83F6F8DD3, 0x0151C22B86F58FCB, 0x015866FC2B1CB8F5, 0x016BE1B39CEC3449, 0x016DF4818FAA463D, 0x0174B41DD7E28BE8, 0x018C31C7A5357EEA, 0x01921CF797CAAF24, 0x01AE2A5D9E9566D2, 0x01F34FD6A3AD8864, 0x02235ABC5BD34C4D, 0x02254F8E48953E39, 0x0234D35BC4C5AABD, 0x0238F93FE2494E55, 0x023F949388FE524E, 0x024BAD4AC25D5C33, 0x02539548E3E4FF89, 0x02677FAB3EA36F2E, 0x026FA3E2EABB367F, 0x0276E37EB2F3FBAA, 0x027E3F3766EBA2FB, 0x0299EF435F32E858, 0x02CA43B3A5542DCB, 0x02D68D9C767933C8, 0x0447DFC5DC67E5E6, 0x045A697476BB958A, 0x045C7C4665FDE7FE, 0x046896A5B8BA7759, 0x04857987B4A9AB66, 0x0499B7A86784B565, 0x049B54B786567AA8, 0x04CEED756F76CD4F, 0x089C9AEE8FBDCFDA, 0x08ABEB8CCAD9FEDF, 0x08B9ECD8DEAACBF9 }; static unsigned define_scr_code_group(u64 ssc, unsigned *scg, unsigned *slot) { unsigned i, j, k, match = 0; for (i = 0; i < SCR_CODE_GROUPS_COUNT; ++i) { u64 t_ssc = ssc; for (j = 0; j < SLOTS_PER_FRAME; ++j) { u64 reg = t_ssc ^ scr_code_groups; unsigned m = 0; for (k = 0; k < SLOTS_PER_FRAME; ++k) { if (!(reg & 0xF)) { m++; } reg >>= 4; } if (m > match) { *scg = i; *slot = j; match = m; } t_ssc = (t_ssc >> 4) | ((t_ssc & 0xF) << 56); } } return match; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться