GNURadioでFMステレオ放送の受信フローグラフを組む

Radio

USBチューナーとGNURadioを使ってFMラジオのステレオ受信フローグラフを組んでみましたので紹介します。

GNURadioでは、FM demodというモジュールを使って可聴周波数にデシメーション(間引き)するだけで簡単にFM放送を聴くことが出来ます。しかし、FMステレオで聴くことは意外に難しく、GNURadioのWFMモジュールではどうしてもステレオで聞くことができません。

GNURadioの公式サイトにおいて、WFM Demod PLLで受信できると書いてあるのですが、モノラルでしか受信できません。ソースコードに問題があるのかと思ってみてみましたが、ライブラリのコールばかりであり、どこに問題があるのかわからなかったため、無線工学でお勉強する原理どおりのフローグラフ組んでみることにしました。

第1級陸上無線技術士(国家資格)の参考書を引っ張り出して、原理どおりに組んでみたのですが、全くステレオで受信出来ませんでした。ネットでいろいろ調べていると、同じようにGNURadioでFMステレオフローグラフを作った方を見つけて、ようやくGNURadioでFMステレオ放送を聴くことが出来るようになりましたので、動作フローを含めて解説します。

ステレオ放送の仕組みについて

FMステレオ放送は、左信号(L)と右信号(R)を加算した和信号と、同じく減算した差信号を作り、多重化して出力することで実現しています。

具体的には、L+R 信号とL-R信号が200KHzの帯域で送信されており、モノラルで受信する場合はL+Rの信号のみを復調します。ステレオで聞く場合は、音声信号に対して以下の計算をすることでステレオで聞こえるようになります。

  • L信号 = (L+R) + (L-R) = 2L
  • R信号 = (L+R) - (L-R) = 2R

回路を組む上では、「L+R 信号」と「L-R信号」の境界が19KHz、L-Rの中心境界が38KHzとなっており、受信信号から必要とする境界信号を作り出し、加減算処理をする必要があります。

このような仕組みにより受信機がモノラルでも普通に聞くことが出来ます。なかなか良くできた仕組みです。

動作環境について

このフローグラフの動作には相応のPCスペックが必要です。Core i5機(4core)でも処理が間に合わず音声が途切れます。

  • PC : Core i7 10700
  • USBチューナ:RTL-SDR.COM , DVB-T+DAB+FM いずれも可
  • USBドライバ:Zadig 2.5以降
  • アンテナ:RTL-SDR.COMの添付品

フローグラフの説明

FMステレオ受信のフローグラフはZanさんの記事を参考にさせていただきました。

FMステレオ受信はいくつか記事を見つけて組んでみましたが、Zanさんが作られた回路しかステレオ受信にならなかったです。Zanさんのフローグラフは音声波形まで検証されており、GNURadioの演算時間を考慮したDelay回路も入っているので、完成度が高いフローグラフだと思います。

フローグラフはZanさんの回路のままで動作はするのですが、そのままでは演算処理がかなり重く、ハイエンドPCでないと処理が追いつかない状態でした。そこで独自に中間サンプリングレートを落とす、ディエンファシスの挿入箇所を変更するなどの改造を施し、マシン負荷を落とすことができました。

フローグラフの動作説明

  • 入力はRTL source 、Device ArgumentsはRTL=0と書く必要あります
  • 受信波のサンプルレート:1.024MHz (RTL2838は2.56MHzまでなので過大な設定は不可)
  • ローパスフィルターでナイキスト周波数をカットし、FM DemodブロックでFM音声帯域すべてを復調し、Radional Resamplerで 1.024MHzを3/8にデシメーション(間引き)し、96KHzの中間周波数に変換します。
  • この変換後の出力はL+R音声信号(~15KHz)、L-R信号(35-53KHz)、境界周波数19KHzを含んでいるため、L-R信号の抽出処理を行う処理を行います。Delay:3という遅延モジュールはZanさんが発見したソフトウェア無線特有の遅延対策で、後段に2つ入っているBand Pass Filter等の処理時間を補正するものです。この遅延をいれないと位相がずれるのでモノラルと大差なくなってしまいます。
  • 19KHzの信号はBand Pass Filterで19KHz外の信号をカットし、PLL Ref Outにより19KHzを抽出します。38KHzの境界周波数は信号として存在しませんので三角関数の倍角公式により19KHzを2乗することで得られます。また2乗することで信号が減衰するため次のBanpass Filterでゲインを2倍にします。
  • L-R信号はの抽出は、L+R信号と38KHzを乗算して搬送波成分を除去して、Low Pass Filterで15KHzにカットすることで得られれます。
  • L+R信号とL-R信号を「加算するとL信号」、「減算するとR信号」となりますので、それぞれを48KHzにデシメーションすると可聴できるアナログ音声になります。
  • FM放送のディエンファシス(アナログ伝送の高音部強調)は日本の時定数50μsecに設定します。(75μsecはアナログテレビ時代のプレエンファシス)
  • Multiply Constantでボリューム調整を行い、Audio SinkでPCのスピーカから音声を出力します。Wav File SinkをアクティブにするとWAVファイルに音声データをWAV形式(PCM 48KHz)で保存も可能です。

筆者の組んだステレオ受信フローグラフは、こちらのページからダウンロードできます。

FMステレオ受信をしてみる

このフローグラフでFM放送を受信すると、受信波形と音声出力波形のアナライザが表示されて、モノラルとは明らかに別物のステレオ音声が聴けるようになります。

Stereoのチェックボックスを操作するとステレオとモノラルが切替できます。ステレオ時は左右が別の音声になっていて、モノラルにすると音声波形も左右同一になることがわかります。

下図は番組のトーク中でモノラル相当の音声で放送されているときの音声波形です。音楽がかかっているときはLとRが別波形になりステレオに変わるので見ていて面白いです。

スレレオ受信の課題について

フローグラフをみて予想はしていましたが、このFMステレオ放送の受信処理はかなり重いです。

自作Core i7機(8コア16スレッド)というハイスペックPCでも、モノラル受信だとCPU負荷率4%程度であったのに対し、ステレオ受信はCPU負荷率14%くらいになります。

手持ちのPentium機(2コア4スレッド)でこのステレオ受信回路を動かしてみたところ、CPU負荷率が70%くらいで動作はしますが処理が間に合わずノイズが混入します。処理落ちするとGNURadio上ではメッセージエリアに「○○○・・・」の表示が増えていき、データ落ちしていることが確認できます。

当初は、自作のFM受信プログラムをステレオ受信に変えようと思っていましたが、マシンスペックが必要となると判明しましたので、モノラル受信回路とステレオ受信回路を選択できる仕様にする予定にします。

自作のFM予約受信プログラムにステレオ受信が実装が出来ましたら、また記事で掲載します。