m基于FPGA的OFDM系统中降PAPR技术的实现,包含testbench测试文件和MATLAB辅助测试

55 阅读4分钟

1.算法仿真效果

本系统进行了Vivado2019.2平台的开发:

11267440ace37784ebec99daa00ad3ec_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

将FPGA的仿真结果导入matlab中,并通过matlab2022a进行papr对比:

486dd8b9df2a71487b1e405205c29aac_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

2.算法涉及理论知识概要

        峰值平均功率比(PAPR—Peak to Average Power Ratio),简称峰均比(PAPR)。MIMO-OFDM系统能够提供更大的覆盖范围、更好的传输质量、更高的数据速率和频谱效率。然而,由于OFDM 符号是由多个独立经过调制的子载波信号叠加而成的,当各个子载波相位相同或者相近时,叠加信号便会受到相同初始相位信号的调制,从而产生较大的瞬时功率峰值,由此进一步带来较高的峰值平均功率比(PAPR—Peak to Average Power Ratio),简称峰均比(PAPR)。由于一般的功率放大器的动态范围都是有限的,所以峰均比较大的MIMO-OFDM信号极易进入功率放大器的非线性区域,导致信号产生非线性失真,造成明显的频谱扩展干扰以及带内信号畸变,导致整个系统性能严重下降。高峰均比已成为MIMO-OFDM 的一个主要技术阻碍。

 

2.1 OFDM中PAPR问题概述

       首先,OFDM信号是一种特殊的多载波调制技术,它将高速数据流通过串并转换器变为多路并行的数据流,然后用不同的载波去承载这些并行的码流。这个过程中,每个载波的幅度和相位都可以独立地控制,从而实现对信号的优化。

 

       然而,由于OFDM信号的多个载波是正交的,这使得各个载波的幅度在时间上可能呈现剧烈的变化,从而导致信号的峰均功率比(PAPR)较高。高PAPR不仅会降低信号的信噪比(SNR),还会对系统的性能产生负面影响。

 

2.2 基于限幅法的PAPR抑制技术

       在正交频分复用(OFDM)技术中,由于信号是由多个独立经过调制的子载波信号叠加而成的,当各个子载波相位相同或者相近时,叠加信号便会受到相同初始相位信号的调制,从而产生较大的瞬时功率峰值,由此进一步带来较高的峰值平均功率比(PAPR—Peak to Average Power Ratio),简称峰均比(PAPR)。

 

       PAPR问题主要表现为,当OFDM信号的峰值出现时,功率放大器的动态范围是有限的,因此峰均比较大的信号极易进入功率放大器的非线性区域,导致信号产生非线性失真,造成明显的频谱扩展干扰以及带内信号畸变,导致整个系统性能严重下降。为了解决PAPR问题,基于限幅法的PAPR抑制技术被提出。该技术主要包括以下两种方法:

 

限幅法:该方法通过降低信号的峰值幅度来降低PAPR,但会牺牲一定的频谱效率。

压扩法:该方法通过改变各个载波的幅度分布来降低PAPR,但需要大量的计算资源。

        以上基于限幅法的PAPR抑制技术是针对OFDM信号处理的特性和要求提出的,可以有效降低OFDM信号的PAPR,提高系统的性能。然而,还需要考虑其应用时的具体要求和限制。

 

3.Verilog核心程序 ``timescale 1ns / 1ps

 

 

module OFDM_tops(

                i_clk,

                i_rst,

                

                i_before_fft1,

                i_last_fft1,

                i_enable1,

                i_real_dat1,

                i_imag_dat1,

 

 

                o_start_ifft,

                o_ends_ifft,

                o_enable_ifft,

                o_real_ifft,

                o_imag_ifft,

                

                

                o_start_papr,

                o_ends_papr,

                o_enable_papr,

                o_real_papr,

                o_imag_papr

                );

    

input             i_clk;                 

input             i_rst;   

      

input             i_before_fft1;                

input             i_last_fft1;   

input             i_enable1;  

input signed[15:0]i_real_dat1;                 

input signed[15:0]i_imag_dat1;   

 

 

output  o_start_ifft;

output  o_ends_ifft;

output  o_enable_ifft;

output signed[31:0]o_real_ifft;                 

output signed[31:0]o_imag_ifft;

 

 

output  o_start_papr;

output  o_ends_papr;

output  o_enable_papr;

output signed[31:0]o_real_papr;                 

output signed[31:0]o_imag_papr;  

 

 

 

Tants Tantsu1(

                .i_clk          (i_clk),

                .i_rst          (i_rst),

                

                .i_before_fft1  (i_before_fft1),

                .i_last_fft1    (i_last_fft1),

                .i_enable1      (i_enable1),

                .i_real_dat     (i_real_dat1),

                .i_imag_dat     (i_imag_dat1),

 

                .o_real_ifft    (o_real_ifft),

                .o_imag_ifft    (o_imag_ifft),

                .o_start        (o_start_ifft),

                .o_ends         (o_ends_ifft),

                .o_enable       (o_enable_ifft)

                 

                );

 

 ofdm_papr ofdm_papr_u(

                .i_clk          (i_clk),

                .i_rst          (i_rst),

                

                .i_real_dat1    (o_real_ifft),

                .i_imag_dat1    (o_imag_ifft),

 

                .o_real_ifft    (o_real_papr),

                .o_imag_ifft    (o_imag_papr)

                );

 

reg  o_start_papr;

reg  o_ends_papr;

reg  o_enable_papr;

 

always @(posedge i_clk or posedge i_rst)

begin

     if(i_rst)

     begin

     o_start_papr   <= 1'd0;

     o_ends_papr    <= 1'd0;

     o_enable_papr  <= 1'd0;

     end

else begin

     o_start_papr   <= o_start_ifft;

     o_ends_papr    <= o_ends_ifft;

     o_enable_papr  <= o_enable_ifft;

     end

end  

endmodule`