FSK过零检测技术软件实现

本文介绍了FSK信号制式及其在来电显示标准中的应用,重点探讨了基于过零检测的FSK软件解调算法。通过限幅、微分、整流等步骤将FSK调制信号转换为ASK信号,再通过滤波器和抽样判决实现解调。文中提供了真实接收信号的仿真验证过程,展示了如何通过门限训练确定最佳解调阈值,最终成功解调出原始的数字信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近调试了一个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。

### MATLAB代码实现2FSK过零检测 为了从给定的音频文件 `AudioDataFile.mat` 中恢复音频数据并确保播放质量清晰无噪声,可以采用2FSK过零检测方法。以下是完整的MATLAB代码实现: ```matlab % 加载音频数据 load('AudioDataFile.mat', 'Aud_data'); Fs = 16000; % 采样频率为16kHz % 参数设置 f_mark = 800; % 高频标记位 (Hz) f_space = 400; % 低频标记位 (Hz) Tb = 1 / f_mark; % 符号周期 (秒) % 过零检测函数定义 function zero_crossings = detect_zero_crossings(signal, Fs) diff_signal = diff(sign(signal)); % 计算信号符号变化 zero_crossings = find(abs(diff_signal) > 0); % 找到过零点位置 end % 提取原始比特流 zero_crossings = detect_zero_crossings(Aud_data, Fs); bit_stream = zeros(1, length(zero_crossings)-1); for i = 1:length(bit_stream) interval = Aud_data(zero_crossings(i):zero_crossings(i+1)); freq_estimation = fft(interval); [~, maxIdx] = max(abs(freq_estimation(1:length(freq_estimation)/2))); if maxIdx >= round(f_mark * Tb * Fs) bit_stream(i) = 1; else bit_stream(i) = 0; end end % 将二进制序列转换回模拟波形 recovered_signal = []; for k = 1:length(bit_stream) if bit_stream(k) == 1 recovered_signal = [recovered_signal sin(2*pi*f_mark*(0:Tb/Fs:Tb))]; else recovered_signal = [recovered_signal sin(2*pi*f_space*(0:Tb/Fs:Tb))]; end end % 播放恢复后的音频 sound(recovered_signal, Fs); % 绘图展示结果 figure; subplot(2,1,1); plot((0:length(Aud_data)-1)/Fs, Aud_data); title('Original Audio Signal'); xlabel('Time (seconds)'); ylabel('Amplitude'); subplot(2,1,2); plot((0:length(recovered_signal)-1)/Fs, recovered_signal); title('Recovered Audio Signal using Zero-Crossing Detection'); xlabel('Time (seconds)'); ylabel('Amplitude'); ``` 这段代码实现了以下功能: - **加载音频数据**:从 `.mat` 文件中读取音频数据。 - **参数配置**:设定调制频率和其他必要参数。 - **过零检测算法**:计算输入信号的过零点来估计传输的数据。 - **解码过程**:基于过零间隔判断发送的是高电平还是低电平,并重建相应的正弦波。 - **可视化对比**:绘制原始和恢复后的音频波形以便直观比较。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值