OFDM信道估计与均衡之理论与初步仿真篇
频域均衡
信道模型为TDL信道,记\(\mathbf{h}=[h_0,h_1,...h_{N-1}]^T\in C^{N\times 1}\)为信道向量。信道对信号的响应如下图所示。
对于发送信号\(x(n)\),响应
\begin{equation}
y(n)=\sum_{i=0}^{N-1}h_ix(n-i)=conv(\mathbf{h},\mathbf{x})
\end{equation}
注意,上面的式子是线性卷积。然而,由于循环前缀的存在,线性卷积的结果等同于循环卷积。
因此,可以通过单抽头的频域均衡器实现均衡。
下面给出一段matlab代码,验证正确性。
fftlen=10;%子载波数目
cplen=3;%CP长度
h=[1 0 1];%
y=zeros(size(xaddcp));
if max(find(h))>cplen
warning('CP Len < Max Path Delay!');
end
% Tx
x=ones(1,fftlen);
xifft=ifft(x);
xaddcp = [xifft(fftlen-cplen+1:fftlen) xifft];
% 多径信道
for i=1:length(h)
if(h(i)~=0)
y(i:end)=y(i:end)+xaddcp(1:end-i+1);
end
end
hfft = fft(h,fftlen);
yfft = fft(y(cplen+1:cplen+fftlen));%通过修改这一行,可以观察不同定时情况下的均衡结果
scatterplot(yfft./hfft)
发送的数据为全1序列,均衡后的运行结果如下图。
可以看到,在定时准确时,经过均衡后多径信道没有影响。但是在定时提前时,在不同子载波引入了不同的相移(相位旋转与子载波的频率成比例,不明白的可以翻翻之前的文章),可以通过训练序列将其均衡回来。
信道估计包括两方面的内容:对信道本身的估计(对H估计)和由STO引起的相位旋转的估计。
接下来的代码将验证这一点。
clc;clear;rng(0);
close all
%% 参数设置
% 带宽相关参数
fftlen=32;
cplen=3;
OFDMSymbolNum = 2;
% 调制参数
ModOrder = 4;
bitsPerSymbol = log2(ModOrder);
% 信道参数
h=[1 0 1 1];
MaxPathDelay = find(h, 1, 'last' )-1;
if MaxPathDelay>cplen
fprintf('CP Len < Max Path Delay\n');
end
% 同步参数
STO=0;%定时偏差
if abs(STO)>cplen
error('不支持的STO: STO应小于cp');
end
% 导频参数
pilot = randi([0 1],fftlen,1);
pilot = qammod(pilot,2);
% 时频网格分配 mapping
PilotIdx = 1;
DataIdx = 2;
grid = zeros(fftlen,OFDMSymbolNum);
grid(:,PilotIdx)=pilot;%第一个符号分配为导频
%% 发射机
% 信息比特生成
info_bits = randi([0 1],bitsPerSymbol*fftlen*length(DataIdx),1);
% 星座映射
modSymbol = qammod(info_bits,ModOrder,'InputType','bit','UnitAveragePower',true);
modSymbol = reshape(modSymbol,[],length(DataIdx));
% 网格分配
grid(:,DataIdx) = modSymbol;
% ifft
tx_ifft=ifft(grid);
% 添加CP
txaddcp = [tx_ifft(fftlen-cplen+1:fftlen,:); tx_ifft];
% 并串转换
txStream = reshape(txaddcp,[],1);
%% 信道
y=zeros(size(txStream));
for i=1:length(h)
if(h(i)~=0)
y(i:end)=y(i:end)+h(i)*txStream(1:end-i+1);
end
end
y = [zeros(cplen,1);y;zeros(cplen,1)];
%% 定时同步
y = y(STO+cplen+1:STO+cplen+(fftlen+cplen)*OFDMSymbolNum);
% 串并转换
y = reshape(y,[],OFDMSymbolNum);
%% 信道估计与均衡
% 去除CP
y = y(cplen+1:cplen+fftlen,:);
yfft = fft(y);
hest = yfft(:,PilotIdx)./pilot;
x_hat = yfft./hest;
% save('定时提前','x_hat');
scatterplot(x_hat(:,DataIdx));
str = sprintf('CP Len = %d, Max Path Delay = %d, STO = %d',cplen,MaxPathDelay,STO);
title(str);
观察以下仿真结果。
图(1)为定时提前,但没有来自上一个符号的ISI,由于CP的保护,可以完美恢复;
图(2)(3)为定时提前,但有来自上一个符号的ISI,无法完美恢复;
图4)为定时滞后,但由于没有循环后缀,一定会发生ISI,无法完美恢复。