主要内容

FRS / gmr步话机接收器

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

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

所需硬件和软件

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

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

  • RTL-SDR无线电

  • 步话机

和下面的软件

要获得通信工具箱支持的SDR平台的完整列表,请参阅“用于SDR的MATLAB和Sim金宝appulink硬件支持”一节金宝app软件定义无线电(SDR).

背景

无线对讲机提供了一种无需订阅的短距离通讯方式。虽然随着手机的普及,对讲机的普及程度有所下降,但在信号不好或每分钟收费高的情况下,对讲机仍然很有用。

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

运行示例

类型FRS接收示例在MATLAB命令窗口或单击“打开示例”按钮,打开并运行示例。您需要输入以下信息:

  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无线电,并要求您选择其中一个作为信号源。

频道选择器

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

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

调频解调器

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

CTCSS

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

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

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

示例代码

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

信号源的延迟输出指示实际接收样本的时间,可用于确定接收机运行的实时性。延迟值为1,丢失样本值为0表示系统正在实时运行。延迟值大于1表示接收器无法实时处理样本。根据帧数报告延迟。它可以介于1和128之间。如果延迟大于128,则样本丢失。

%从命令行请求用户输入应用程序参数userInput=helperFRSReceiverUserInput;%根据用户输入计算FRS接收机参数[frsRxParams, sigSrc] = helperFRSReceiverConfig (userInput);%创建通道选择器组件dcBlocker=dsp.dcBlocker(“算法”,“减去平均值”);agc = comm.AGC;channelFilter = frsRxParams.ChannelFilter;%创建调频解调器fmDemod=通信FMDemodulator(...“SampleRate”, frsRxParams。FrontEndSampleRate,...“FrequencyDeviation”, frsRxParams.FrequencyDeviation);%创建CTCSS和音频输出组件杀害多人者= dsp。FIRDecimator (...frsRxParams。DecimationFactor,...frsRxParams.DecimationNumerator);解码器= helperFRSCTCSSDecoder (...“MinimumBlockLength”,frsRxParams.ctcssdecordblocklength,...“SampleRate”,frsRxParams.AudioSampleRate);audioFilter=frsRxParams.audioFilter;audioPlayer=audioDeviceWriter(frsRxParams.AudioSampleRate);初始化无线电时间radioTime = 0;%主循环无线电时间<用户输入。持续时间接收基带采样(信号源)如果frsRxParams。isSourceRadio [rcv,~,lost,late] = sigSrc();其他的rcv=sigSrc();丢失=0;迟发=1;结束%频道选择器rcv = dcBlocker (rcv);outAGC = agc (rcv);outChanFilt = channelFilter (outAGC);rxAmp =意味着(abs (outChanFilt));如果rxAmp>frsRxParams.DetectionThreshold x=outChanFilt;其他的x=复数(单个(零(frsRxParams.FrontEndSamplesPerFrame,1));结束%调频解调器y=fmdem(x);% CTCSS解码器和音频输出outRC =杀害多人者(y);rcvdCode =解码器(outRC);如果(rcvdCode == frsRxParams. ctcsscode)CTCSSCode == 0) rcvdSig = routc;其他的rcvdSig=单个(零(frsRxParams.AudioFrameLength,1));结束audioSig=音频滤波器(rcvdSig);音频播放器(audioSig);%更新电台时间。如果有丢失的样本,也把它们加起来。radioTime = radioTime + frsRxParams。FrontEndFrameTime +...双(丢失)/frsRxParams.FrontEndSampleRate;结束%释放资源发行版(fmDemod)发布(audioPlayer)发布(sigSrc)

进一步的探索

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

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

参考文献