PM的正交解调法

1.PM的模拟调制过程

​ PM信号是一种相位调制信号,其携带的信息保存在其信号的相位中,通过改变载波的相位来实现基带数据的传输。

其函数表达式如下:

\[s(t) = A*cos(w_c*t + K_f*m(t)) \]

其中:
\(A\):表示载波幅度。
\(m(t)\):表示基带信号。
\(w_c\):表示载波信号角度增量。
\(K_f\):是调制灵敏度。

正交调制法公式如下:

\[I(t) = cos(K_f*m(t)) \\ Q(t) = sin(K_f*m(t)) \\ s(t) = A*(I(t)*cos(w_c*t) - Q(t)*sin(w_c*t)) \]

2.PM的数字正交解调

原理:

4.FPGA解调

逻辑代码:

module pm_demod(
    input           clk             ,
    input           rst             ,

    //解调参数

    input           i_valid         ,
    input [15:0]    i_data_i        ,
    input [15:0]    i_data_q        ,


    output           o_rdy       ,
    output  [15:0]   o_data    

);

    wire            pm_valid          ;
    wire [23:0]     pm_i              ;
    wire [23:0]     pm_q              ;

    wire            pm_rdy            ;
    wire [47 : 0]   m_axis_dout_tdata ;
    //AM 解调

    assign pm_valid     = i_valid                        ;
    assign pm_i         = {{8{i_data_i[15]}},i_data_i}   ;
    assign pm_q         = {{8{i_data_q[15]}},i_data_q}   ;           
   
    cordic_translate cordic_translate (
        .aclk                     (clk                      ),                                        // input wire aclk
        .s_axis_cartesian_tvalid  (pm_valid                 ),  // input wire s_axis_cartesian_tvalid
        .s_axis_cartesian_tdata   ({pm_i,pm_q}              ),    // input wire [47 : 0] s_axis_cartesian_tdata
        .m_axis_dout_tvalid       (pm_rdy                   ),            // output wire m_axis_dout_tvalid
        .m_axis_dout_tdata        (m_axis_dout_tdata        )              // output wire [47 : 0] m_axis_dout_tdata
    );
    
    assign o_data = m_axis_dout_tdata[24 +:16];
    assign o_rdy = pm_rdy;
        
endmodule

仿真代码:

module tb_pm_demod();
    reg     clk;
    reg     rst;

    initial begin
        clk <= 0;
        rst <=   1;
        #300
        rst <= 0;

    end

    always #(100/2) clk  <=~clk;

    reg     valid;
    reg     [15:0]  din_i;
    reg     [15:0]  din_q;
    wire          o_rdy     ;
    wire  [15:0]  o_data  ;

pm_demod   pm_demod(
    .clk         (clk),
    .rst         (rst),
    .i_valid     (valid),
    .i_data_i    (din_i),
    .i_data_q    (din_q),
    .o_rdy           (o_rdy     ),
    .o_data          (o_data    )

);
    integer file_rd;                //定义数据读指针
    integer flag;
    initial begin                        //打开读取和写入的文件,这里的路径要对    
        file_rd = $fopen("PM.txt","r");
    end  
    reg     [15:0]  cnt;

    always @(posedge clk)begin
        if(rst)begin
            din_i   <= 0;
            din_q   <= 0;
            cnt     <= 0;
            valid   <= 0;
        end
        else if(cnt <= 1000)begin
            valid   <= 1;
            flag = $fscanf(file_rd,"%d %d",din_i,din_q);
            cnt <= cnt + 1;
        end
        else begin
            $fclose(file_rd);
            $stop();
        end
    end
endmodule

仿真结果: