目录
1.算法仿真效果
2.算法涉及理论知识概要
2.1 FSK调制解调
2.2 帧同步
3.Verilog核心程序
4.完整算法代码文件获得
1.算法仿真效果
vivado2019.2仿真结果如下(完整代码运行后无水印):
系统包括FSK调制模块,FSK解调模块,AWGN信道模块,误码统计模块,帧同步模块,数据源模块等。
设置SNR=10db
设置SNR=20db
局部放大后看FSK调制解调过程:
仿真操作步骤可参考程序配套的操作视频。
2.算法涉及理论知识概要
频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较 早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,因此在 中低速数字通信系统中得到了较为广泛的应用。
2.1 FSK调制解调
在二进制频移键控中,幅度恒定不变的载波信号的频率随着输入码流的变化而切换(称为高音和低音,代表二进制的1 和0)。产生FSK 信号最简单的方法是根据输入的数据比特是0还是1,在两个独立的振荡器中切换。采用这种方法产生的波形在切换的时刻相位是不连续的,因此这种FSK 信号称为不连续FSK 信号。
由于相位的不连续会造频谱扩展,这种FSK 的调制方式在传统的通信设备中采用较多。随着数字处理技术的不断发展,越来越多地采用连继相位FSK调制技术。目前较常用产生FSK 信号的方法是,首先产生FSK 基带信号,利用基带信号对单一载波振荡器进行频率调制。相位连续的FSK信号的功率谱密度函数最终按照频率偏移的负四次幂衰落。如果相位不连续,功率谱密度函数按照频率偏移的负二次幂衰落。
2-FSK功率谱密度的特点如下:
(1) 2FSK信号的功率谱由连续谱和离散谱两部分构成,离散谱出现在f1和f2位置;
(2) 功率谱密度中的连续谱部分一般出现双峰。若两个载频之差|f1 -f2|≤fs,则出现单峰。
PSK:在相移键控中,载波相位受数字基带信号的控制,如在二进制基带信号中为0时,载波相位为0或π,为1时载波相位为π或0。载波相位和基带信号有一一对应的关系,从而达到调制的目的。
在二进制频移键控(2FSK)中,当传送“1”码时对应于载波频率,传送“0”码时对应于载波频率。 2FSK信号波形可看作两个2ASK信号波形的合成,下图是相位连续的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,则出现单峰。
2.2 帧同步
在数字通信中,信息通常是以帧为单位进行组织和传输的。帧同步的目的是确定每一帧的起始位置,以便接收端能够正确地解调出每帧中的数据。
设发送的帧结构为:帧同步码 + 信息码元序列 。帧同步码是具有特定规律的码序列,用于接收端识别帧的起始。
帧同步的过程就是在接收序列中寻找与帧同步码匹配的位置,一旦找到匹配位置,就确定了帧的起始位置,后续的码元就可以按照帧结构进行正确的划分和处理。
本地同步码的生成
相关运算
判决与同步确定
3.Verilog核心程序
....................................................................
//调制
FSK_mod FSK_mod_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_bits (i_bits),
.o_carrier1(o_carrier1),
.o_carrier2(o_carrier2),
.o_fsk (o_fsk)
);awgns awgns_u(.i_clk(i_clk), .i_rst(i_rst), .i_SNR(i_SNR), //这个地方可以设置信噪比,数值大小从-10~50,.i_din(o_fsk), .o_noise(),.o_dout(o_fskn));//解调
FSK_demod FSK_demod_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_fsk (o_fskn),
.o_de_fsk1 (),
.o_de_ffsk1 (o_de_ffsk1),
.o_bits (o_bits),
.o_bits_data (o_bits_data),
.o_bits_head (o_bits_head),
.o_peak (o_peak),
.o_en_data (o_en_data),
.o_en_pn (o_en_pn),
.o_frame_start (o_frame_start)
);//error calculate
Error_Chech Error_Chech_u(.i_clk(i_clk), .i_rst(i_rst), .i_trans(i_bits), .i_en_data(o_en_data),.i_rec(o_bits_data), .o_error_num(o_error_num), .o_total_num(o_total_num),.o_rec2(o_rec2));0sj_049m
endmodule
4.完整算法代码文件获得
V