1

USRP B210でGNU Radioを使用して、GFSK信号を数か月間復調しようとしています。残念ながら、私は GNU Radio に関するまともな本を 1 冊も見つけていないため、私の参考文献のほとんどは、GNU Radio の公式ページを含むいくつかのランダムな Web サイトに基づいています。

GFSK 信号は、ラボのキューブサットから取得されます。現在、「10101010……」というテスト信号を送信中。使用される GFSK 変調指数は 0.6667 で、データ レートは 9600 bps です。下の図に示すように、私のフローグラフは GFSK デモブロックを使用していますが、これにはソース コード以外のドキュメントがないようです。感度は pi * modulation_index/samples_per_symbol に設定されます。ボーレート (9600) の 10x 20x 40x 80x および 160x としてサンプリングされた多数のファイルを記録しました。これらのファイルの両方で、期待どおりに 0x55 と 0xAA のグループを繰り返し受信することができました。

偶然にも、40x でサンプリングされた信号に frequence xlating fir フィルターを使用して USPR からの受信信号を 1000hz シフトすると、非常に適切な出力を得ることができました。ここで、gnuradio のおかしな動作が発生します。スライダーを使用して xlating フィルターの中心周波数を制御し、実行時にデフォルト値 (1000hz) から任意の値に変更できるようにします。値を変更すると、ビットのスワッピングやランダムなバイトの追加など、信号が適切ではなくなります。

なぜこれが起こるのか誰か教えてもらえますか?私のフローグラフを以下に示します。これまで見落としていたエラーを指摘してください。

xlating fir フィルター タップ: firdes.low_pass_2(1,samp_rate,cut_off, xlating_bw, xlating_attn)

[ここに画像の説明を入力]

4

1 に答える 1

2

最初に: いいえ、スライド時の奇妙な動作については説明できません。ただし、周波数オフセットを変更すると、デコードされる信号に大きな周波数ジャンプが発生することは間違いありません (これが、結局のところ、それを行っている理由です)。タイミングの回復を担当する構造はそれを好まないでしょう。それは一種の予想です。

残念ながら、私は GNU Radio でまともな本を 1 冊も見つけていません。

なにもない。GNU Radio は急速に進化してきたため、開発の「コア」サークルに近い人々は誰もそのようなものを書く時間がありませんでした。

したがって、私の参照のほとんどは、公式の GNU Radio ページを含むいくつかのランダムな Web サイトに基づいています。

そうですね、GNU Radio の公式 Web サイトは確かにランダムではありませんが、行くには適切な場所です!

ここから、階層ブロック接続などの GNU ラジオ用語を参照します。これらのすべてを理解していない場合は、公式のガイド付きチュートリアルを読むことをお勧めします!

ソースコード以外のドキュメントがないように見えるGFSKデモブロック

ソース コードにはドキュメンテーション コメントがありますが、これは Sphynx によって抽出されます。ただし、そのドキュメントは GRC では表示されません。私たちはそれに取り組む必要があります!

ただし、ドキュメントのコメントはかなり冗長です。

Hierarchical block for Gaussian Minimum Shift Key (GFSK)
demodulation.

The input is the complex modulated signal at baseband.
The output is a stream of bits packed 1 bit per byte (the LSB)

Args:
    samples_per_symbol: samples per baud (integer)
    verbose: Print information about modulator? (bool)
    log: Print modualtion data to files? (bool)

Clock recovery parameters.  These all have reasonble defaults.

Args:
    gain_mu: controls rate of mu adjustment (float)
    mu: fractional delay [0.0, 1.0] (float)
    omega_relative_limit: sets max variation in omega (float, typically 0.000200 (200 ppm))
    freq_error: bit rate error as a fraction
    float: 

基本的に、階層ブロック内に含まれるタイミング リカバリと FM 復調器のパラメータを完全に調整できます。

さて、明らかに、これまでのところうまくいきませんでした!先に進んで、GRC グラフで階層フローを再作成する必要があると思います。

同じソースを読むと、

    self.connect(self, self.fmdemod, self.clock_recovery, self.slicer, self)

つまり:

gfsk_demod の階層ブロックとして、

  • その入力ポートを の入力に接続しfmdemod
  • fmdemodの出力を の入力に接続しclock_recovery、次に
  • クロック リカバリ ブロックの出力を取得し、離散値に変換します ( を使用slicer)。

ソース コードの数行上で、これらがどのようにパラメータ化されているかがわかります。

最初にRX信号を「ストック」直交復調ブロックにフィードすることをお勧めします。数学的には、入力信号を受け取り、それをその位相速度 (つまり、サンプリング レートの倍数として表される各サンプルの「瞬間周波数」) に変換します。スコープ/タイム シンクで出力を視覚化します。正しく見えますか、つまり、おおよそガウス型のパルス形状で、「高い」値と「低い」値が交互に表示されますか?

その場合は、GRC で Muller&Mueller クロック リカバリ ブロックを複製します (または、現実世界の信号をより適切に処理する新しい光沢のある PFB クロック リカバリに置き換えます)。出力は正しいですか?

"decimating FIR" を使用して、出力レートをsamples_per_symbol;減らします。それはまだ「ソフト」値として元のビット ストリームのように見えますか? 存在する場合は、結果をバイナリ スライスします。

于 2016-03-28T19:29:33.180 に答える