今日はGNU Radioを用いて、FM受信機を作成してみます。

SDRのH/WをGNU Radioで制御するとき、殆どのユーザーはFM受信機から始まるんですね。ここまでできたらあなたもGNU Radioの立派なユーザーです。そして、WebやYoutubeなどではいくつのGNU Radioを使うFM受信機の事例がありますが、どれも説明が簡単であり、返って中身を理解するためにはあまり役に立たなかった気がしましたので、ここでは少し詳しく説明いたします。

まず、下記のフローチャートを見てみてください。 これが今回ソフト無線でFM受信機を作る設計図になります。フローチャートの各ブロックはGNU Radioのブロックに対応しています。

FM_Receiver_flow_chart_1

(0) 事前の設定

  • Sampling Rate : 2 MHz
  • Channel widht : 200 kHz

(1) SDR H/W Source

ソフト無線のH/Wをソースとして指定します。その時、アンテナのゲイン及び中心周波数を指定します。

  • Gain : 40 dB (受信環境によって0 ~ 40 dBの間の適正な数値を入力してください。)
  • Center Frequency : これが受信する周波数になります。私の場合、実験室だとFM放送の電波が入らないため、手持ちのFMトランスミッタを使っています。そのため、中心周波数がFMトランスミッタの94 MHzになりました。

(2) Low Pass Filter

SDR H/Wから受信した信号をLow Pass Filterにかけます。同時にSampling RateのDecimationも行いますので、Low Pass Filterの出力のSampling Rateは200 kHzになります。

  • Decimation = (Sample Rate)/(Channel width) = 2 MHz / 200 kHz = 10

その結果、Sampling rate after LPF = 2 MHz / (Decimation) = 2 MHz / 10 = 200 kHzになります。フローチャートの矢印の上に赤い文字で各段階でのSampling Rateを表記しましたので、参考にしてください。

  • Cut off frequency = 75 kHz
  • Transition width = 25 kHz

Low pass filter @ GNU Radio

(3) Rational Resampler

ここで、もう一度Sampling Rateを変換します。目的はLPFのoutput Sampling Rate 200kHzを WBFM Receiverのinput Sampling Rate 480kHzに合わせるためです。Sampling Rateのインピーダンスマッチングと思えば、理解しやすいと思います。

  • Interpolation = 12
  • Decimation = 5

output Sampling rate of Rational Resampler = input Sampling rate  * (Interpolation)/ (Decimation) = 200 kHz * (12/5) = 480 kHz

(4) WBFM Receiver

Wide Band FM Receiverといい、FM復調を行います。

  • Quadrature rate : WBFM Receiverのinput sampling rate = 480 kHz
  • Audio decimation : WBFMの出力はAudio Rate(可聴周波数)に合わせる役割です。 これは10にします。

そうなりますと、WBFM Reciverのoutput sampling rateは

WBFM Quadrature rate / Audio decimation = 480 kHz / 10 = 48 kHzになります。

(5) Multiply Constant

Audio Volumeの役割を行います。

(6) Audio Sink

PCのスピーカで音を鳴らします。PCサウンドカードのMax Sampling rateの48kHzに合わせられています。

上記のフローチャートをGNU Radioで書き起こすと、下記の図のようになります。 2枚の図になりますが、それはSDR H/WがUSRPかRTL-SDRによるもので、他の部分は共通しています。なお、GRCファイルは下記のリンクでダウンロードしてください。

FM_Receiver_1ch_USRP.grc

FM_Receiver_1ch_RTL-SDR.grc

zenti_fm_usrp
USRP専用
RTL-SDR_zentai
RTL-SDR専用

 

(1) SDR H/W Source

 

usrp_setting
USRP Setting
RTL_setting
RTL-SDR Setting

 

(2) Low Pass Filter

low_pass_filter_setting

 

(3) Rational Resampler

rational_resampler

 

(4) WBFM Receiver

WBFM_receive

 

(5) Multiply Constant

multiply_const

実行結果です。MP3再生機にFMトランスミッタを接続し、94MHzの周波数で送信し、それをSDRとgnu radioで受信し、再生している様子です。

94MHz_spectrum
周波数スペクトル
audio_spectrum
音声スペクトル

いかがですか?思ったより簡単でしたか?

まずは、各ブロックの前後のSampling Rateがどう変わるか注意して追跡してみてください。それが理解できれば、後は自分で受信機が設計できるようになります。

最後に、ブロックの順番ですが、今回はSDR-H/W – LPF – Resampler – WBFM – Audioになっています。

この順番は絶対的ではなく、皆さんの設計により変わります。

 

 

 

 

 

Similar Posts

4件のコメント

  1. ふぉぉぉぉ…すばらしい!
    自分でも考えながら変更など挑戦できるわかりやすい内容でした!
    ありがとうございます。

    1. ありがとうございました!

  2. 最近GNU RadioでSDRを始めたものです。
    初歩的な質問で申し訳ありません。

    こちらのFM RadioのチャートをDLして、HackRF Oneで使ってみたのですが、
    スペクトラムの中心周波数にいるはずのないスペクトラムが毎回表示されます。
    (Frequencyレンジを操作しても、必ず中心周波数に-30 dBくらいの山が出現します。)
    一応、きちんと他の周波数の電波は拾えてはいるようなのですが、
    なぜか中心周波数に毎回出てくるのは、こちらの機械が悪いのでしょうか?

    ご助言いただければ幸いです。

    1. ありがとうございました。
      手元にHackRF Oneを入手して確認してみますので、少々お待ちしてください。
      よろしくお願い致します。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください