主要内容

FRS / gmr步话机接收器

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

本示例设计用于FRS/GMRS操作的美国标准。这些标准的技术规范可在下面的参考列表中找到。在其他国家进行的操作可能行得通,也可能行不通。

所需硬件和软件

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

为了实时接收信号,还需要以下硬件设备:

  • RTL-SDR广播

  • 步话机

和以下软件

有关通信工具箱支持的SDR平台的完整列表,请参阅的“SDR的MATLAB和Simulink硬件支持”一节软件定义无线电(SDR)

背景

对讲机提供了一种无需订阅的短距离通信方式。尽管步话机的普及程度因手机的兴起而有所下降,但当信号不足或每分钟收费过高阻碍手机使用时,步话机仍然很有用。

现代步话机按FRS/GMRS标准运行。这两个标准都使用462或467兆赫的调频(FM),这属于超高频(Ultra High frequency)波段。

运行示例

单击“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无线电”:RTL-SDR无线电,频率为240e3个采样/秒

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

频道选择器

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

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

调频解调器

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

CTCSS

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

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

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

示例代码

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

信号源的延迟输出指示了实际接收到样本的时间,并可用于确定接收器运行的实时程度。当latency值为1,lost samples值为0时,表示系统处于实时运行状态。延迟值大于1表示接收器无法实时处理样本。延迟是根据帧数来报告的。取值范围在1到128之间。如果延迟大于128,则会丢失样本。

从命令行请求用户输入应用程序参数userInput = helperFRSReceiverUserInput;%根据用户输入计算FRS接收机参数[frsRxParams, sigSrc] = helperFRSReceiverConfig (userInput);创建通道选择器组件dcBlocker = dsp。DCBlocker (“算法”“减的意思”);agc = comm.AGC;channelFilter = frsRxParams.ChannelFilter;创建FM解调器fmDemod = comm.FMDemodulator (...“SampleRate”, frsRxParams。FrontEndSampleRate,...“FrequencyDeviation”, frsRxParams.FrequencyDeviation);创建CTCSS和音频输出组件杀害多人者= dsp。FIRDecimator (...frsRxParams。DecimationFactor,...frsRxParams.DecimationNumerator);解码器= helperFRSCTCSSDecoder (...“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 ();失去了= 0;晚= 1;结束%频道选择器rcv = dcBlocker (rcv);outAGC = agc (rcv);outChanFilt = channelFilter (outAGC);rxAmp =意味着(abs (outChanFilt));如果rxAmp > frsRxParams。检测阈值x = outChanFilt;其他的复杂(单(x = 0 (frsRxParams。FrontEndSamplesPerFrame, 1)));结束%调频解调器y = fmDemod (x);CTCSS解码器和音频输出outRC =杀害多人者(y);rcvdCode =解码器(outRC);如果(rcvdCode == frsRxParams. ctcsscode) || (frsRxParams. ctcsscode)CTCSSCode == 0) rcvdSig = outc;其他的rcvdSig =单(0 (frsRxParams。AudioFrameLength, 1));结束audioSig = audioFilter (rcvdSig);audioPlayer (audioSig);%更新无线电时间。如果有丢失的样品,也加进去。radioTime = radioTime + frsRxParams。FrontEndFrameTime +...双(失去)/ frsRxParams.FrontEndSampleRate;结束%释放资源发行版(fmDemod)发布(audioPlayer)发布(sigSrc)

进一步的探索

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

您可以探索以下函数和系统对象以了解物理层实现的详细信息:

参考文献

Baidu
map