基于FPGA的通用化2FSK调制解调模块verilog开发,可配置载波频率,符号速率,滤波滚降系数,SNR

目录

1.引言

2.算法测试效果

3.算法涉及理论知识概要

[3.1 2FSK调制](#3.1 2FSK调制)

[3.2 2FSK解调](#3.2 2FSK解调)

[3.3 FPGA实现步骤](#3.3 FPGA实现步骤)

4.核心程序

5.完整算法代码文件获得


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