原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现
1.前言
添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。
2.加窗
对OFDM符号“加窗”意味着令符号周期边缘的幅度值逐渐过渡到零。通常采用的窗类型就是升余弦函数,其定义如下:
其中, 为滚降因子;,是加窗前的符号长度,而加窗后的符号长度应该为 。从而允许在相邻符号之间存在有相互重叠的区域。经过加窗处理的OFDM符号如下图所示。
加窗后的OFDM符号
系统带宽之外的功率下降速度取决于滚降因子的选取。滚降系数越大,带宽外的功率谱密度下降得更快 如果系统采用离散时间的形式实现,如本系统的实现,其中参数 ,那么上述加窗函数变为:
其他
3.硬件实现
加窗处理要求每个OFDM符号最后多输出一个数据,该数据依然满足周期性要求,为OFDM符号64个样值中的第一个。而下一个符号的第一个数据(CP的第一个样值)将和该数据相加且右移1位后再行输出。硬件实现上,将每个OFDM 符号的第一个样值缓存起来,用于下一个OFDM 符号输出时的加窗处理。在之前的ifft模块(IFFT模块链接)里面添加如下代码,完成加窗:
//-------------------------------------加窗-----------------------------------------//
always @(posedge clk or negedge rst_n)
if(!rst_n)
first_iff_dout <= 16'd0;
else if(ifft_dout_Index == 'd0)
first_iff_dout <= {m_axis_data_tdata[23:16]>>1,m_axis_data_tdata[7:0]>>1};
edge_detection #(.POSEDGE(1'b1))
u_edge_detection (
.clk (clk ),
.edge_din (ifft_dout_vld ),
.edge_pluse (ifft_dout_vld_edge_pluse )
);
//下一个符号第一个数据(CP的第一个样值)将和OFDM符号64个样值中的第一个数据相加且右移1位后再行输出。
assign ifft_dout = ifft_dout_Index == 'd0 & ifft_dout_vld_edge_pluse ?
{first_iff_dout[15:8] + m_axis_data_tdata[23:16]>>1,
first_iff_dout[7:0] + m_axis_data_tdata[7:0]>>1} :
{m_axis_data_tdata[23:16],m_axis_data_tdata[7:0]};
//----------------------------------------------------------------------------------//
其中edge_detection模块为边沿检测电路,用来判断ifft的第一个输出。边沿检测模块的链接
4.Matlab仿真
%% 加循环前缀CP,加窗
add_cp_in = ifft_out;
add_cp_out = zeros(1,80*k);
reg80 = zeros(1,80);
tmp_end = zeros(1,k+1);
for m = 1:k
reg64 = add_cp_in((m-1)*64+1:m*64);
reg80(1:16) = reg64((end-15):end);
reg80(17:end) = reg64(1:end);
tmp_end(m+1) = 0.5*reg64(1);
add_cp_out((m-1)*80+1:m*80) = [0.5*tmp_end(m)+0.5*reg80(1),reg80(2:end)] ;
end
ModelSim仿真
整个data域的仿真效果如下所示:
原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现