주요 콘텐츠

RDS/RBDS 및 RadioText Plus(RT+) FM 수신기

이 예제에서는 RDS 또는 RBDS 표준, 선택적으로 RadioText Plus(RT+) 표준을 사용하는 FM 무선국에서 프로그램 또는 노래 정보를 추출하는 방법을 보여줍니다. 사전에 캡처된 신호를 사용하거나, RTL-SDR 라디오, ADALM-PLUTO 라디오 또는 USRP™ 라디오를 사용하여 실시간으로 무선으로 신호를 수신할 수 있습니다.

필요한 하드웨어와 소프트웨어

기본적으로 이 예제는 파일에서 기록된 데이터를 사용하여 실행됩니다. 사용자가 228ksps의 필수 샘플 레이트를 지원하는 장치를 사용하여 신호를 무선으로 수신하는 방식을 선택할 수도 있습니다. 이를 위해서는 다음 중 하나가 필요합니다.

배경

RBDS와 RDS는 FM 라디오 신호에 추가 정보를 보완하는 방법을 규정하며 서로 매우 유사한 표준입니다. RBDS는 북미에서 사용되고, RDS는 원래 유럽에서 사용되었으며 점차 국제 표준으로 발전했습니다. RBDS와 RDS는 3개 계층으로 구성됩니다.

  • 물리 계층(계층 1)

  • 데이터 링크 계층(계층 2)

  • 세션 및 표현 계층(계층 3)

물리 계층(계층 1)

RBDSPhyDecoder 헬퍼는 파일에서 캡처된 신호 또는 라디오에서의 실시간 신호를 수신하고 다음 단계를 수행합니다.

  • FM 복조: FM 신호가 복조되면 RDS/RBDS 신호는 57kHz +/- 2.4kHz 대역에 위치합니다. 한 가지 유념할 점은 RDS/RBDS 신호가 상대적으로 낮은 전력으로 송신되므로, 아래 그림에 나타난 것처럼 그 신호가 항상 FM 스펙트럼에 표시되지는 않습니다.

FM spectrum showing the transmitted RDS/RBDS signal.

FM 신호에는 19kHz의 파일럿 톤이 포함되어 있으며, 이 파일럿 톤은 57kHz의 RDS/RBDS 신호와 38kHz의 스테레오 오디오에 코히어런스 복조를 수행하기 위한 위상 기준 및 주파수 기준으로 사용할 수 있습니다. 38kHz 및 57kHz의 파일럿 톤은 19kHz 파일럿 톤의 주파수를 각각 2배와 3배로 증가시켜서 생성할 수 있습니다[ 2 ].

RDS/RBDS 신호에 코히어런스 복조를 수행하기 위한 처리 단계는 다음과 같습니다.

  • 대역통과 필터링: PHY 수신기가 파일럿 톤과 RDS/RBDS 신호를 분리하기 위해 19kHz와 57kHz에서 각각 대역통과 필터링을 수행합니다.

  • 주파수 3배로 만들기: 19kHz 파일럿 톤의 복소 표현을 세제곱하여 해당 주파수를 3배 증가시켜서 57kHz 파일럿 톤을 얻습니다.

  • AM 복조: RDS 및 RBDS 심볼이 1187.5Hz 레이트에서 생성되고, 57kHz 반송파로 AM 변조됩니다. 주파수와 위상이 잠긴 57kHz 반송파로 57kHz RDS/RBDS 신호에 코히어런스 복조를 수행할 수 있습니다. 일반적으로 코히어런스 복조를 위해서는 19kHz 파일럿 톤의 주파수를 3배 증가시키는 정도로 충분합니다. 다음 그림에서는 19kHz 및 57kHz 파일럿 톤과 57kHz RDS/RBDS 신호 및 AM 복조된 기저대역 RDS/RBDS 신호를 보여줍니다.

The 19 KHz pilot tone, 57 KHz pilot tone, 57 KHz RBDS signal, and baseband RBDS signal in order from top to bottom.

동시에 몇몇 FM 기지국이 있으며, 이 기지국의 57kHz RDS/RBDS 신호는 19kHz 파일럿 톤과 해당 주파수를 3배 증가시킨 버전과 비교했을 때 시변 위상 오프셋을 보입니다. PHY 수신기에는 이러한 시변 위상 오프셋을 보정하기 위한 Costas 루프가 포함되어 있습니다.

  • Costas 루프: Costas 루프는 2번의 직교 AM 복조를 수행하는데, 한 번은 57kHz 사인파를 사용한 복조이고 나머지 한 번은 57kHz 코사인파를 사용한 복조입니다. 수신된 신호의 샘플링 레이트가 228kHz로 신중히 선택되고, 이는 57kHz 주기당 4개의 샘플을 제공합니다. 따라서 57kHz 파일럿 톤에 대한 하나의 샘플 지연을 통해 1/4 파장 위상 오프셋이 생성되므로, 사인파에서 코사인파를 생성할 수 있습니다. 사인파 복조된 신호는 코히어런스 복조 출력에 해당합니다. 코사인파 복조된 신호는 위상 오차 검출에 사용됩니다. 57kHz RDS/RBDS 신호에 사인파/코사인파를 곱한 값은 [ 1 ]의 섹션 1.7에 지정된 필터로 저역통과 필터링됩니다. 두 필터 출력값의 곱이 오차 신호입니다. 이 값이 클수록 코사인 기반 복조기와 더 유사하게 동작하도록 19kHz 파일럿 톤이 더 지연됩니다.

  • 클록 추출: 양위상 심볼 디코딩을 수행하기 위해 RDS/RBDS 심볼 레이트 1187.5Hz와 일치하는 클록이 19kHz 파일럿 톤에서 추출됩니다. 참고로, 1187.5Hz x 16 = 19kHz입니다. 주파수 오프셋을 고려하기 위해 19kHz 파일럿 톤에서 클록을 추출할 때 주파수 분할이 사용됩니다. 주파수 분할 작업에서 여러 개의 올바른 응답을 제공하므로, 기저대역 RDS/RBDS 신호가 원하는 출력을 결정하는 데 도움이 되는 훈련 데이터 역할을 합니다.

  • 양위상 심볼 디코더: RDS 및 RBDS는 일반적으로 맨체스터 코딩(Manchester coding)으로 알려진, 양위상 수준(bi- ϕ -L) 코딩을 사용합니다. 각 클록 주기에서 RDS/RBDS 심볼은 반대되는 두 진폭 값을 취하는데, 양수 다음에 음수가 오거나 음수 다음에 양수가 오는 형태입니다. 양위상 심볼 디코더가 두 번째 진폭 수준을 반전하여, 각 심볼이 전체 클록 주기에서 동일한 진폭 수준을 갖도록 합니다. 클록 전체에 적용되는 새 진폭 수준은 심볼의 비트 표현에 해당합니다. 다음 플롯은 [ 1 ]의 그림 2에 나와 있는 파형 1~6번에 해당합니다.

The baseband RBDS signal, 1187.5 Hz clock, and same phase symbols in order from top to bottom.

각 심볼의 비트 값을 얻기 위해, 각 클록 주기에 대해 파형이 적분되고 그 결과가 0(슬라이서)과 비교됩니다.

Same phase symbols, waveform integrated over each clock cycle, sliced signal, and differential decoded signal plots in order from to bottom.

  • 차분 디코딩: 마지막으로 송신기에서 차분 인코딩을 되돌리기 위해 비트가 차분 디코딩됩니다.

데이터 링크 계층(계층 2)

계층 2는 RBDSDataLinkDecoder 헬퍼를 사용하여 구현됩니다. 이 계층은 동기화 및 오류 정정을 담당합니다.

PHY 계층의 비트 출력은 26비트 블록 4개로 구성된 104비트 그룹으로 논리적으로 구성됩니다. 각 블록은 16비트 정보 워드와 10패리티 비트를 포함합니다([ 1 ]의 그림 8 참조). 고유한 10비트 오프셋 워드는 각 블록의 패리티 비트에 모듈로-2 덧셈 연산을 수행한 값입니다.

  • 동기화: 처음에 블록과 그룹 경계가 104비트의 슬라이딩 윈도우를 사용하여 포괄적으로 구해집니다. 각 104비트 윈도우에 대해 각 26비트 블록의 마지막 10비트에서 4개의 오프셋 워드가 구해집니다. RBDSErrorDetection 헬퍼에서 검출된 비트 오류가 없으면 오프셋 워드가 식별됩니다. 오프셋 워드가 식별되면 그룹 수준의 동기화가 이루어지고 포괄적 슬라이딩 윈도우 처리가 중지됩니다. 그 후에 그다음의 104비트가 다음 그룹으로 처리됩니다.

이후 그룹이 비트 오류를 포함하고 예상된 위치에서 오프셋 워드를 식별할 수 없는 경우 동기화 손실이 발생할 수 있습니다. 이 경우 계층 2는 모든 비트 그룹에 대해 첫 번째 정보 워드(16비트)가 항상 동일하다는 사실을 활용하여 1비트 동기화 슬립 가능성을 먼저 검토합니다. 첫 번째 정보 워드가 1비트(왼쪽 또는 오른쪽 방향)만큼 벗어난 지점에서 발견되는 경우 동기화가 유지되고 그에 따라 그룹 경계가 조정됩니다. 25번의 그룹 수신에서 비트 오류가 지속되고 동시에 그러한 왼쪽 방향/오른쪽 방향의 1비트 시프트를 통해 동기화를 재설정할 수 없는 경우에는, 동기화가 손실되고 계층 2는 동기화를 위해 포괄적 슬라이딩 윈도우 기반의 탐색으로 재진입합니다.

  • 오류 정정: RDS/RBDS 오류 정정 코드는 (341, 331)에서 축약된 (26, 16) 순환 코드입니다. RBDSErrorCorrection 헬퍼는 [ 1 ]의 Annex B에 설명된 시프트 레지스터 방식을 사용합니다.

세션 및 표현 계층(계층 3)

계층 2가 패리티/오프셋 비트를 제거하므로, 계층 3이 16비트 블록 4개로 구성된 64비트의 그룹을 수신합니다. 최대 32개의 서로 다른 그룹 유형이 있으며, 각 유형은 0에서 15 사이의 숫자와 문자 'A' 또는 'B'(예: 0B, 2A, 3A)로 레이블이 지정됩니다. 각 그룹의 형식은 고정할 수 있으며, 해당 그룹이 개방형 데이터 애플리케이션(ODA, [ 3 ]의 목록 참조)에 할당된 경우 추상 형식도 가능합니다.

계층 3은 RBDSSessionDecoder 헬퍼를 사용하여 구현됩니다. 이 객체는 0A, 0B, 2A, 2B, 3A, 4A, 10A의 고정 형식 그룹 유형에 대한 디코딩을 지원합니다.

  • 0A 및 0B는 8자 문자열을 전달하고, 일반적으로 텍스트가 스크롤(scrolling-text)되면서 표시됩니다.

  • 2A와 2B는 이보다 더 긴 64자 또는 32자 문자열을 전달합니다.

  • 3A는 ODA를 등록하고, 추상 형식의 전용 그룹 유형을 지정합니다.

  • 4A는 시스템 시간을 전달합니다.

  • 그 외에 10A는 'Sports' 프로그램 유형에 대해 'Football' 같은 프로그램 유형을 분류합니다.

ODA에 대해 RDS/RBDS 수신기는 RadioText Plus(RT+) 디코딩을 지원합니다. 이 ODA는 그룹 유형 2A 또는 2B의 32자 또는 64자의 긴 문자열을 두 가지 특정 콘텐츠 유형(예: 아티스트, 노래)으로 세분화할 수 있습니다.

ODA 구현 등록: RadioText Plus(RT+)

RDS/RBDS 수신기는 확장 가능합니다. ODA 구현은 RBDSSessionDecoder 헬퍼의 registerODA' 함수를 사용하여 지정할 수 있습니다. 이 함수는 ODA의 16진수 ID(ODA ID는 [ 3 ]에서 확인할 수 있음)를 받고, 3A 그룹 유형의 ODA 특정 부분뿐만 아니라 기본 ODA 그룹 유형을 처리하는 함수에 대한 핸들도 받습니다. 예를 들어 세션 디코더 RBDSSessionDecoder 객체는 다음 코드를 사용하여 RadioText Plus(RT+)에 대해 확장 가능합니다.

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

예제 코드 실행하기

helperRBDSInit 헬퍼 함수를 사용하여 RDS/RBDS 시스템 파라미터를 설정합니다. 캡처된 데이터 또는 다양한 SDR에서 예제를 실행할 수 있는 설정들이 주석 처리된 코드 라인에 표시됩니다. helperRBDSConfig 헬퍼 함수를 사용하여 RDS/RBDS 시스템을 구성합니다.

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;
% userInput.SignalSource = 'USRP';
% userInput.CenterFrequency = 98.5e6;

[rbdsParam, sigSrc] = helperRBDSConfig(userInput);

RDS/RBDS 파라미터와 함께 FM broadcast receiver System object™를 생성하고 구성합니다.

fmBroadcastDemod = comm.FMBroadcastDemodulator(...
    'SampleRate',228e3, ...
    '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:

  • 첫 번째 필드에는 모든 그룹 유형의 두 번째 정보 워드로 전달되는 프로그램 유형이 포함되어 있습니다. 10A 그룹 유형이 수신된 경우 첫 번째 필드는 Sports \ Football 같은 특성도 추가로 제공합니다.

  • 두 번째 필드에는 0A/0B 그룹에 의해 전달되는 8자 텍스트가 들어 있습니다. 송신된 문자열이 8자를 초과하는 경우 텍스트가 줄 바꿈되어 표시됩니다.

  • 세 번째 필드는 2A/2B 그룹 유형에 의해 전달되는, 더 긴 32자/64자 텍스트가 들어 있습니다.

  • RadioText Plus (RT+): RadioText Plus(RT+) ODA에 11A 같은 추상 형식 그룹 유형이 사용됨을 3A 그룹에서 나타내는 경우 이 섹션이 채워집니다. 이 추상 그룹 유형이 수신되면 그룹 2A/2B에 의해 전달되는 32자/64자 텍스트가 두 개의 부분문자열로 분할됩니다. 부분문자열의 특성을 나타내도록 두 레이블이 업데이트됩니다(예: Artist, Song).

  • Group type receptions: 이 테이블은 기지국에서 어떤 그룹 유형이 어떤 주파수와 함께 수신되었는지를 보여주는 히스토그램 같은 역할을 합니다. 결과적으로, 사용자는 기록된 데이터에서 그래픽 뷰어에 나와 있지 않은 추가 정보(구체적으로, 4A에 표시된 시스템 시간, 0A에 표시된 대체 주파수 등)를 확인해야 할 수 있습니다.

  • 개방형 데이터 애플리케이션(ODA): 3A 그룹 유형이 수신된 경우 이 ODA 목록에는 수신된 각 ODA에 대한 이름과 전용 그룹 유형이 표시됩니다.

심층 탐구

RBDSExampleApp 앱을 사용하여 RDS/RBDS 신호를 더 자세히 살펴볼 수 있습니다. RBDSExampleApp 앱을 사용하여 다음을 수행할 수 있습니다.

  • 신호 소스(캡처 파일이나 RTL-SDR, ADALM-PLUTO 또는 USRP)를 선택할 수 있습니다.

  • (RTL-SDR, ADALM-PLUTO 또는 USRP에 대한) 기지국 주파수를 지정할 수 있습니다.

  • 생성된 C 코드를 통해 RDS/RBDS 수신기의 계층 1과 계층 2를 실행할 수 있습니다. 이는 RDS/RBDS 체인에서 시간이 가장 많이 소모되는 부분으로, 코드를 생성하면 실시간 처리에 도움이 될 수 있습니다.

  • 오디오 재생을 비활성화할 수 있습니다.

  • 수신된 신호를 분석하고 디코딩 프로세스를 보여주는, 스펙트럼 분석기, 시간 스코프 같은 스코프를 열 수 있습니다. 스코프를 활성화하려면 추가적인 계산 작업이 필요하며, 활성화할 경우 실시간 디코딩이 불가능할 수 있습니다. 이 경우 파일에서 불러온 캡처된 신호에 한해 RDS/RBDS 디코딩이 성공할 수 있습니다.

  • 파일에 데이터 기록을 선택하여 다른 그룹 유형에서 RBDS 필드를 기록할 수 있습니다.

다음 함수와 System object에서 RBDS의 구현, 초기화 및 구성을 살펴볼 수 있습니다.

  • RBDSPhyDecoder

  • RBDSCostasLoop

  • RBDSDataLinkDecoder

  • RBDSSessionDecoder

  • helperRBDSInit

  • helperRBDSConfig

참고 문헌

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