OFDM信道估计与均衡之理论与初步仿真篇

频域均衡

信道模型为TDL信道,记\(\mathbf{h}=[h_0,h_1,...h_{N-1}]^T\in C^{N\times 1}\)为信道向量。信道对信号的响应如下图所示。
image

对于发送信号\(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序列,均衡后的运行结果如下图。
image
可以看到,在定时准确时,经过均衡后多径信道没有影响。但是在定时提前时,在不同子载波引入了不同的相移(相位旋转与子载波的频率成比例,不明白的可以翻翻之前的文章),可以通过训练序列将其均衡回来。
信道估计包括两方面的内容:对信道本身的估计(对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,无法完美恢复。
image

posted @ 2025-06-02 19:21  蕉太羊  阅读(145)  评论(0)    收藏  举报