主要内容

FRS/GMRS对讲机接收机

这个例子展示了如何使用MATLAB®和Communications Toolbox™构建一个对讲机接收机。本例遵循的具体无线电标准是FRS/GMRS(家庭无线电服务/一般移动无线电服务)和CTCSS(连续音调编码压音系统)。可以使用模拟信号、捕获信号或从商用对讲机接收的信号RTL-SDR无线电通信工具箱支持包万博1manbetx

本例设计用于符合FRS/GMRS操作的美国标准。这些标准的技术规范可以在下面的参考列表中找到。在其他国家的运作不一定有效。

所需硬件和软件

要使用捕获的信号运行这个示例,您需要以下软件:

要实时接收信号,还需要以下硬件:

  • RTL-SDR广播

  • 步话机

以及以下软件

有关通信工具箱支持的SDR平台的完整列表,请参阅的“MATLAB和Simulink对万博1manbetxSDR的硬件支持”部分万博1manbetx软件定义无线电(SDR)

背景

对讲机提供了一种短距离通信的免费方式。尽管由于移动电话的兴起,步话机的普及程度有所下降,但在信号不足或每分钟费用高昂妨碍手机使用的情况下,步话机仍然很有用。

现代对讲机采用FRS/GMRS标准。这两个标准都使用462或467 MHz的调频(FM),这是在UHF(超高频)波段。

运行示例

单击“Open Script”按钮打开并运行示例。需要输入以下信息:

  1. 接收持续时间(秒)

  2. 信号源(模拟信号、捕获信号或RTL-SDR无线电)

  3. 通道号(1-14)

  4. CTCSS代码(1- 38,0无CTCSS过滤)

  5. 接收信号的检测门限

这个例子通过计算机的扬声器播放接收到的音频。

接收机结构

下面的方框图总结了接收方代码结构。该系统主要由信号源、信道选择器、调频解调器和CTCSS处理四部分组成。

信号源

这个例子可以使用三个信号源:

  1. “模拟信号”:240e3个采样/秒的模拟FRS/GMRS信号

  2. “捕获信号”:从基带文件读取器对象以240e3个采样/秒的速度写入文件的无线信号

  3. “RTL-SDR无线电”:240e3个采样/秒的RTL-SDR无线电

如果您选择“RTL-SDR无线电”作为信号源,此应用程序将在您的计算机中搜索RTL-SDR无线电,并要求您选择其中一个作为信号源。

频道选择器

接收机去除直流分量并对所接收的信号应用可变增益以获得具有较少干扰的近似已知振幅信号。接收机然后应用低通信道分离滤波器来减少来自相邻信道的信号。相邻信道之间的间隙为25千赫,这意味着基带带宽最多为12.5千赫。因此,我们选择截止频率为10 kHz。

接下来,信道选择器计算滤波信号的平均功率。如果它大于阈值(设置为默认值10%),信道选择器确定接收到的信号来自正确的信道,并允许信号通过。对于带外信号,虽然信道分离滤波器降低了其幅度,但仍是调频调制,调频解调后仍会出现调制信号。为了完全拒绝这样的信号,信道选择器输出全部为零。

调频解调器

本例使用FM解调器基带系统对象™,其采样率和最大频率偏差分别设置为240 kHz和2.5 kHz。

CTCSS

首先,抽取滤波器将采样率从240 kHz转换为8 kHz。此速率是主机输出音频设备的本机采样速率之一。然后,CTCSS解码器使用Goertzel算法计算每个CTCSS音频率的功率,并输出功率最大的代码。Goertzel算法提供了一种有效的方法来计算预定频率下的频率分量,即FRS/GMRS使用的音码频率。

脚本将估计的接收代码与预选的代码进行比较。如果两个编码匹配,信号就被传递到音频设备。当预选码为零时,它表示没有使用压制系统,并且无论使用哪个码,决策块都将信道上的信号传递给音频设备。

最后,一个截止频率为260 Hz的高通滤波器过滤掉CTCSS音调,这些音调的最大频率为250 Hz。使用audioDeviceWriter系统对象™通过计算机的扬声器播放接收到的信号。如果您没有听到任何声音,请使用音频设备写入器对象audioPlayer的DeviceName属性选择另一个设备。

示例代码

接收端请求用户输入并初始化变量。然后循环调用信号源、信道选择器、调频解调器和CTCSS处理器。循环还使用帧持续时间和信号源报告的丢失样本来跟踪无线电时间。

信号源的延迟输出指示了实际接收样本的时间,并可用于确定接收器运行的时间有多接近实时。时延值为1,丢失样本值为0,表示系统处于实时运行状态。延迟值大于1表示接收端无法实时处理样本。延迟是根据帧数来报告的。它可以在1到128之间。如果延迟大于128,则样本丢失。

从命令行请求用户输入应用程序参数userInput = helperFRSReceiverUserInput;根据用户输入计算FRS接收机参数[frsRxParams,sigSrc] = helperFRSReceiverConfig(userInput);创建通道选择器组件dcBlocker = dsp。DCBlocker (“算法”“减的意思”);agc = com . agc;channelFilter = frsRxParams.ChannelFilter;创建调频解调器fmDemod = com . fmdemodulator (...“SampleRate”, frsRxParams。FrontEndSampleRate,...“FrequencyDeviation”, frsRxParams.FrequencyDeviation);创建CTCSS和音频输出组件Decimator = dsp。FIRDecimator (...frsRxParams。DecimationFactor,...frsRxParams.DecimationNumerator);解码器= helpfrsctcssdecoder (...“MinimumBlockLength”, frsRxParams。CTCSSDecodeBlockLength,...“SampleRate”, frsRxParams.AudioSampleRate);audioFilter = frsRxParams.AudioFilter;audioPlayer = audioDeviceWriter(frsRxParams.AudioSampleRate);初始化无线电时间radioTime = 0;%主循环radioTime < userInput。持续时间接收基带样本(信号源)如果frsRxParams。isSourceRadio [rcv,~,lost,late] = sigSrc();其他的rcv = sigSrc();Lost = 0;迟到= 1;结束%通道选择器rcv = dcBlocker(rcv);outAGC = agc(rcv);outChanFilt = channelFilter(outAGC);rxAmp = mean(abs(outChanFilt));如果rxAmp > frsRxParams。DetectionThreshold x = outChanFilt;其他的x =复杂(单一(零(frsRxParams。FrontEndSamplesPerFrame, 1)));结束%调频解调器y = fmDemod(x);% CTCSS解码器和音频输出outRC = decimator(y);rcvdCode =解码器(outc);如果(rcvdCode == frsRxParams. ctcsscode) || (frsRxParams。CTCSSCode == 0) rcvdSig = trc;其他的rcvdSig = single(零(frsRxParams。AudioFrameLength, 1));结束audioSig = audioFilter(rcvdSig);audioPlayer (audioSig);%更新无线电时间。如果有丢失的样品,也加进去。radioTime = radioTime + frsRxParams。FrontEndFrameTime +...双(失去)/ frsRxParams.FrontEndSampleRate;结束%释放资源release(fmDemod) release(audioPlayer) release(sigSrc)

进一步的探索

CTCSS解码使用Goertzel算法计算输入信号的DFT(离散傅里叶变换),并计算音调频率处的功率。由于音调频率彼此非常接近(仅相距3-4 Hz),因此DFT的块长度应该足够大,以提供足够的频率分析分辨率。但是,长块长度会导致解码延迟。例如,块长度为16384将导致2秒的延迟,因为CTCSS解码器以8 kHz的采样率工作。这就需要在检测性能和处理延迟之间进行权衡。最佳的块长度可能取决于发射机和接收机的质量、发射机和接收机之间的距离以及其他因素。建议您通过导航到helperFRSReceiverConfig函数并更改CTCSSDecodeBlockLength字段的值来更改初始化函数中的块长度。这将使您能够观察到权衡,并为您的发射机/接收机对找到最佳值。

您可以探索以下功能和系统对象的物理层实现的详细信息:

参考文献