1.算法仿真效果
vivado2019.2仿真結(jié)果如下(完整代碼運(yùn)行后無(wú)水印):
設(shè)置SNR=25db

設(shè)置SNR=12db

將波形局部放大:

仿真操作步驟可參考程序配套的操作視頻。
2.算法涉及理論知識(shí)概要
四頻移鍵控(4FSK)是一種常用的數(shù)字調(diào)制方法,具有較高的頻帶利用率和抗干擾性能。它利用不同的頻率來(lái)傳輸二進(jìn)制數(shù)據(jù),通常應(yīng)用于無(wú)線(xiàn)通信和數(shù)據(jù)傳輸?shù)阮I(lǐng)域。
2.1 原理與數(shù)學(xué)公式
4FSK調(diào)制的基本原理是將輸入的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為不同頻率的信號(hào),以實(shí)現(xiàn)數(shù)據(jù)的傳輸。解調(diào)則是將接收到的不同頻率的信號(hào)還原為原始的二進(jìn)制數(shù)據(jù)。
在4FSK調(diào)制中,輸入的二進(jìn)制數(shù)據(jù)被分為兩組,每組有兩個(gè)比特。根據(jù)這兩個(gè)比特的值,選擇相應(yīng)的頻率輸出。具體來(lái)說(shuō),有四個(gè)頻率f1、f2、f3、f4與之對(duì)應(yīng),每個(gè)頻率都代表一個(gè)二進(jìn)制組合(00、01、10、11),即十進(jìn)制的0,1,2,3。
頻率選擇:根據(jù)輸入的比特組合選擇相應(yīng)的頻率輸出。例如,當(dāng)輸入為“00”時(shí),選擇頻率f1;當(dāng)輸入為“01”時(shí),選擇頻率f2;當(dāng)輸入為“10”時(shí),選擇頻率f3;當(dāng)輸入為“11”時(shí),選擇頻率f4。
調(diào)制信號(hào):將選擇的頻率進(jìn)行幅度調(diào)制,以便在傳輸過(guò)程中具有更好的抗干擾性能。通常采用開(kāi)關(guān)鍵控(OOK)或脈沖幅度調(diào)制(PAM)等方法進(jìn)行幅度調(diào)制。
解調(diào)信號(hào):在接收端,根據(jù)不同頻率的信號(hào)進(jìn)行解調(diào)。首先通過(guò)帶通濾波器將所需的頻率信號(hào)提取出來(lái),然后通過(guò)解調(diào)器將其還原為原始的二進(jìn)制數(shù)據(jù)。解調(diào)方法通常采用相干解調(diào)或非相干解調(diào)。
2.2 幀同步
在數(shù)字通信中,信息通常是以幀為單位進(jìn)行組織和傳輸?shù)摹降哪康氖谴_定每一幀的起始位置,以便接收端能夠正確地解調(diào)出每幀中的數(shù)據(jù)。
設(shè)發(fā)送的幀結(jié)構(gòu)為:幀同步碼+ 信息碼元序列 。幀同步碼是具有特定規(guī)律的碼序列,用于接收端識(shí)別幀的起始。
幀同步的過(guò)程就是在接收序列中尋找與幀同步碼匹配的位置,一旦找到匹配位置,就確定了幀的起始位置,后續(xù)的碼元就可以按照幀結(jié)構(gòu)進(jìn)行正確的劃分和處理。
3.Verilog核心程序
//調(diào)制
FSK_mod FSK_mod_u(
.i_clk ????(i_clk),
.i_rst ????(i_rst),
.i_en ?????(i_en),
.i_bits ???(i_bits),
.o_carrier1(o_carrier1),
.o_carrier2(o_carrier2),
.o_carrier3(o_carrier3),
.o_carrier4(o_carrier4),
.o_fsk ????(o_fsk)
);
awgns awgns_u(
.i_clk(i_clk),
.i_rst(i_rst),
.i_SNR(i_SNR), //這個(gè)地方可以設(shè)置信噪比,數(shù)值大小從-10~50,
.i_din(o_fsk),
.o_noise(),
.o_dout(o_fsk_Rn)
);
解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)//解調(diào)
FSK_demod FSK_demod_u(
.i_clk(i_clk),
.i_rst(i_rst),
.i_fsk(o_fsk_Rn),
.o_de_fsk1(o_de_fsk1),
.o_de_fsk2(o_de_fsk2),
.o_de_fsk3(o_de_fsk3),
.o_de_fsk4(o_de_fsk4),
.o_de_ffsk1(),
.o_de_ffsk2(),
.o_de_ffsk3(),
.o_de_ffsk4(),
.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()
);
endmodule