3

GNU Radio デスクランブリング ブロックを使用しようとしています。デスクランブルを行う第三者によって書かれたブロックがあります。使用される多項式は x 17 + x 12 + 1 です。

コードを以下に示します

descrambler_cc_impl::descrambler_cc_impl()
  : gr::sync_block("descrambler_cc",
          gr::io_signature::make(1, 1, sizeof(unsigned char)),
          gr::io_signature::make(1, 1, sizeof(unsigned char)))
{
    lsr = 0;
}

/*
 * Our virtual destructor.
 */
descrambler_cc_impl::~descrambler_cc_impl()
{
}

int
descrambler_cc_impl::work(int noutput_items,
    gr_vector_const_void_star &input_items,
    gr_vector_void_star &output_items)
{
  const unsigned char *in = (const unsigned char *) input_items[0];
  unsigned char *out = (unsigned char *) output_items[0];
  int i;
  for (i = 0; i < noutput_items; i++) {
out[i] = (lsr & 1) ^ ((lsr >> 12) & 1) ^ ((lsr >> 17) & 1);
lsr = lsr << 1;
lsr = lsr | (in[i] & 1);
  }

  // Tell runtime system how many output items we produced.
  return i;
}

ここで、GNU Radio デスクランブラー ブロックを使用したいと考えています。
このリンクから、デスクランブリング パラメータを次のように計算しました。シード - 0x00; 長さ - 24。

残念ながら、上記のコードの対応するものとしては機能していません。これが機能しない理由について誰かがガイダンスを提供できますか?

4

1 に答える 1

3

回答の更新が遅くなり申し訳ありません。以下の説明はすべてをクリアします

GNU Radio ブロックの Descrambler は、指定されたマスク、シード、および長さの乗法デスクランブラーを実装します。マスクは、スクランブリング多項式から計算できます。GNU Radio では、マスクを計算する前に多項式をリトル エンディアンのビット順で書き込む必要があります。上記の多項式 の場合p(x) = x^17 + x^12 + 1、マスクは、最初に低べき乗の係数を配置することによって計算されcoef(x^1), coef(X^2) ... coef(x^17) for p(x) aboveます。これを以下に示します。

mask = 0000 0000 0010 0001 = 0x0021.

このブロックのソース コードから、このコンテキストでの長さは、新しいビットが挿入されるときにシフト レジスタがシフトする必要があるビット数であると推測できます。したがって、長さは次のように計算できます。

length = deg (p (x)) − 1

これは、私たちの場合、17 - 1 = 16 です。

于 2016-08-03T09:07:55.190 に答える