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);