目录
[3.1 2FSK调制](#3.1 2FSK调制)
[3.2 2FSK解调](#3.2 2FSK解调)
[3.3 FPGA实现步骤](#3.3 FPGA实现步骤)
1.引言
基于FPGA的可配置2FSK调制解调系统,核心是将二进制比特流映射为正交两路相位调制信号,经根升余弦滤波成型抑制带外干扰,载波调制后射频发送;接收端先解调、匹配滤波、相位判决,恢复原始比特。载波频率、符号速率、滚降系数通过寄存器配置实现通用化,适配不同通信带宽需求。
2.算法测试效果
本算法的仿真测试结果如下:
matlab测试结果如下:




FPGA测试结果如下:


3.算法涉及理论知识概要
二进制频移键控(2Frequency Shift Keying,2FSK)是数字调频最基础、应用最广泛的调制方式之一,通过两种不同频率的正弦载波分别承载二进制基带信号"0"和"1",将低频基带数字信号搬移到高频信道进行传输。2FSK继承了调频系统抗衰落、抗干扰能力强的优势,相较于2ASK抗信道衰减性能更优异,相较于2PSK不存在载波相位模糊问题,硬件实现简单、解调方式灵活,广泛应用于电力线载波通信、工业无线数传、低速短波通信、RFID标签通信、语音频带内低速数据传输等场景。
3.1 2FSK调制
在数字载波调制技术中,根据基带信号控制载波参数的不同,分为振幅键控(ASK)、频移键控(FSK)、相移键控(PSK)三大基础调制体制。频移键控是利用数字基带信号改变正弦载波频率的调制方式,二进制频移键控2FSK仅选取两个离散频率f1、f2,对应二进制码元0和码元1。

式中:A为载波振幅,常规2FSK为等幅调制,两种频率载波幅度保持一致;fai1、fai2为两个载波的初始相位,根据调制实现方式不同,相位可以连续也可以不连续。
下图是相位连续的2FSK信号波形。

3.2 2FSK解调
FSK信号的解调也有非相干和相干两种,FSK信号可以看作是用两个频率源交替传输得到的,所以FSK的接收机由两个并联的ASK接收机组成。
FSK:频移键控是利用两个不同频率f1和f2的振荡源来代表信号1和0,用数字信号的1和0去控制两个独立的振荡源交替输出。对二进制的频移键控调制方式,其有效带宽为B=2xF+2Fb,xF是二进制基带信号的带宽也是FSK信号的最大频偏,由于数字信号的带宽即Fb值大,所以二进制频移键控的信号带宽B较大,频带利用率小。
FSK功率谱密度的特点如下:
(1) 2FSK信号的功率谱由连续谱和离散谱两部分构成,离散谱出现在f1和f2位置;
(2) 功率谱密度中的连续谱部分一般出现双峰。若两个载频之差|f1 -f2|≤fs,则出现单峰。
3.3 FPGA实现步骤
步骤1:可配置参数模块设计
设置寄存器端口配置载波频率、符号速率、滚降系数,参数输入后更新DDS频率控制字、FIR滤波器系数、实现系统通用化。
步骤2:星座映射
生成I路双极性电平,并行输出至成型滤波器。
步骤3:可配置根升余弦FIR滤波
根据输入的滚降参数,选择不同的滤波器系数,得到对应的FIR滤波器。
步骤4:DDS正交载波调制
由配置的fc生成两路正交正余弦载波,分别与滤波后I相乘叠加,输出中频BPSK调制信号。
步骤5:接收端正交下变频
接收中频信号与本地同步载波相乘,经低通滤波去除高频分量,还原基带I信号。
步骤 6:匹配滤波
加载与发送端相同滚降系数、符号速率的根升余弦系数做FIR匹配滤波,消除码间串扰。
步骤7:星座判决与并串转换
对采样电平极性判决,恢复I路比特,得到原始发送二进制数据。
4.核心程序
module FSK(
input i_clock,
input i_clocksymb,//% 符号速率 (Symbols/s)
input i_reset,
input i_txBits,
input [31:0]i_K1,// 载波频率f1
input [31:0]i_K2,// 载波频率f2
input signed[2:0]i_sel,//000:0.2,001:0.3,010:0.4,011:0.5,100:0.6,101:0.7,110:0.8% RRC滚降系数
input signed[7:0]i_snr,
output signed[15:0]o_fskmod,
output signed[15:0]o_fskmodn,
output signed[15:0]o_Ifilter1,
output signed[15:0]o_Ifilter2,
output o_rxBits
);
//调制
fskmod fskmod_u(
.i_clock (i_clock),
.i_reset (i_reset),
.i_sel (i_sel),
.i_K1 (i_K1),
.i_K2 (i_K2),
.i_txBits (i_txBits),
.o_demod (o_fskmod)
);
awgns awgnsu(
.i_clock (i_clock),
.i_reset (i_reset),
//SNR:5~30
.i_SNR (i_snr),
.i_din (o_fskmod),
.o_noise (),
.o_dout (o_fskmodn)
);
//解调
fskdemod fskdemod_u(
.i_clock (i_clock),
.i_clocksymb (i_clocksymb),
.i_reset (i_reset),
.i_sel (i_sel),
.i_K1 (i_K1),
.i_K2 (i_K2),
.i_fsk_demod (o_fskmodn),
.o_Ydemod1 (),
.o_Ydemod2 (),
.o_yfilter1 (o_Ifilter1),
.o_yfilter2 (o_Ifilter2),
.o_y (o_rxBits)
);
endmodule
5.完整算法代码文件获得
完整程序见博客首页左侧或者打开本文底部GZH名片
( V关注后回复码: X144)
V