基於FPGA的BPSK調製解調系統,包含testbench,高斯通道模組,誤位元速率統計模組,可以設定不同SNR

我爱C编程發表於2024-08-10

1.演算法模擬效果

本系統在以前寫過的BPSK調製解調系統的基礎上,增加了高斯通道模組,誤位元速率統計模組,可以驗證不同SNR情況下的BPSK誤碼情況。

vivado2019.2模擬結果如下(完整程式碼執行後無水印):

SNR=0db:

SNR=5db:

系統RTL結構如下:

2.演算法涉及理論知識概要

BPSK訊號與2ASK訊號的時域表示式在形式上是完全相同的,所不同的只是兩者基帶訊號s(t)的構成,一個由雙極性NRZ碼組成,另一個由單極性NRZ碼組成。因此,求BPSK訊號的功率譜密度時,也可採用與求2ASK訊號功率譜密度相同的方法。

1)當雙極性基帶訊號以相等的機率(p=1/2)出現時,BPSK訊號的功率譜僅由連續譜組成。BPSK訊號的功率譜由連續譜和離散譜兩部分組成。其中,連續譜取決於數字基帶訊號s(t)經線性調製後的雙邊帶譜,而離散譜則由載波分量確定。

2)BPSK的連續譜部分與2ASK訊號的連續譜基本相同(僅差一個常數因子)。因此,BPSK訊號的頻寬、頻帶利用率也與2ASK訊號的相同。

在數字調製中,BPSK(後面將會看到2DPSK也同樣)的頻譜特性與2ASK十分相似。相位調製和頻率調製一樣,本質上是一種非線性調製,但在數字調相中,由於表徵資訊的相位變化只有有限的離散取值,因此,可以把相位變化歸結為幅度變化。這樣一來,數字調相同線性調製的數字調幅就聯絡起來了,為此可以把數字調相訊號當作線性調製訊號來處理了。但是不能把上述概念推廣到所有調相訊號中去。

BPSK (Binary Phase Shift Keying)-------二進位制相移鍵控。是把模擬訊號轉換成資料值的轉換方式之一,利用偏離相位的複數波浪組合來表現資訊鍵控移相方式。BPSK使用了基準的正弦波和相位反轉的波浪,使一方為0,另一方為1,從而可以同時傳送接受2值(1位元)的資訊。

由於最單純的鍵控移相方式雖抗噪音較強但傳送效率差,所以常常使用利用4個相位的QPSK和利用8個相位的BPSK。

二進位制相移鍵控(BPSK)訊號進行相干解調的系統,其包括:用於從所述BPSK訊號中恢復出頻率為2F的載波訊號(C)的裝置;用於將頻率為2F的所述訊號注入到注入鎖定振盪器(ILO)中的裝置,該注入鎖定振盪器的固有諧振頻率為f↓[r],該f↓[r]大致等於f,該注入鎖定振盪器提供用於恢復具有(θ↓[e]-k)/2相移的原始載波的差分輸出(o↓[p]、o↓[n])訊號,其中θ=arcsin[(f↓[r]-r)/αA↓[i]f],其中α和k是取決於所述注入鎖定振盪器(ILO)中的主要非線性的型別的引數,而A↓[i]是所恢復的頻率為2f的載波訊號的幅值,以及用於將所述差分輸出(o↓[p]、o↓[n])訊號與所述輸入BPSK訊號的副本進行組合,以產生解調訊號(DEMOD)的裝置。

3.Verilog核心程式

`timescale 1ns / 1ps
 
module test_BPSK;
 
 
reg i_clk;
reg i_rst;
reg i_bits;
reg signed[7:0]i_SNR;
wire signed[1:0]o_nz;
wire signed[15:0]o_fir;
wire signed[15:0]o_carrier;
wire signed[31:0]o_mod;
wire signed[15:0]o_modn;
wire signed[15:0]o_carrier_local;
wire signed[31:0]o_dw;
wire signed[31:0]o_demod ;
wire signed[31:0]o_error_num;
wire signed[31:0]o_total_num; 
BPSK uut(
.i_clk(i_clk),
.i_rst(i_rst),
.i_bits(i_bits),
.i_SNR(i_SNR),
.o_nz(o_nz),
.o_fir(o_fir),
.o_carrier(o_carrier),
.o_mod(o_mod),
.o_modn(o_modn),
.o_carrier_local(o_carrier_local),
.o_dw(o_dw),
.o_demod(o_demod),
.o_error_num(o_error_num),
.o_total_num(o_total_num)
);
 
 
 
initial
begin
    i_clk = 1'b1;
    i_rst = 1'b1;
    i_SNR=5;//這個地方可以設定訊雜比,數值大小從0~50,
    #1000
    i_rst = 1'b0;
end
initial
begin
    i_bits= 1'b0;
    #1000
    repeat(10000)
    begin
    #2560
    i_bits= 1'b1;
    #2560
    i_bits= 1'b0;
    #2560
    i_bits= 1'b0;
    #5120
    i_bits= 1'b1;
    #640
    i_bits= 1'b1;
    #2560
    i_bits= 1'b0;
    #2560
    i_bits= 1'b1;
    #2560
    i_bits= 1'b1;
    #2560
    i_bits= 1'b0;
    #2560
    i_bits= 1'b0;
    #320
    i_bits= 1'b0;
    #320
    i_bits= 1'b0;
    #320
    i_bits= 1'b1;
    #640
    i_bits= 1'b1;
    #2560
    i_bits= 1'b0;
    #2560
    i_bits= 1'b1;
    #2560
    i_bits= 1'b0;
    end
end
always #5 i_clk=~i_clk;
endmodule
0sj_006m

  

相關文章