FSK过零检测技术软件实现

前言

最近调试了一个FSK解调的项目,期间换了两种算法,其中基于过零检测技术的FSK软件解调方法最后是最好用的一种,特意分享出来给大家!
先附上对应github源码连接:fsk过零检测github源码地址(经过工程验证)

原理

FSK信号制式描述

根据《中国来电显示标准》,在两次振铃之间产生数据传送。FSK制式信号是连续相位移频键控,由两种不同的频率表示逻辑0和逻辑1。
FSK数据要求:
逻辑1: 1200Hz±1%
逻辑0: 2200Hz±1%
传输速率: 1200bit/s±1%
在基于特定平台的路由交换系统中,其交换机的发送速率为8KHz,接收速率也为8KHz。
在这里插入图片描述

如图所示,为单数据消息帧格式,在现在的交换机系统中,其由固定的300个0/1交替组成的信道占用信号,180个连续1组成的标志信号,10个bit组成的消息字组成,消息字中间存在7个连续的1组成的标志位。

算法描述

过零检测法是一种常用且简便的解调方法,2FSK信号的过零点数随载频的变化而不同,因此检测出过零点个数就可以得到载频的差异,从而进一步得到调制信号的信息,过零检测法的原理如下:
在这里插入图片描述

如图所示,为过零检测法解调原理。其目的是将FSK调制的采样信号转换为ASK调制的信号。FSK信号经过限幅、微分、整流后形成与频率变化相对应的脉冲序列,由此再形成 相同宽度的矩形脉冲,矩形脉冲的低频分量与数字信号相对应,由滤波器滤出低频分量, 然后经抽样判决,即可得到原始的数字调制信号。
过零检测法本质是一种模拟解调的方法,这里用数字信号处理的方式对其进行了软件实现。

仿真分析

这里采用了一段真实接收的信号作为仿真验证。
在这里插入图片描述

如图所示,一段1.2KHz的FSK调制信号由8KHz的AD进行采样,大约9000个采样点。前1000个点是响铃,后边一长段是一段信号的有用数据。
在进行数字信号处理前,对其进行3倍插值。一段8KHz采样的1.2KHz频率的信号,每20个采样点有3个完整bit,单个bit有6~7个采样点。为了使其方便后续处理,对采样点进行3倍插值,插值后的数据每20个采样点代表1个完整的bit。
采样数据3倍插值后,对其放大限幅,这里实际进来的是满量程的short型数据,所谓的放大限幅是将其转换为了能够代表变化快慢的方波,所以这里对其修改为,大于0的为幅值100,小于0的为幅值-100。

图4 放大限幅后的数据

微分部分,在数字信号处理中用差分表示,用后一个采样bit减去前一个采样bit即可。
在这里插入图片描述

随后对其进行整流,这里直接对其取绝对值。
在这里插入图片描述

然后对其进行相同脉宽的脉宽调制,这里每有一个幅值为200的点,将其宽度扩展为3个点处理。

在这里插入图片描述

对输入的原始采样数据进行一系列处理后,将其调制为了如图所示的脉冲数随频率变化的脉宽信号。将频率不同的脉宽信号过低通滤波器,滤除其高频分量。
在这里插入图片描述
在这里插入图片描述

能得到这张图就已经解调成功了。
从图中可以看到,不同频率的信号明显被调制为了不同幅度的信号,变化快的2.2KHz信号幅值高,变化慢的1.2KHz信号幅值低。图9为一段数据的全部输出,前边交替变化的是300个0、1,中间一段低幅值信号是180个1,后边的则是0开始1结尾的消息字和穿插在其中的标志位。
将FSK经过如上方法转换为了ASK信号,将其找到一个合适的门限值,即可将0和1准确判断出来。

如图所示,将86作为此次数据的门限值,超过门限的做0处理,低于门限的做1处理。从图中可以看出,0和1bit基本是每20个采样点一个的。实际C代码编写中,将300个信道占用信号0、1对门限进行训练。
训练方法为,初始化门限值为80,300个信道占用信号有总计6000个采样点,利用其中5000个采样点,每200个为一组,分为25组。因为200个点是10个bit的0、1值,并且0和1的数量是相等的,将其200个点进行累加,理论值是100,利用这些数据对门限进行调节,最终使门限值收敛与接近最优的门限值。

在这里插入图片描述

如图所示,门限值逐步收敛于一个定值。

在这里插入图片描述

如图所示,按照门限值,大于门限值为1,小于门限值为0。每20个bit进行一次判决,大于10的为0,小于10的为1。即可解调出正确bit。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MATLAB是先进的技术软件,除了基础的数学计算和图像处理功能外,它还可以用于无线通信系统的设计和模拟。在无线通信中,2FSK是一种流行的调制技术,被广泛应用于数字通信系统中。 2FSK过零检测是有关键的一步,可以通过MATLAB编程来实现这个过程。首先,我们需要定义两个载波频率$f_1$和$f_2$,它们分别对应于‘0’和‘1’数据的频率。假设$f_1=1000Hz$,$f_2=1200Hz$,为了保证无干扰的信号,两个载波频率之间的距离应该足够远,通常要大于调频带宽。 然后,我们使用一个数字信号作为输入信号,它的取值代表‘0’和‘1’数据。例如,我们可以使用随机的二进制数字序列作为数据源。接着,我们将数据信号和载波频率相乘,并使用长度为$N$的窗口函数对信号进行加窗处理。 接下来,我们可以使用Matlab中的FFT函数对加窗后的信号进行傅里叶变换。傅里叶变换可以将时域信号转换为频域信号,如此一来我们可以计算出信号在频域上的幅度和相位。 通过比较两个载波频率对应的幅度值和相位差,我们可以判断出输入信号的数据是否为‘0’或‘1’。当输入信号的数据为‘0’时,对应的频率为$f_1$,因此幅度值和相位差的差值应该趋近于零; 当输入信号的数据为‘1’时,对应的频率为$f_2$,因此幅度值和相位差的差值应该趋近于$\pi$。 综上所述,MATLAB编程可以实现2FSK过零检测的功能,它是无线通信系统中重要的一环,为数字通信系统的正常工作提供了完美的数据支持。 ### 回答2: MATLAB中产生二进制频移键控(2FSK过零检测代码可以通过以下步骤实现: 1. 定义信号:使用MATLAB生成一个基础的2FSK信号,该信号由两个频率分别对应二进制0和1构成。可以使用MATLAB的sine或者square函数来实现。 2. 添加噪声:生成一定程度的高斯白噪声加到信号中,增加实际工作环境下的噪声干扰。 3. 调用过零检测函数:MATLAB中的zerocross函数可以检测信号过零点的时间,并返回这些时间的矢量。可以将生成的有噪声的2FSK信号输入到zerocross函数中,可以获得信号通过零点的时间。 4. 检测与处理交错的过零点:当信号通过频率转变点时,过零点会有交错发生。要检测和处理这些交错的过零点,可以使用Matlab的findpeaks函数。对zerocross函数生成的矢量进行峰值查找,通过检测峰值,确定这些峰值代表的信号过零点的位置。 5. 恢复数字信号:根据交错过零点的位置,可以将信号分割成一个个数据包,并恢复原始的2FSK数字信号。将通过零点的时间转化为数字信号,可以使用某些算法进行数字信号的分离和还原。 总之,这是一个简单的MATLAB二进制频移键控(2FSK过零检测的流程,在实际应用中可能需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值