主要内容

RDS/RBDS和RadioText Plus (RT+)调频接收机

此示例显示了如何使用MATLAB®和通信工具箱™使用RDS或RBD标准从FM无线电台提取程序或歌曲信息,以及可选的RADITELT PLU(RT +)标准。您可以使用RTL-SDR无线电或Adalm-Pluto无线电实时使用捕获的信号或在实时接收信号。

所需硬件和软件

要使用捕获的信号运行此示例,您需要通信工具箱™.为了实时接收信号,您还需要以下硬件之一:

有关“通讯工具箱”支持的SDR平台的完整列表,请参阅“支持的硬件”一节金宝app软件无线电(SDR)

背景

RBD和RDS是非常类似的标准,指定如何使用其他信息补充FM无线电信号。RBD在北美使用,而RDS最初在欧洲使用并演变为国际标准。RBD和RDS包括3层:

  • 物理层(第一层)

  • 数据链路层(第2层)

  • 会话和演示层(第3层)

物理层(第一层)

RDS / rbd PHY解码器接收从文件捕获的信号或从电台接收的实时信号,并执行以下步骤:

  • FM解调:一旦调频信号被解调,RDS/RBDS信号驻留在57 kHz +/- 2.4 kHz频段:

注意,RDS和RBDS信号的传输功率相对较低,因此在调频频谱中并不总是可见的,如上图所示。

调频信号包含19千赫的导频音,可作为57千赫的RDS/RBDS信号和38千赫的立体声音频相干解调的相位和频率参考。将19千赫导频的频率加倍或三倍,可产生38千赫和57千赫的导频[2].

RDS/RBDS信号相干解调的处理步骤如下:

  • 带通滤波: PHY接收机在19 kHz和57 kHz进行带通滤波,分别隔离导频音和RDS/RBDS信号。

  • 频率三倍:将19 kHz导音的复杂表示提高到3次方,使其频率增加3倍,得到57 kHz导音。

  • 是解调: RDS和RBDS符号以1187.5 Hz的频率产生,并被调幅调制到57 kHz的载波。57khz的RDS/RBDS信号可以用锁定在频率和相位的57khz载波相干解调。通常,频率三倍于19 kHz的导频音足以用于相干解调。接下来的图表显示了19千赫和57千赫导频音,57千赫RDS/RBDS信号,以及调幅解调的基带RDS/RBDS信号。

与此同时,有几个调频电台的57千赫RDS/RBDS信号与19千赫导频音及其频率三倍版本相比呈现时变相位偏移。PHY接收器包含一个Costas环路来补偿这种时变相位偏移。

  • 科斯塔斯环: Costas环路执行2个正交的AM解调,其中一个解调为57 kHz正弦,另一个为57 kHz余弦。接收信号的采样率精心选择为228 kHz,每57 kHz周期提供4个采样。因此,57 kHz导频音的一个采样延迟导致1 / 4波长相位偏移,并允许我们从正弦波生成余弦波。正弦解调信号对应于相干解调输出。用余弦解调信号检测相位误差。带正弦波下载188bet金宝搏/余弦波的57 kHz RDS/RBDS信号的产品是用[的第1.7节中规定的滤波器低通滤波。1].两个滤波器输出的乘积是一个错误信号。它越大,19khz导频音被延迟得越多,表现得更像基于余弦的解调器。

  • 时钟提取:为了进行双相码元解码,从19khz导频音中提取一个时钟,匹配1187.5 Hz的RDS/RBDS码元速率。注意,1187.5 Hz x 16 = 19 kHz。为了考虑频率偏移,频率划分被用来从19 kHz导频音中提取时钟。由于分频操作提供了多个正确答案,基带RDS/RBDS信号作为训练数据,帮助确定所需的输出。

  • 双相符号译码器: RDS和RBDS采用双相电平(bi-\φ美元-L)编码,通常被称为曼彻斯特编码。在每个时钟周期中,RDS/RBDS符号取两个相反的振幅值,或正后负,或负后正。双相符号解码器对第二个振幅电平进行反求,以便每个符号在整个时钟周期中保持相同的振幅电平。新的时钟宽振幅电平对应于符号的位表示。以下两张截图对应于图2中的波形#1-6。1].

为了获得每个符号的位值,波形在每个时钟周期上集成,并且将结果与零(切片器)进行比较。

  • 微分解码:最后,在发送端对比特进行差分解码以恢复差分编码。

数据链路层(第2层)

层2是使用RBDSDataLinkDecoder系统对象™。这一层负责同步和错误修正。

PHY层的位输出逻辑上组织为104位组,其中包括4个26位块。每个块包含一个16位信息字和10个奇偶校验位(参见[1])。在每个块的奇偶校验位上添加一个不同的10位偏移字modulo-2。

  • 同步:最初,块和组边界使用104位滑动窗口穷尽地寻找。对于每个104位窗口,在每个26位块的最后10位寻找4个偏移字。如果。则标识偏移字没有检测到位错误在它的块。一旦确定了偏移量,就可以实现组级同步,并停止穷举滑动窗口处理。随后,接下来的104位将被视为下一组。

如果未来组包含位错误,并且无法在其预期位置识别偏移字,则同步可能会丢失。在这种情况下,第2层首先检查1位同步滑动的可能性,利用所有位组总是相同的第一信息字(16位)的事实。如果找到第一信息词被1位错位(向左或向右),则保留同步并且相应地调整组边界。如果25个组接收的位错误持续存在,并且在同一时间使用这种向左/向右的1位移偏移不能重新建立同步,则同步丢失,并且第2层重新进入基于穷举的滑动窗口的搜索进行同步。

  • 误差修正: RDS/RBDS纠错码是由(341,331)缩短而来的(26,16)循环码。的误差修正的实现使用的移位寄存器方案见[1].

会话和演示层(第3层)

层2去除奇偶校验/偏移位,因此层3接收64位的组,包括四个16位块。存在多达32种不同的组类型,每个类型标记为0到15的数字,而字母'a'或'b',例如0b,2a,3a。可以修复每个组的格式,或者如果为打开的数据应用程序(ODA)分配此组,则可以抽出它可以抽象,请参阅[3.])。

层3是使用RBDSSessionDecoder系统对象。该对象支持0A, 0B,金宝app 2A, 2B, 3A, 4A, 10A固定格式组类型的解码。

  • 0A和0B传递一个8个字符的字符串,该字符串通常以滚动文本的方式更改。

  • 2A和2B传递更长的64或32个字符的字符串。

  • 3A注册oda并指定它们专用的抽象格式组类型。

  • 4A表示系统时间。

  • 10A进一步将节目类型分类(例如,将‘Football’替换为‘Sports’节目类型)。

对于oda, RDS/RBDS接收器支持对RadioText P金宝applus (RT+)的解码。这个ODA可以将类型2A或2B的32或64个字符的长字符串分解为两种特定的内容类型(例如,艺术家和歌曲)。

注册ODA实现:RadioText Plus (RT+)

RDS/RBDS接收器是可扩展的。可以使用registerODA的函数RBDSSessionDecoder系统对象。此函数接受ODA的十六进制ID (ODA ID可以在[3.]),并处理处理主要ODA组类型以及3A组类型中ODA特定部分的功能。例如,sessionDecoder RBDSSessionDecoder对象可以使用以下代码为RadioText Plus (RT+)扩展:

rtID =“4 bd7”;% RadioText Plus的十六进制ID (RT+)registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A);

运行示例代码

在MATLAB命令窗口中输入RBDSExample或单击这个链接运行示例。

%设置RDS/RBDS系统参数userInput = helperRBDSInit ();userInput。持续时间= 10.8; userInput.SignalSource =“文件”;userInput。SignalFilename =“rbds_capture.bb”;% userInput。SignalSource =“RTL-SDR”;% userInput。CenterFrequency = 98.5 e6;% userInput。SignalSource =“ADALM-PLUTO”;% userInput。CenterFrequency = 98.5 e6;[rbdsParam, sigSrc] = helperRBDSConfig(userInput);%创建FM广播接收器对象,并根据RDS/RBDS参数进行配置fmBroadcastDemod = comm.FMBroadcastDemodulator (...“SampleRate”,rbdsparam.frontendsamplerate,...“FrequencyDeviation”, rbdsParam。FrequencyDeviation,...'filtertimeconstant', rbdsParam。FilterTimeConstant,...“AudioSampleRate”, rbdsParam。AudioSampleRate,...“立体”,真正的);%创建音频播放器球员= audioDeviceWriter (“SampleRate”, rbdsParam.AudioSampleRate);%图层2对象datalinkDecoder = RBDSDataLinkDecoder ();%图层3对象sessionDecoder = RBDSSessionDecoder ();RadioText Plus (RT+) ODA的%寄存器处理实现:rtID =“4 bd7”;registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A);%创建数据查看器对象查看器= HelperrbdsViewer();启动查看器并初始化广播时间start(viewer) radioTime = 0;%主循环radioTime < rbdsParam。持续时间%接收基带样本(信号源)rcv = sigSrc ();调频广播信号解调,播放解码后的音频audioSig = fmBroadcastDemod (rcv);球员(audioSig);%处理物理层(第1层)bitsPHY = RBDSPhyDecoder(rcv, rbdsParam);%进程数据链路层(第2层)[enabled, iw1, iw2, iw3, iw4] = datalinkDecoder(bitsPHY);%进程会话和演示层(第3层)outStruct = sessionDecoder(enabled, iw1, iw2, iw3, iw4);%查看结果包内容(数据查看器)更新(观众、outStruct);%更新无线电时间radioTime = radioTime + rbdsparam . frameeduration;结束%停止查看器并释放信号源和音频编写器停止(观众);释放(sigSrc);释放(球员);

查看结果

上面的截图演示了处理后的RDS/RBDS数据的图形显示。

  • 基本的RDS / rbd的信息

  1. 第一个字段对应于程序类型,由所有组类型的第二个信息字传递。如果接收到10A组类型,第一个字段还提供进一步的特性,例如Sports \足球

  2. 第二个字段说明了由0A/0B组传递的8个字符的文本。

  3. 第三个字段说明了由2A/2B组类型传递的较长的32/64字符文本。

  • RadioText + (RT +)如果任何3A组表明RadioText Plus (RT+) ODA使用抽象格式组类型,例如11A,则使用此部分。然后,在接收到这种抽象组类型后,由组2A/2B传递的32/64个字符的文本将被分割为两个子字符串。此外,这两个标签将被更新以描述子字符串(如Artist和Song)的特征。

  • 组类型招待会:表格作为一个直方图,说明从一个电台接收到的组类型和频率。因此,用户可能希望查看已记录的数据,以获得图形查看器中没有描述的进一步信息(具体来说,4A中的系统时间、0A中的交替频率等)。

  • 开放数据应用(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对象的实现:

选定的参考书目

  1. 国家无线电系统委员会,美国RBDS标准,1998年4月

  2. Der,劳伦斯。“调频(FM)教程”。硅实验室公司。

  3. 国家无线电系统委员会,官方发展援助在RDS中的应用清单

  4. 无线电文本加(RT+)规范

  5. Joseph P. Hoffbeck,“基于Simulink®和USRP的教学通信系统”,ASEE年会,圣安东尼奥金宝app,德克萨斯州,2012年6月