⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_optimal_rx.m

📁 OFDM接收端程序仿真
💻 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 + -