📄 ofdm_optimal_rx.m
字号:
binary = InputPort1.Sequence;
BB_signal = InputPort2.Sampled.Signal;
RF_length = length(BB_signal);
OutputPort1=InputPort1;
Bitrate =Parameter0;%2.5GHz
Signal_Power = 1;
QAM_16_demapper = [0.6325 0 -0.6325];
Cyclic_Prefix = 1024;
Pilot_256sc_position = [17 50 83 116 149 182 215 248];
Ideal_pilot=[1 -1 1 -1 -1 1 -1 1];
Err_bit = 0;
%==========================================================================
% start receiving OFDM symbol
%==========================================================================
%==========================================================================
% Cyclic Prefix remove
%==========================================================================
CP_remove_input = BB_signal(1:32:length(BB_signal));
%CP_remove_output = CP_remove_input(Cyclic_Prefix+1:end);
%==========================================================================
% FFT
%==========================================================================
FFT_input = CP_remove_input(1:4:end);
FFT_output = fft(FFT_input);
%==========================================================================
% Guard channel remove
%==========================================================================
Guard_Remove_input = FFT_output;
Guard_Remove_output(1:264)=Guard_Remove_input(125:388);
%==========================================================================
% Pilot Extracter
%==========================================================================
Pilot_Extracter_input=Guard_Remove_output;
Pilot_output(1)=Pilot_Extracter_input(17);
Pilot_output(2)=Pilot_Extracter_input(50);
Pilot_output(3)=Pilot_Extracter_input(83);
Pilot_output(4)=Pilot_Extracter_input(116);
Pilot_output(5)=Pilot_Extracter_input(149);
Pilot_output(6)=Pilot_Extracter_input(182);
Pilot_output(7)=Pilot_Extracter_input(215);
Pilot_output(8)=Pilot_Extracter_input(248);
%==========================================================================
% Channel estimation and Equalizer
%==========================================================================
Equalizer_input = Guard_Remove_output;
for i=1:length(Pilot_output)
Pilot_est_input(i)=Pilot_output(i)/Ideal_pilot(i);
end
%Pilot_est_input=Channel_estimate_LMMSE';
Pilot_est_input_real=real(Pilot_est_input);
Pilot_est_input_imag=imag(Pilot_est_input);
[Channel_estimate_re, p_real]=csaps(Pilot_256sc_position,Pilot_est_input_real,0.001,1:264);
[Channel_estimate_im, p_imag]=csaps(Pilot_256sc_position,Pilot_est_input_imag,0.001,1:264);
Channel_estimate=complex(Channel_estimate_re, Channel_estimate_im);
for i=1:length(Equalizer_input)
% Equalizer_output1(i)=Equalizer_input(i)/Channel_estimate(i);
% Equalizer_output1(i)=Equalizer_input(i)/Channel_estimate_training(i);
Equalizer_output1(i)=Equalizer_input(i)/Channel_estimate(i);
end
Equalizer_output(1:16)=Equalizer_output1(1:16);
Equalizer_output(17:48)=Equalizer_output1(18:49);
Equalizer_output(49:80)=Equalizer_output1(51:82);
Equalizer_output(81:112)=Equalizer_output1(84:115);
Equalizer_output(113:144)=Equalizer_output1(117:148);
Equalizer_output(145:176)=Equalizer_output1(150:181);
Equalizer_output(177:208)=Equalizer_output1(183:214);
Equalizer_output(209:240)=Equalizer_output1(216:247);
Equalizer_output(241:256)=Equalizer_output1(249:264);
%==========================================================================
% Symbol Demapper
%==========================================================================
Demapper_input(1:256)=Equalizer_output(1:256);
Demapper_value=Demapper_input/Signal_Power;
for i=1:length(Demapper_value)
[Demapper_value_re_min,index_re]=min(abs( QAM_16_demapper - real(Demapper_value(i))));
if index_re==1 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) >= 0
Demapper_output( (i-1)*4+1)=1;
Demapper_output( (i-1)*4+2)=0;
elseif index_re==1 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) < 0
Demapper_output( (i-1)*4+1)=1;
Demapper_output( (i-1)*4+2)=1;
elseif index_re==2 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) >= 0
Demapper_output( (i-1)*4+1)=1;
Demapper_output( (i-1)*4+2)=1;
elseif index_re==2 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) < 0
Demapper_output( (i-1)*4+1)=0;
Demapper_output( (i-1)*4+2)=1;
elseif index_re==3 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) >= 0
Demapper_output( (i-1)*4+1)=0;
Demapper_output( (i-1)*4+2)=1;
elseif index_re==3 && (real(Demapper_value(i)) - QAM_16_demapper(index_re)) < 0
Demapper_output( (i-1)*4+1)=0;
Demapper_output( (i-1)*4+2)=0;
end
[Demapper_value_im_min,index_im]=min(abs( QAM_16_demapper - imag(Demapper_value(i))));
if index_im==1 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) >= 0
Demapper_output( (i-1)*4+3)=1;
Demapper_output( (i-1)*4+4)=0;
elseif index_im==1 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) < 0
Demapper_output( (i-1)*4+3)=1;
Demapper_output( (i-1)*4+4)=1;
elseif index_im==2 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) >= 0
Demapper_output( (i-1)*4+3)=1;
Demapper_output( (i-1)*4+4)=1;
elseif index_im==2 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) < 0
Demapper_output( (i-1)*4+3)=0;
Demapper_output( (i-1)*4+4)=1;
elseif index_im==3 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) >= 0
Demapper_output( (i-1)*4+3)=0;
Demapper_output( (i-1)*4+4)=1;
elseif index_im==3 && (imag(Demapper_value(i)) - QAM_16_demapper(index_im)) < 0
Demapper_output( (i-1)*4+3)=0;
Demapper_output( (i-1)*4+4)=0;
end
end
Rv_bits=Demapper_output;
for i=1:length(binary)
if Rv_bits(i) ~= binary(i)
Err_bit=Err_bit+1;
end
end
%Total_Rv_bit=Total_Rv_bit+length(Rv_bits);
save F:\Err_bit.txt Err_bit -ascii;
eyediagram(Demapper_value,2);
scatterplot(Demapper_value);
for i=1:length(Rv_bits)
binary_out((64*(i-1)+1):64*i)=Rv_bits(i);
end
OutputPort1 = InputPort2;
for i=1:RF_length
OutputPort1.Sampled.Signal(i) = binary_out(i);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -