1 块状导频
块状导频结构如图 4.1所示。块状导频结构每相隔一定的时间间隔插入导频信号,时间间隔必须满足采样定理,块状导频结构中每个子载波都有导频信号,对导频信号进行采样可以方便的对 OFDM 信道进行估计。从频域上观察,导频信号是连续的,导频信号越密集对信道估计的准确性就越高,所以块状导频结构不需要在频域运用插值算法来提高信道估计的准确性。从时域上观察,导频信号间存在时间间隔,所以这种方式对快速衰落的信道缺乏敏感 。


2 梳状导频
梳状导频结构如图 4.2 所示。梳状导频结构是每隔一定的频率间隔插入导频信号,且频率间隔满足采样定理,梳状导频结构中只有部分子载波携带导频信号。导频信号在频域上存在频率间隔导致在频域的信道估计缺乏准确性,通过在频域上运用插值算法可以这一缺陷。导频信号在时域是连续的,对时间选择性敏感,所以梳状导频适合快速衰落的信道。


3 参考文献
[1]兰萍,钱立鹏,白同磊.基于导频的OFDM信道估计算法比较与分析[J].西藏科技,2017,(08):76-79.

clear;
close;
clc;
%% 参数设置
N = 256; %子载波数目
cp = 16; %循环前缀长度
n =500;  %传输的OFDM符号数目
pilot_Inter=4;%导频间隔
num_pilot=N/pilot_Inter;
SNR_dB =0:1:30; %信噪比
snr_len = length(SNR_dB);
mse1=[];mse2=[];mse3=[];mse4=[];mse5=[];mse6=[];mse7=[];mse8=[];mse9=[];
BER1 = [];BER2 = [];BER3 = [];BER4= [];BER5 = [];BER6 = [];BER7 = []; BER8 = []; BER9 = [];
ber1 = [];ber2 = [];ber3 = [];ber4 = [];ber5 = [];ber6 = [];ber7 = [];ber8 = [];ber9 = [];
MSE1 = [];MSE2 = [];MSE3 = [];MSE4 = [];MSE5 = [];MSE6 = [];MSE7 = [];MSE8 = [];MSE9 = [];
Qpsk_rx1=[];Qpsk_rx2=[];Qpsk_rx3=[];
pilot_symbols=pskmod(randi([0 3],1,num_pilot,1),4,pi/4); %导频

fs = 1;                                     % Hz
Delay=[0 2 4 6 8];%Channel delay
trms=4;
PowerdB=10*log10(exp(-Delay/trms));
Power=10.^(PowerdB/10);
fD = 100*0.000001;    
chan = comm.RayleighChannel('SampleRate',fs, ...
    'PathDelays',Delay, ...
    'AveragePathGains',PowerdB, ...
    'MaximumDopplerShift',fD );


%% 发射端
for l=1:800
 for ii = 1:snr_len  
data1 = randi([0 1],1 ,(N-num_pilot)*2 );  %生成随机数据序列
a1= reshape(data1,log2(4),[])';        %分组
a2= bi2de(a1);                    
qpsk_data=pskmod(a2,4,pi/4,'GRAY');  %qpsk调制
qpsk_data=reshape(qpsk_data,1,[]);
% scatterplot(qpsk_data),grid;
%插入导频(梳状)
index_pilot=0;
index_message=0;
pilot_location=zeros(1,num_pilot);
message_location=zeros(1,N-num_pilot);
data=zeros(1,N);
for i=1:N
    if mod(i,pilot_Inter)==1
        index_pilot=index_pilot+1;
        data(i)=pilot_symbols(index_pilot);
        pilot_location(index_pilot)=i;
    else
        index_message=index_message+1;
        data(i)=qpsk_data(index_message);
        message_location(index_message)=i;
    end
end
data = reshape(data, [], 1);
ofdm_ifft = ifft(data, N);                    %IFFT
ofdm_cp = [ofdm_ifft(N-cp+1:N,:); ofdm_ifft]; %添加循环前缀
ofdm_tx=reshape(ofdm_cp,[],1);                %并串转换

%% 信道
rchan=chan;
nSamples = N; % 信号长度
inputSignal = [1; zeros(nSamples-1, 1)];
% 通过信道传递单位脉冲序列
outputSignal = chan(inputSignal);
% 获取冲击响应(前若干个时刻)
h = outputSignal(1:9);
H = fft(h,N);
rx = conv(ofdm_tx,h);
% release(chan);
% rx = rchan(ofdm_tx); %通过多径通道的信号
ofdm_rx = awgn(rx, SNR_dB(ii), 'measured');% 加入高斯白噪声
SNR(ii)= 10^(SNR_dB(ii)/10);
%noise_power(ii) = 1 /SNR(ii);
%noise = sqrt(noise_power(ii)) * randn(size(rx));
%ofdm_rx = rx + noise;


%% 接收端
ofdm_rx = ofdm_rx(1:length(ofdm_tx));
ofdm_rx = reshape(ofdm_rx, N+cp,[]);%串并变换
ofdm_rx = ofdm_rx(cp+1:end, :);    %去循环前缀
ofdm_fft = fft(ofdm_rx, N);        %FFT
ofdm_fft=reshape(ofdm_fft,1,[]);

%LS估计
h_ls=LS_CE(ofdm_fft,pilot_symbols,pilot_location,N,pilot_Inter,'spline');
%LMMSE估计
h1=reshape(h,1,[]);
h_ls1=reshape(h_ls,[],1);
h_lmmse=MMSE_CE(ofdm_fft,pilot_symbols,pilot_location,N,pilot_Inter,h1,SNR_dB(ii));

dft=ifft(h_ls);
DFT=dft(1:9);
h_dft=fft(DFT,N);
H1=reshape(H,1,[]);
mse1(ii)=(H1-h_ls)*(H1-h_ls)'/N; 
%Hmmse1 = mean(Hmmse, 2);
%mse2(ii)=1/N*trace(Rhh*(eye(N)-Rhh*inv(Rhh+(beta/SNR(ii))*eye(k))));
mse2(ii)=(H1-h_lmmse)*(H1-h_lmmse)'/N;
mse3(ii)=(H1-h_dft)*(H1-h_dft)'/N;

ofdm_fft_ls1=ofdm_fft./h_ls;
ofdm_fft_lmmse1=ofdm_fft./h_lmmse;
ofdm_fft_dft1 = ofdm_fft./h_dft;

ofdm_fft_ls=ofdm_fft_ls1(message_location);
ofdm_fft_lmmse=ofdm_fft_lmmse1(message_location);
ofdm_fft_dft = ofdm_fft_dft1 (message_location);

a31=reshape(ofdm_fft_ls,[],1); %并串变换
a32=reshape(ofdm_fft_lmmse,[],1);
a33=reshape(ofdm_fft_dft,[],1);
      eye_num=3;   
      ss=zeros(1,eye_num*1);    
     ttt=0:1:eye_num*1*1-1; 
%   for k=1:500
%        ss(k,:)=a31((k+eye_num)*1+1:(k+eye_num)*1+eye_num*1);    
% %         采样时,要保证脉冲首尾相接
%        drawnow;
%        figure(4)
%        plot(ttt,ss(k,:),'color', 'k','linewidth',2);
%        hold on;
%   end
% eyediagram(a3,2);
% scatterplot(a3),grid;
a41=pskdemod(a31,4,pi/4,'GRAY');            %qpsk解调
a42=pskdemod(a32,4,pi/4,'GRAY');
a43=pskdemod(a33,4,pi/4,'GRAY');
a51 = reshape(a41,[],1);
a52 = reshape(a42,[],1);
a53 = reshape(a43,[],1);
a61 = de2bi(a51);
a62 = de2bi(a52);
a63 = de2bi(a53);
qpsk_rx1=reshape(a61',1,[]); 
qpsk_rx2=reshape(a62',1,[]); 
qpsk_rx3=reshape(a63',1,[]);
%Qpsk_rx1=[Qpsk_rx1,qpsk_rx1];
%Qpsk_rx2=[Qpsk_rx2,qpsk_rx1];
%Qpsk_rx3=[Qpsk_rx3,qpsk_rx1];
errors1(ii) =sum(data1 ~= qpsk_rx1);  %统计误码率
errors2(ii) =sum(data1 ~= qpsk_rx2); 
errors3(ii) =sum(data1 ~= qpsk_rx3); 
Ber1(ii) = errors1(ii)/((N-num_pilot)*2);
Ber2(ii) = errors2(ii)/((N-num_pilot)*2);
Ber3(ii) = errors3(ii)/((N-num_pilot)*2);
ber3 = [ber3; Ber1(ii)];
ber4 = [ber4; Ber2(ii)];
ber8 = [ber8; Ber3(ii)];
MSE4=[MSE4;mse1(ii)];
MSE5=[MSE5;mse2(ii)];
MSE6=[MSE6;mse3(ii)];
end
mse4 =horzcat(mse4, MSE4);
MSE4=[];
mse5 =horzcat(mse5, MSE5);
MSE5=[];
mse6 =horzcat(mse6, MSE6);
MSE6=[];
BER3 =horzcat(BER3, ber3);
ber3=[];
BER4 =horzcat(BER4, ber4);
ber4=[];
BER8=horzcat(BER8, ber8);
ber8=[];
end
mse4=mean(mse4, 2);
mse5=mean(mse5, 2);
mse6=mean(mse6, 2);
mmm=BER3;
BER3=mean(BER3, 2);
BER4=mean(BER4, 2);
BER8=mean(BER8, 2);
disp(['误码率:', num2str(Ber1)]);
disp(['误码率:', num2str(Ber2)]);

%% 绘制星座图
figure;
plot(qpsk_data,'+','color',[0.70 0.21 0.15],'LineWidth', 1);     %发送信号星座图
title('发射信号星座图');
xlabel('同相分量');
ylabel('正交分量');

figure;
plot(ofdm_fft_ls1,'+','color',[0.50 0.21 0.15],'LineWidth', 1);     %发送信号星座图
title('LS估计后的星座图');
xlabel('同相分量');
ylabel('正交分量');

figure;
plot(ofdm_fft_lmmse1,'+','color',[0.18 0.49 0.69],'LineWidth', 1);     %发送信号星座图
title('LMMSE估计后的星座图');
xlabel('同相分量');
ylabel('正交分量');

figure;
plot(ofdm_fft_dft1,'+','color',[0.70 0.21 0.15],'LineWidth', 1);     %发送信号星座图
title('DFT估计后的星座图');
xlabel('同相分量');
ylabel('正交分量');
%% 绘制误码率和均方误差
figure;
semilogy(SNR_dB,BER3,'-<','Linewidth',1,'color',[0.13 0.55 0.16]);
hold on;
semilogy(SNR_dB,BER4,'-d','Linewidth',1,'color',[0.71,0.28,0.29]);
semilogy(SNR_dB,BER8,'-*','color',[0.20,0.42,0.67],'Linewidth',1);
hold off;
xlabel('SNR(dB)');
ylabel('BER');
grid on
title('LS、LMMSE、DFT误码率性性能比较');
legend('LS信道估计','LMMSE信道估计','DFT信道估计');

figure;
semilogy(SNR_dB,mse4,'-v', 'DisplayName', 'LS信道估计');
hold on;
semilogy(SNR_dB,mse5,'-v', 'DisplayName', 'LMMSE信道估计');
semilogy(SNR_dB,mse6,'-v', 'DisplayName', 'DFT信道估计');
set(findall(gca,'Type','Line'),'Linewidth',1)
hold off;
xlabel('SNR(dB)');
ylabel('MSE');
grid on
title('LS、LMMSE、DFT均方误差性能比较');
legend('show');



Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐