m テストベンチと MATLAB 補助検証プログラムを含む、FPGA ベースの QPSK ソフト復調 Verilog 実装

目次

1. アルゴリズムシミュレーション効果

2. アルゴリズムには理論的知識の概要が含まれます

3. Verilogコアプログラム

4. 完全なアルゴリズム コード ファイル


1. アルゴリズムシミュレーション効果


このシステムは、次の 2 つのプラットフォームで開発されました。

Vivado2019.2

Quartusii18.0+ModelSim-Altera 6.6d スターターエディション

Vivado2019.2 のシミュレーション結果は次のとおりです。

 

 Quartusii18.0+ModelSim-Altera 6.6d Starter Editionのテスト結果は以下の通りです。

 

マットラボのテスト:

2. アルゴリズムには理論的知識の概要が含まれます

       QPSK は一般的に使用される変調方式で、2 ビットを複素平面上の位相点にマッピングすることで効率的な信号伝送を実現します。ソフト復調は、受信信号の確率推定に基づいた復調方法であり、より優れたパフォーマンスを提供できます。この記事では、信号のサンプリング、位相推定、判定、復調など、QPSK ソフト復調の実装プロセスを段階的に紹介します。ソフト復調は、確率的推定によって復調を実現する方法であり、チャネル ノイズが存在する場合でも優れたパフォーマンスを提供できます。QPSK は、2 ビットを位相点にマッピングすることで効率的な信号伝送を可能にする、一般的に使用される変調方式です。この記事では、信号のサンプリング、位相推定、判定、復調などのステップを含む、QPSK ソフト復調の実装プロセスを詳細に紹介することを目的としています。

ステップ
2.1の信号サンプリングを実現

       受信された QPSK 信号はサンプリング操作を受けて、離散時間信号シーケンスが取得されます。サンプリング レートはナイキスト サンプリング定理を満たす必要があり、通常はビット レートの 2 倍です。
2.2 判定

       QPSK 信号復調では、各信号シンボルのバイナリ ビット値を決定するために決定プロセスが使用されます。決定プロセスは、受信信号の位相に従って分割され、異なるビット値にマッピングされます。
       受信信号系列をr[n]とすると、判定処理の結果が判定シンボルd_hatとなる。一般的な判定式は次のとおりです。
if theta_hat >​​ -pi/4 && theta_hat <= pi/4
d_hat = [1, 1]
elseif theta_hat >​​ pi/4 && theta_hat <= 3pi/4
d_hat = [0, 1 ]
elseif theta_hat >​​ 3pi/4 || theta_hat <= -3*pi/4
d_hat = [0, 0]
else
d_hat = [1, 0] 2.3 復調
を終了

         復調プロセスでは、決定されたビット値を生データ ビットに変換します。復調プロセスでは、マッピング テーブルに従って決定ビット値を元のデータ ビットに変換します。判定ビット値をd_hatとすると、復調処理の結果は復調ビットdとなる。一般的な復調式は次のとおりです。
if d_hat == [1, 1]
d = [0, 0]
elseif d_hat == [0, 1]
d = [0, 1]
elseif d_hat == [0, 0]
d = [ 1, 0]
else
d = [1, 1]
終了

2.4 ソフト復調

        ソフト復調は QPSK ソフト復調の重要なステップであり、復調の精度を向上させるために、決定シンボルと位相推定の結果を使用して確率推定を実行します。判定シンボルをd_hatとすると、軟復調処理の結果は軟復調シンボルdとなる。一般的なソフト復調の公式は次のとおりです: d = d_hat / P(d_hat|r[n])

        このうち、P(d_hat|r[n])は、信号r[n]を受信した条件下で、判定シンボルd_hatがd_hatである確率を表す。確率は、信号点の確率分布関数を推定したり、最尤推定などの手法を用いて求めることができる。ソフト復調プロセスでは、復調の精度を向上させるために確率推定が必要です。これには、信号点の確率分布関数を推定するか、ノイズの影響を適切に考慮する必要がある他の確率推定方法を使用することが含まれます。

3. Verilogコアプログラム

`timescale 1ns / 1ps


module TEST();

reg i_clk;
reg i_clkSYM;
reg i_rst;
reg i_dat;
 

wire signed[15:0]o_Ifir_T;
wire signed[15:0]o_Qfir_T;
wire signed[15:0]o_cos_T;
wire signed[15:0]o_sin_T;
wire signed[31:0]o_modc_T;
wire signed[31:0]o_mods_T;
wire signed[31:0]o_mod_T;

wire signed[15:0]o_cos_R;
wire signed[15:0]o_sin_R;
wire signed[31:0]o_modc_R;
wire signed[31:0]o_mods_R;
wire signed[31:0]o_Ifir_R;
wire signed[31:0]o_Qfir_R;
wire signed[15:0]o_b1;
wire signed[15:0]o_b2;
wire signed[15:0]o_dat;
//QPSK调制
TQPSK TQPSKU(
.i_clk  (i_clk),
.i_clkSYM(i_clkSYM),
.i_rst  (i_rst),
.i_dat(i_dat),
 

.o_Ifir (o_Ifir_T),
.o_Qfir (o_Qfir_T),
.o_cos  (o_cos_T),
.o_sin  (o_sin_T),
.o_modc (o_modc_T),
.o_mods (o_mods_T),
.o_mod  (o_mod_T)
);


//QPSK解调
RQPSK RQPSKU(
.i_clk  (i_clk),
.i_rst  (i_rst),
.i_clkSYM(i_clkSYM),
.i_med  (o_mod_T[25:10]),
.o_cos  (o_cos_R),
.o_sin  (o_sin_R),
.o_modc (o_modc_R),
.o_mods (o_mods_R),
.o_Ifir (o_Ifir_R),
.o_Qfir (o_Qfir_R),
.o_b1   (o_b1),
.o_b2   (o_b2),
.o_dat  (o_dat)
);

initial
begin
    i_clk = 1'b1;
    i_clkSYM=1'b1;
    i_rst = 1'b1;
    #1600
    i_rst = 1'b0;
end

always #5 i_clk=~i_clk;
always #80 i_clkSYM=~i_clkSYM;


initial
begin
    i_dat = 1'b0;
    #1440
    repeat(10)
    begin
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b0;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b1;
    #160 i_dat = 1'b0;
    
    
    end
    $stop();
end
//reg[7:0]cmnts;
//always @(posedge i_clk or posedge i_rst)
//begin
//     if(i_rst)
//	  begin
//	  cmnts <= 8'd0;
//	  i_Ibits_T<=1'b0;
//	  i_Qbits_T<=1'b0;
//	  end
//else begin
//	  cmnts <= cmnts + 8'd1;
//	  i_Ibits_T<=cmnts[5];
//	  i_Qbits_T<=cmnts[6];
//     end
//end



endmodule
00_026m

4. 完全なアルゴリズム コード ファイル

V

おすすめ

転載: blog.csdn.net/hlayumi1234567/article/details/131730855