OFDM 经典整偏估计方法(基于长训练序列)

3 篇文章 1 订阅

1、OFDM符号的产生

为了避免OFDM符号高频段有用子载波受到滤波等因素的干扰,需要将信号有用子载波在频域进行搬移,使得有用信号处于低频部分,搬移 M a t l a b Matlab Matlab代码表示如下:

Information = randi([0,1],1,5120);
OFDM_block = [zero(1,1536),Information,zero(1,1536)];
OFDM_block_shift = ifftshift(OFDM_block)
OFDM_block_shift _frame = ifft(OFDM_block_shift,8192)*sqrt(8192);

2、频域整偏估计

  • 该估计方法使用帧结构中一个长训练序列(需要有CP循环前缀),可以使用自相关性良好的CAZAC序列。
  • 整偏在粗小偏补偿之后进行估计,此时整偏在频域表现为一段循环移位,(时域相偏影响频域相偏,之后的取模运算可以消除这一影响)。
  • 当定时位置精准时,可以将接收序列频域值与本地序列对应的频域值作相关,取峰值处对应的整偏估计值。
%频域循环移位
i = 1;
maxvalue = 4;    %整偏搜索窗口
B = zeros(1,2*maxvalue+1);
for g = -maxvalue:maxvalue 
    rx_train = circshift(trainsequence_coarse_1_fft.',-g);	%接收序列循环移位 
    trainsequence_coarse_1_fft_ = [rx_train(1:2560),rx_train(end-2560+1:end)];	%截取有效子载波
    power_local = sum(abs(trainsequence_coarse_1_fft_).^2)* sum(abs(trainsequence_local_fft_1).^2);	%能量归一化因子
    B(i) = sum(trainsequence_coarse_1_fft_.*conj(trainsequence_local_fft_1))/power_local;	%相关运算
    i=i+1;
end
g_estimate_extent = -maxvalue:maxvalue;
[~,d]=max(abs(B)); %取峰值位置
bias_int = g_estimate_extent(d);	%得到整偏估计值
  • 也可以使用时域扫频,效果类似
%时域扫频
 trainsequence_local = up_sampling(UW,sampling_mult);
 t = 0:length(trainsequence_local)-1;
 trainsequence_local_offset(1,:)= trainsequence_local.*exp(1i*mod(2*pi*t*-2/(sampling_mult*NFFT),2*pi));
trainsequence_local_offset(2,:)= trainsequence_local.*exp(1i*mod(2*pi*t*-1/(sampling_mult*NFFT),2*pi));
 trainsequence_local_offset(3,:)= trainsequence_local.*exp(1i*mod(2*pi*t*0/(sampling_mult*NFFT),2*pi));
 trainsequence_local_offset(4,:)= trainsequence_local.*exp(1i*mod(2*pi*t*1/(sampling_mult*NFFT),2*pi));
 trainsequence_local_offset(5,:)= trainsequence_local.*exp(1i*mod(2*pi*t*2/(sampling_mult*NFFT),2*pi));
 i = 1;
 maxvalue = 2;
 B = zeros(1,2*maxvalue+1);
 for g = -maxvalue:maxvalue 
     power_local = sum(abs(trainsequence_coarse_1).^2)* sum(abs(trainsequence_local_offset(i,:)).^2);
     B(i) = sum(trainsequence_coarse_1.*conj(trainsequence_local_offset(i,:)))/power_local;
     i=i+1;
 end
 g_estimate_extent = -maxvalue:maxvalue;
 [~,d]=max(abs(B));
 bias_int = g_estimate_extent(d);

当定时位置不准确时,可以将接收频域循环移位数据及本地频域数据分别作差分(前后数据共轭相乘,即相位偏移抵消)再进行相关运算,但是需要保证差分后的数据也具有良好的自相关特性(如PN序列)。

%频域差分
trainsequence_coarse_1_fft_before=fft(trainsequence_coarse_1.',N_long);	%接收训练符号作fft(定时位置可以人为偏移1/4序列长度)
trainsequence_local_fft=fft(UW.',N_long/sampling_mult);	%本地序列作fft
trainsequence_local_fft_1 = [trainsequence_local_fft(1:2560).';trainsequence_local_fft(end-2560+1:end).'];	%截取有效子载波
trainsequence_local_fft_diff = trainsequence_local_fft_1(:,1:2559).*conj(trainsequence_local_fft_1(:,2:2560));	%本地序列差分
i = 1;
maxvalue = 4;
B = zeros(1,2*maxvalue+1);
for g = -maxvalue:maxvalue 
    trainsequence_coarse_1_fft_circ = circshift(trainsequence_coarse_1_fft_before.',-g); 
    trainsequence_coarse_1_fft = [trainsequence_coarse_1_fft_circ(1:2560);trainsequence_coarse_1_fft_circ(end-2560+1:end)];
    trainsequence_coarse_1_fft_diff = trainsequence_coarse_1_fft(:,1:2559).*conj(trainsequence_coarse_1_fft(:,2:2560));	%接收序列差分
    power_local = sum(abs(trainsequence_coarse_1_fft_diff).^2,'all')* sum(abs(trainsequence_local_fft_diff).^2,'all');
    B(i) = sum(trainsequence_coarse_1_fft_diff.*conj(trainsequence_local_fft_diff),'all')/power_local;
    i=i+1;
end
g_estimate_extent = -maxvalue:maxvalue;
[~,d]=max(abs(B));
bias_int = g_estimate_extent(d);

微信公众号:通信随笔XIDIAN

在这里插入图片描述

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xidian_hxc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值