Перейти к содержанию
    

Доброго времени суток, уважаемые знатоки. Столкнулся с проблемой написания программного модуля, который осуществлял бы демодуляцию сигналов данного стандарта. Насколько я разобрался, то проблема заключается в первичной и вторичной синхронизациях, они же синхрокоды. Если первичная прописывается в явном виде что она из себя представляет, то со вторичной возникают проблемы, ибо непонятно каким образом происходит "нарезка" вторичных синхрокодов из общей длины кодов Голда. Благодарен за внимание.

Изменено пользователем Marsel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...