qam16demod.m

来自「《OFDM关键技术与应用》中16QAM的调制与解调源程序。」· M 代码 · 共 137 行

M
137
字号
function decoderout=QAM16demod(symbol)
% 16QAM demodulation
% 16QAM:
% s3 s2 s1 s0    ml   mQ
%  0  0  0  0    3A   3A
%  0  0  0  1     A   3A
%  0  0  1  1    -A   3A
%  0  0  1  0    -3A  3A
%  0  1  0  0    3A    A
%  0  1  0  1     A    A
%  0  1  1  1    -A    A
%  0  1  1  0    -3A   A
%  1  1  0  0     3A  -A
%  1  1  0  1     A   -A
%  1  1  1  1    -A   -A
%  1  1  1  0    -3A  -A
%  1  0  0  0    3A   -3A
%  1  0  0  1    A    -3A
%  1  0  1  1    -A   -3A
%  1  0  1  0    -3A  -3A
%  note: =1/sqrt(10)
%
symlength=length(symbol);
A=1/sqrt(10);
% temp(ii*4)=s3, temp(ii*4-1)=s2, temp(ii*4-2)=s1, temp(ii*4-3)=s0
for ii=1:symlength
    if real(symbol(ii))>=0
        if imag(symbol(ii))>=0 %1#quandrant
            if real(symbol(ii))>=2*A
                if imag(symbol(ii))>=2*A
                    temp(ii*4)=0;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=0;
                else
                    temp(ii*4)=0;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=0;
                end
            else
                if imag(symbol(ii))>=2*A
                    temp(ii*4)=0;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=1;
                else
                    temp(ii*4)=0;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=1;
                end
             end
         else   % 4#quadrant
             if real(symbol(ii))>=2*A
                 if imag(symbol(ii))>=-2*A
                    temp(ii*4)=1;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=0;
                else
                    temp(ii*4)=1;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=0;
                end
            else
                if imag(symbol(ii))>=-2*A
                    temp(ii*4)=1;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=1;
                else
                    temp(ii*4)=1;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=0;
                    temp(ii*4-3)=1;
                end
             end
         end
     else
         if imag(symbol(ii))>=0    %2#quadrant
             if real(symbol(ii))>=-2*A
                 if imag(symbol(ii))>=2*A
                    temp(ii*4)=0;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=1;
                else
                    temp(ii*4)=0;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=1;
                end
            else
                if imag(symbol(ii))>=2*A
                    temp(ii*4)=0;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=0;
                else
                    temp(ii*4)=0;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=0;
                end
            end
        else    %3#quadrant
            if real(symbol(ii))>=-2*A
                if imag(symbol(ii))>=-2*A
                    temp(ii*4)=1;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=1;
                else
                    temp(ii*4)=1;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=1;
                end
            else
                if imag(symbol(ii))>=-2*A
                    temp(ii*4)=1;
                    temp(ii*4-1)=1;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=0;
                else
                    temp(ii*4)=1;
                    temp(ii*4-1)=0;
                    temp(ii*4-2)=1;
                    temp(ii*4-3)=0;
                end
            end
        end
    end
end    
decoderout=temp;        

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?