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

发布时间 2023-10-18 23:10:44作者: 我爱C编程

1.算法仿真效果

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

 

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

 

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

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

 

2.1 OFDMPAPR问题概述

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

 

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

 

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

       在正交频分复用(OFDM)技术中,由于信号是由多个独立经过调制的子载波信号叠加而成的,当各个子载波相位相同或者相近时,叠加信号便会受到相同初始相位信号的调制,从而产生较大的瞬时功率峰值,由此进一步带来较高的峰值平均功率比(PAPRPeak 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