主要内容

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

这个例子展示了如何使用MATLAB®和Communications Toolbox™从使用RDS或RBDS标准和(可选)RadioText Plus (RT+)标准的FM电台中提取程序或歌曲信息。您既可以使用捕获的信号,也可以使用RTL-SDR Radio或ADALM-PLUTO Radio实时接收信号。

所需硬件和软件

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

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

背景

RBDS和RDS是非常相似的标准,规定了如何用附加信息补充FM无线电信号。RBDS在北美使用,而RDS最初在欧洲使用,并逐渐发展成为国际标准。RBDS和RDS包括3层:

  • 物理层(第一层)

  • 数据链路层(第2层)

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

物理层(第一层)

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

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

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

FM信号包含19 kHz的导频音,可用作57 kHz的RDS / RBD信号的相干解调和38 kHz的立体声音频的相位和频率参考。38 kHz的导频音和57 kHz可以通过加倍和三倍的频率来产生19 kHz导频音的频率[2].

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

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

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

  • 我解调:RDS和RBDS符号以1187.5 Hz速率生成,并在57 kHz载体上进行。57 kHz RDS / RBDS信号可以与频率和相位锁定的57 kHz载波相干地解调。通常,频率三倍的19 kHz导频音质足以用于相干解调。下一个图显示了19 kHz和57 kHz的导频音,57 kHz RDS / RBDS信号和AM-解调的基带RDS / RBDS信号。

同时,存在多个FM站,其57 kHz RDS / RBDS信号表现出从19 kHz导频音的时变相偏移及其频率增加的版本。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.5Hz的RDS / RBD符号速率的时钟。注意,1187.5 Hz x 16 = 19 kHz。要考虑频率偏移,频率划分用于从19 kHz导频音中提取时钟。由于频分操作提供多个正确的答案,因此基带RDS / RBDS信号用作辅助数据,其有助于确定所需的输出。

  • 双相符号译码器:RDS和RBD使用双相级(BI-\φ美元-L)编码,通常称为曼彻斯特编码。在每个时钟周期中,RDS / RBDS符号采用两个相对的幅度值,正为负,或负接合为正。双相符号解码器否定第二幅度级别,使得每个符号在整个时钟周期中保持相同的幅度级别。新的时钟宽幅度级别对应于符号的位表示。以下两个屏幕截图对应于图2中的波形#1-61].

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

  • 差动解码:最后,差别解码比特以还原发送器处的差分编码。

数据链路层(第2层)

层2是使用RBDSDatalinkDecoder.System Object™。该层负责同步和纠错。

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].

会话和表示层(第三层)

第2层去除奇偶校验/偏移位,因此第3层接收64位组,包括4个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实现:RADITEXT PLUS(RT +)

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

rtID =“4 bd7”;RADITEXT PLUS的%十六进制ID(RT +)Registoda(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 / RBD参数配置fmBroadcastDemod = comm.FMBroadcastDemodulator (......“SampleRate”, rbdsParam。FrontEndSampleRate,......“FrequencyDeviation”, rbdsParam。FrequencyDeviation,......“FilterTimeConstant”,rbdsparam.filtertimeconstant,......“AudioSampleRate”,rbdsparam.audiosavepperate,......“立体”, 真的);%创建音频播放器球员= audioDeviceWriter (“SampleRate”,rbdsparam.audiosaveAlderge);%图层2对象datalinkdecoder = rbdsdatalinkdecoder();%第3层对象sessionDecoder = RBDSSessionDecoder ();RadioText Plus (RT+) ODA的%寄存器处理实现:rtID =“4 bd7”;Registoda(SessionDecoder,RTID,@radiotextplusmaingroup,@ radiotextplus3a);%创建数据查看器对象观众= helperRBDSViewer ();%启动查看器并初始化无线电时间start(viewer) radioTime = 0;%主循环radioTime < rbdsParam。持续时间接收基带采样(信号源)rcv = sigsrc();调频广播信号解调,播放解码后的音频autiosig = fmbroadcastdemod(RCV);球员(autiosig);%处理物理层(第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 / RBDS信息

  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中的ODA应用名单

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

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