1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
所谓信道估计,就是从接收数据中将假定的某个信道模型的模型参数估计出来的过程。如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。
无线通信系统的性能很大程度上受到无线信道的影响,如阴影衰落和频率选择性衰落等等,使得发射机和接收机之间的传播路径非常复杂。无线信道并不像有线信道固定并可预见,而是具有很大的随机性,这就对接收机的设计提出了很大的挑战。在OFDM系统的相干检测中需要对信道进行估计,信道估计的精度将直接影响整个系统的性能。为了能在接收端准确的恢复发射端的发送信号,人们采用各种措施来抵抗多径效应对传输信号的影响,信道估计技术的实现需要知道无线信道的信息,如信道的阶数、多普勒频移和多径时延或者信道的冲激响应等参数。因此,信道参数估计是实现无线通信系统的一项关键技术。能否获得详细的信道信息,从而在接收端正确地解调出发射信号,是衡量一个无线通信系统性能的重要指标。因此,对于信道参数估计算法的研究是一项有重要意义的工作。
信道估计算法从输入数据的类型来分,可以划分为时域和频域两大类方法。频域方法主要针对多载波系统;时域方法适用于所有单载波和多载波系统,其借助于参考信号或发送数据的统计特性,估计衰落信道中各多径分量的衰落系数。从信道估计算法先验信息的角度,则可分为以下三类:
(1) 基于参考信号的估计。该类算法按一定估计准则确定待估参数,或者按某些准则进行逐步跟踪和调整待估参数的估计值。其特点是需要借助参考信号,即导频或训练序列。基于训练序列和导频序列的估计统称为基于参考信号的估计算法。
基于训练序列的信道估计算法适用于突发传输方式的系统。通过发送已知的训练序列,在接收端进行初始的信道估计,当发送有用的信息数据时,利用初始的信道估计结果进行一个判决更新,完成实时的信道估计。基于导频符号的信道估计适用于连续传输的系统。通过在发送的有用数据中插入已知的导频符号,可以得到导频位置的信道估计结果;接着利用导频位置的信道估计结果,通过内插得到有用数据位置的信道估计结果,完成信道估计
(2) 盲估计。利用调制信号本身固有的、与具体承载信息比特无关的一些特征,或是采用判决反馈的方法来进行信道估计的方法。
(3) 半盲估计。结合盲估计与基于训练序列估计这两种方法优点的信道估计方法。
一般来讲,通过设计训练序列或在数据中周期性地插入导频符号来进行估计的方法比较常用。而盲估计和半盲信道估计算法无需或者需要较短的训练序列,频谱效率高,因此获得了广泛的研究。但是一般盲估计和半盲估计方法的计算复杂度较高,且可能出现相位模糊(基于子空间的方法)、误差传播(如判决反馈类方法)、收敛慢或陷入局部极小等问题,需要较长的观察数据,这在一定程度上限制了它们的实用性。
3.MATLAB核心程序
```M = 10;
%Loop until the job is killed or until the SNR or BER target is reached.
MTKL = 200;
Berrs1 = zeros(M,MTKL);
Berrs2 = zeros(M,MTKL);
for mk = 1:MTKL
mk
MSE = [];
MCE = [];
for NT = NTS
SNR = SNRset;
%Convert from SNR (in dB) to noise power spectral density.
N0 = 1/(10^(SNR/10));
error_count = 0;
bit_count = 0;
%semi-blind channel estimation
H_length = 1;
fm = 50;
fs = 1e4;
B = fir1(1023,fm/(fs/2));
n_I = randn(nTxnRx,H_length);
n_Q = randn(nTxnRx,H_length);
a_I = filter2(B,n_I);
a_Q = filter2(B,n_Q);
Rayleigh_fading = 1/sqrt(2)*[a_I+j*a_Q];
H = reshape(Rayleigh_fading,[nRx,nTx,H_length]);
iteration_index = 0;
ii = 1;
%generating the training bits
.....................................................................
n = 1/sqrt(2)*[randn(nRx,NT(ii)) + j*randn(nRx,NT(ii))];
%received training signal Y
Y = H*training_block+10^(-SNR/20)*n;
%Least square channel estimation
H_hat = Y*training_block'*inv(training_block*training_block');
number_iteration = M;
H_updated_hat = H_hat;
A = [];
J = [];
S_Hat = [];
..................................................................
tmps = abs(H_updated_hat-H);
MSE(iteration_index) = mse(tmps(:));
MCE(iteration_index) =(1/(nTxnRx))sum(sum((abs(H_updated_hat-H).^2)));
end
end
Berrs1(:,mk) = MSE;
Berrs2(:,mk) = MCE;
end
for i = 1:M
tmp1 = Berrs1(i,:);
tmp2 = Berrs2(i,:);
INDX1 = [];
INDX2 = [];
for j = 1:length(tmp1)
if isnan(tmp1(j)) == 1
INDX1 = [INDX1,j];
end
if tmp1(j) > 1000
INDX1 = [INDX1,j];
end
end
for j = 1:length(tmp2)
if isnan(tmp2(j)) == 1
INDX2 = [INDX2,j];
end
if tmp2(j) > 1000
INDX2 = [INDX2,j];
end
end
tmp1(INDX1) = [];
tmp2(INDX2) = [];
Bersf1(i) = sqrt(mean(tmp1));
Bersf2(i) = mean(tmp2);
end
figure;
semilogy(1:M,Bersf1,'b-o');
xlabel('number of iterations');
ylabel('MSE');
grid on
figure;
semilogy(1:M,Bersf2,'b-o');
xlabel('number of iterations');
ylabel('MCE');
grid on
```