このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

RDS/RBDS および RadioText Plus (RT+) FM 受信機

この例では、MATLAB® および Communications Toolbox™ を使用して、RDS または RBDS 標準、およびオプションで RadioText Plus (RT+) 標準を使用する FM ラジオ放送局からプログラムや曲の情報を抽出する方法を示します。取得した信号か、RTL-SDR 無線機または ADALM-PLUTO 無線機を使用してリアルタイムに受信した信号のいずれかを使用できます。

必要なソフトウェアとハードウェア

取得した信号を使用してこの例を実行するには、Communications Toolbox™ が必要です。信号をリアルタイムに受信するには、次のいずれかのハードウェアも必要になります。

Communications Toolbox でサポートされる SDR プラットフォームのすべてのリストについては、ソフトウェア無線機 (SDR) のサポートされているハードウェアの節を参照してください。

背景

RBDS と RDS は、追加情報で FM ラジオ信号を補足する方法を指定する非常によく似た標準です。RBDS は北米で使用されているのに対し、RDS はもともと欧州で使用され、国際標準に発展しました。RBDS と RDS は次の 3 層で構成されます。

  • 物理層 (第 1 層)

  • データ リンク層 (第 2 層)

  • セッションとアプリケーション層 (第 3 層)

物理層 (第 1 層)

RDS/RBDS PHY 復号化器は、ファイルから取得した信号または無線機からライブ信号を受信し、次のステップを実行します。

  • FM 復調: FM 信号が復調されると、RDS/RBDS 信号は 57 kHz +/- 2.4 kHz 帯域に存在します。

RDS および RBDS 信号は比較的低いパワーで送信されるため、上の図のように FM スペクトルに表示されない場合もあることに注意してください。

FM 信号には、19 kHz のパイロット トーンが含まれます。これは、57 kHz で RDS/RBDS 信号、38 kHz でステレオ オーディオの同期復調の位相基準と周波数基準として使用できます。38 kHz および 57 kHz のパイロット トーンは 19 kHz のパイロット トーンの周波数を 2 倍および 3 倍することで生成できます [ 2 ]。

RDS/RBDS 信号の同期復調の処理手順は次のとおりです。

  • バンドパス フィルター処理: PHY 受信機は、バンドパス フィルター処理を 19 kHz と 57 kHz で実行して、パイロット トーンと RDS/RBDS 信号をそれぞれ分離します。

  • 周波数の 3 倍増: 19 kHz パイロット トーンの複素表現を 3 乗に増加することで、周波数を 3 倍にして 57 kHz パイロット トーンを取得します。

  • AM 復調: RDS および RBDS シンボルが 1187.5 Hz レートで生成され、57 kHz 搬送波に AM 変調されます。57 kHz RDS/RBDS 信号は、周波数と位相が固定された 57 kHz 搬送波でコヒーレントに復調できます。通常、同期復調には、周波数を 3 倍にした 19 kHz パイロット トーンで十分です。次の図は、19 kHz と 57 kHz のパイロット トーン、57 kHz RDS/RBDS 信号、および AM 復調されたベースバンド RDS/RBDS 信号を示しています。

同時に、57 kHz RDS/RBDS 信号が 19 kHz パイロット トーンからの時変位相オフセットと、その周波数が 3 倍されたバージョンを示している複数の FM 放送局が存在します。PHY 受信機には、Costas ループが含まれ、このような時変位相オフセットを補正します。

  • Costas ループ: Costas ループは、57 kHz の正弦による復調と 57 kHz の余弦による復調の 2 つの直交 AM 復調を実行します。受信信号のサンプリング レートは、57 kHz サイクルあたり 4 つのサンプルを提供する 228 kHz として注意深く選択されます。したがって、57 kHz パイロット トーンの 1 つのサンプルの遅延の結果が、4 分の 1 波長位相オフセットとなり、正弦波から余弦波の生成が可能になります。正弦復調された信号は、同期復調出力に対応します。余弦復調された信号は、位相誤差の検出に使用されます。正弦波/余弦波がある 57 kHz RDS/RBDS 信号の積は、以下の節で指定されたフィルターを使用して、ローパス フィルター処理されます。[1] の第 1.7 節。2 つのフィルター出力の積が誤差信号になります。これが大きくなるほど、19 kHz パイロット トーンの遅延が大きくなり、余弦ベースの復調器のように動作します。

  • クロック抽出: 二相位相シンボル復号化を実行するため、1187.5 Hz の RDS/RBDS シンボル レートと一致するクロックが、19 kHz パイロット トーンから抽出されます。1187.5 Hz x 16 = 19 kHz を意味します。周波数オフセットを考慮するため、周波数分割は 19 kHz パイロット トーンからクロックを抽出するために使用されます。周波数分割操作は複数の正しい解を提供するため、ベースバンド RDS/RBDS 信号は、目的の出力の決定を支援する学習データとして機能します。

  • 二相シンボル復号化器: RDS および RBDS は、一般にマンチェスター符号として知られている二相位相レベル (bi- $\phi$ -L) 符号化を使用します。各クロック サイクルで、RDS/RBDS シンボルは、2 つの逆の振幅値 (正の値の後に負の値、または負の値の後に正の値) を取ります。二相位相シンボル復号化器は、2 番目の振幅レベルを無効にして、各シンボルがクロック サイクル全体で同じ振幅レベルを保持できるようにします。新しいクロック幅の振幅レベルは、シンボルのビット表現に対応します。次の 2 つのスクリーンショットは、[ 1 ] の図 2 の波形 #1 ~ 6 に対応しています。

各シンボルのビット値を取得するため、波形が各クロック サイクルで統合され、結果がゼロ (スライサー) と比較されます。

  • 差動復号化: 最後に、送信機で差分符号化を元に戻すためにビットが差動復号化されます。

データ リンク層 (第 2 層)

第 2 層は、RBDSDataLinkDecoder System object™ を使用して実装されます。この層は、同期と誤り訂正を行います。

PHY 層のビット出力は、4 つの 26 ビット ブロックで構成される 104 ビット グループで論理的に構成されます。各ブロックには、16 ビットの情報ワードと 10 パリティ ビットが含まれます ([ 1 ] の図 8 を参照)。異なる 10 ビット オフセット ワードは、各ブロックのパリティ ビットに剰余 2 が加算されます。

  • 同期: 最初に、104 ビットのスライディング ウィンドウを使用してブロック境界とグループ境界が徹底的に求められます。104 ビット ウィンドウごとに、各 26 ビット ブロックの最後の 10 ビットで 4 つのオフセット ワードが求められます。オフセット ワードは、そのブロックでビットの誤りが検出されない場合に識別されます。オフセット ワードが識別されると、グループレベルの同期が達成され、徹底的なスライディング ウィンドウの処理が停止します。その後、次の 104 ビットは次のグループとして扱われます。

これ以降のグループがビットの誤りを含んでおり、期待される位置でオフセット ワードを識別できない場合、同期が失われる場合があります。この場合、第 2 層は最初の情報ワード (16 ビット) が常にすべてのビット グループで同じという事実を利用して、1 ビットの同期のずれの可能性を最初に調査します。最初の情報ワードが (左または右方向に) 1 ビット外れているのが見つかった場合、同期が保持され、グループ境界はそれに応じて調整されます。ビットの誤りが 25 グループ受信する間続き、同時にこのような左または右方向の 1 ビットのシフトを使用しても同期を再確立できない場合、同期が失われ、第 2 層は徹底的なスライディング ウィンドウベースの検索と同期に再度入ります。

  • 誤り訂正: RDS/RBDS の誤り訂正コードが、(341, 331) から (26, 16) 巡回符号に短縮されました。誤り訂正の実装は、[ 1 ] の付録 B に記載されているシフト レジスタ方式を使用します。

セッションとプレゼンテーション層 (第 3 層)

第 2 層でパリティ/オフセット ビットが削除されるため、第 3 層は 4 つの 16 ビット ブロックで構成される 64 ビットのグループを受信します。最大 32 の異なるグループ タイプが存在し、それぞれに 0 から 15 の数字と 'A' または 'B' の文字のラベル (0B、2A、3A など) が付けられます。各グループの書式は、固定にするか、このグループが Open Data Application (ODA、[ 3 ] のリストを参照) に割り当てられている場合は、抽象にすることができます。

第 3 層は、RBDSSessionDecoder System object を使用して実装されます。このオブジェクトは、0A、0B、2A、2B、3A、4A、10A の固定書式グループ タイプの復号化をサポートしています。

  • 0A と 0B は、一般的にスクロール テキスト方式で変更する 8 文字の文字列を伝えます。

  • 2A と 2B はより長い 64 文字または 32 文字の文字列を伝えます。

  • 3A は ODA を登録し、それら専用の抽象書式グループ タイプを指定します。

  • 4A はシステムの時間を伝えます。

  • 10A はプログラム タイプをさらに分類します (プログラム タイプ 'Sports' の 'Football' など)。

ODA については、RDS/RBDS 受信機は RadioText Plus (RT+) の復号化をサポートします。この ODA は、グループ タイプ 2A または 2B の長い 32 文字または 64 文字の文字列を 2 つの具体的なコンテンツ タイプ (アーティストや曲など) に分類できます。

ODA の実装の登録: RadioText Plus (RT+)

RDS/RBDS 受信機は拡張可能です。ODA の実装は、RBDSSessionDecoder System object の関数 registerODA を使用して指定できます。この関数は、ODA の 16 進数の ID (ODA ID は [ 3 ] で見つけられます) を受け入れ、メインの ODA グループ タイプと、3A グループ タイプの ODA 固有の部分を処理する関数を処理します。たとえば、sessionDecoder RBDSSessionDecoder オブジェクトは、次のコードを使用して RadioText Plus (RT+) 用に拡張できます。

rtID = '4BD7'; % hexadecimal ID of RadioText Plus (RT+)
registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A);

コード例の実行

MATLAB コマンド ウィンドウで RBDSExample と入力するか、このリンクをクリックして例を実行します。

% Set RDS/RBDS system parameters
userInput = helperRBDSInit();
userInput.Duration = 10.8;
userInput.SignalSource = 'File';
userInput.SignalFilename = 'rbds_capture.bb';
% userInput.SignalSource = 'RTL-SDR';
% userInput.CenterFrequency = 98.5e6;
% userInput.SignalSource = 'ADALM-PLUTO';
% userInput.CenterFrequency = 98.5e6;


[rbdsParam, sigSrc] = helperRBDSConfig(userInput);

% Create FM broadcast receiver object and configure based on RDS/RBDS parameters
fmBroadcastDemod = comm.FMBroadcastDemodulator(...
    'SampleRate',         rbdsParam.FrontEndSampleRate, ...
    'FrequencyDeviation', rbdsParam.FrequencyDeviation, ...
    'FilterTimeConstant', rbdsParam.FilterTimeConstant, ...
    'AudioSampleRate',    rbdsParam.AudioSampleRate, ...
    'Stereo', true);

% Create audio player
player = audioDeviceWriter('SampleRate', rbdsParam.AudioSampleRate);

% Layer 2 object
datalinkDecoder = RBDSDataLinkDecoder();

% Layer 3 object
sessionDecoder  = RBDSSessionDecoder();
% register processing implementation for RadioText Plus (RT+) ODA:
rtID = '4BD7';
registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A);

% Create the data viewer object
viewer = helperRBDSViewer();

% Start the viewer and initialize radio time
start(viewer)
radioTime = 0;

% Main loop
while radioTime < rbdsParam.Duration
  % Receive baseband samples (Signal Source)
  rcv = sigSrc();

  % Demodulate FM broadcast signals and play the decoded audio
  audioSig = fmBroadcastDemod(rcv);
  player(audioSig);

  % Process physical layer (Layer 1)
  bitsPHY = RBDSPhyDecoder(rcv, rbdsParam);

  % Process data-link layer (Layer 2)
  [enabled, iw1, iw2, iw3, iw4] = datalinkDecoder(bitsPHY);

  % Process session and presentation layer (Layer 3)
  outStruct = sessionDecoder(enabled, iw1, iw2, iw3, iw4);

  % View results packet contents (Data Viewer)
  update(viewer, outStruct);

  % Update radio time
  radioTime = radioTime + rbdsParam.FrameDuration;
end

% Stop the viewer and release the signal source and audio writer
stop(viewer);
release(sigSrc);
release(player);

結果の表示

上のスクリーンショットは、処理された RDS/RBDS データのグラフィカル表示を示しています。

  • Basic RDS/RBDS information:

  1. 最初のフィールドは、プログラム タイプに対応しており、すべてのグループ タイプの 2 番目の情報ワードによって伝えられます。10A グループ タイプが受信されると、1 番目のフィールドは Sports \ Football のように、さらなる特性も提供します。

  2. 2 番目のフィールドは、0A/0B グループによって伝えられた 8 文字のテキストを示します。

  3. 3 番目のフィールドは、2A/2B グループ タイプによって伝えられたより長い 32/64 文字のテキストを示します。

  • RadioText Plus (RT+): このセクションは、任意の 3A グループが、RadioText Plus (RT+) ODA が 11A などの抽象書式グループ タイプを使用していることを示す場合に使用されます。その後、抽象グループ タイプを受信すると、2A/2B のグループによって伝えられる 32/64 文字のテキストが 2 つの部分文字列に分割されます。さらに、2 つのラベルが部分文字列を特徴づけるために更新されます (アーティストや曲など)。

  • Group type receptions: この表は、放送局から受信しているグループ タイプと周波数を示すヒストグラムとして機能します。結果として、ユーザーはグラフィカルなビューアーでは示されないより詳細な情報のログ データ (具体的には、4A でのシステム時間、0A での代替周波数など) を確認できます。

  • Open data applications (ODA): いずれかの 3A グループ タイプが受信されると、見つかった ODA のリストが ODA 名とその専用グループ タイプで更新されます。

その他の調査

RBDSExampleApp ユーザー インターフェイスを使用して、RDS/RBDS 信号をさらに調査することができます。これを起動するには、このリンクをクリックするか、コマンド ウィンドウで RBDSExampleApp と入力します。

このユーザー インターフェイスでは、次のことができます。

  • 信号のソース (取得されたファイルか、RTL-SDR または ADALM-PLUTO) を選択する

  • 放送局の周波数 (RTL-SDR または ADALM-PLUTO) を指定する

  • 生成された C コードを通じて RDS/RBDS 受信機の第 1 層と第 2 層を実行する。これらは RDS/RBDS チェーンの最も時間のかかる部分で、コードを生成することでリアルタイム処理の実現に役立ちます。

  • 音声再生を無効にする

  • 受信した信号を解析し、復号化処理を図示するスペクトル アナライザーや時間スコープなどのスコープを開く。スコープを有効にすると、追加の計算作業が必要となりリアルタイムの復号化を妨げる場合があります。この場合、RDS/RBDS 復号化は、ファイルから読み込んで取得した信号以外では正常に動作しない可能性があります。

さらに、[Log data to file] チェックボックスをオンにして、すべてのグループ タイプからさらに多くのフィールドをログ記録できます。

次の関数や System object の実装も調査できます。

参考文献

  1. National Radio Systems Committee, United States RBDS standard, April 1998

  2. Der, Lawrence."Frequency Modulation (FM) Tutorial".Silicon Laboratories Inc.

  3. National Radio Systems Committee, List of ODA Applications in RDS

  4. RadioText Plus (RT+) Specification

  5. Joseph P. Hoffbeck, "Teaching Communication Systems with Simulink® and the USRP", ASEE Annual Conference, San Antonio, TX, June 2012