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