demodulation.m

来自「传统的卷积码和Turbo码直到今天仍有广泛的应用」· M 代码 · 共 124 行

M
124
字号
function DemoduResult=demodulation(input,index)
% QPSK,16-QAM,64-QAM demodulation
if index==1
    %QPSK
    input=input*sqrt(2);
    DemoduResult=zeros(1,length(input)*2);
    for k=1:length(input)
        DemoduResult(2*k-1)=real(input(k));
        DemoduResult(2*k)=imag(input(k));
    end
elseif index==2
    %16-QAM
    DemoduResult=zeros(1,length(input)*4);
    input=input*sqrt(10);
    for k=1:length(input)
        if abs(real(input(k)))<=2
            DemoduResult(4*k-3)=real(input(k));
        elseif real(input(k))>2
            DemoduResult(4*k-3)=2*(real(input(k))-1);
        else
            DemoduResult(4*k-3)=2*(real(input(k))+1);
        end
        if real(input(k))>=0
            DemoduResult(4*k-2)=2-real(input(k));
        else
            DemoduResult(4*k-2)=2+real(input(k));
        end
        if abs(imag(input(k)))<=2
            DemoduResult(4*k-1)=imag(input(k));
        elseif imag(input(k))>2
            DemoduResult(4*k-1)=2*(imag(input(k))-1);
        else
            DemoduResult(4*k-1)=2*(imag(input(k))+1);
        end
        if imag(input(k))>=0
            DemoduResult(4*k)=2-imag(input(k));
        else
            DemoduResult(4*k)=2+imag(input(k));
        end
    end    
else
    %64-QAM
    DemoduResult=zeros(1,length(input)*6);
    input=input*sqrt(42);
    for k=1:length(input)
        % b0 & b3
        if abs(real(input(k)))<=2
            DemoduResult(6*k-5)=real(input(k));
        elseif real(input(k))>2&real(input(k))<=4
            DemoduResult(6*k-5)=2*(real(input(k))-1);
        elseif real(input(k))>4&real(input(k))<=6
            DemoduResult(6*k-5)=3*(real(input(k))-2);
        elseif real(input(k))>6
            DemoduResult(6*k-5)=4*(real(input(k))-3);
        elseif real(input(k))>=-4&real(input(k))<-2
            DemoduResult(6*k-5)=2*(real(input(k))+1);
        elseif real(input(k))>=-6&real(input(k))<-4
            DemoduResult(6*k-5)=3*(real(input(k))+2);
        else
            DemoduResult(6*k-5)=4*(real(input(k))+3);
        end
        if abs(imag(input(k)))<=2
            DemoduResult(6*k-2)=imag(input(k));
        elseif imag(input(k))>2&imag(input(k))<=4
            DemoduResult(6*k-2)=2*(imag(input(k))-1);
        elseif imag(input(k))>4&imag(input(k))<=6
            DemoduResult(6*k-2)=3*(imag(input(k))-2);
        elseif imag(input(k))>6
            DemoduResult(6*k-2)=4*(imag(input(k))-3);
        elseif imag(input(k))>=-4&imag(input(k))<-2
            DemoduResult(6*k-2)=2*(imag(input(k))+1);
        elseif imag(input(k))>=-6&imag(input(k))<-4
            DemoduResult(6*k-2)=3*(imag(input(k))+2);
        else
            DemoduResult(6*k-2)=4*(imag(input(k))+3);
        end
        % b1 & b4
        if real(input(k))>0&real(input(k))<=2
            DemoduResult(6*k-4)=2*(3-real(input(k)));
        elseif real(input(k))>2&real(input(k))<=6
            DemoduResult(6*k-4)=4-real(input(k));
        elseif real(input(k))>6
            DemoduResult(6*k-4)=2*(5-real(input(k)));
        elseif real(input(k))>-2&real(input(k))<=0
            DemoduResult(6*k-4)=2*(3+real(input(k)));
        elseif real(input(k))>-6&real(input(k))<=-2
            DemoduResult(6*k-4)=4+real(input(k));
        else
            DemoduResult(6*k-4)=2*(5+real(input(k)));
        end
        if imag(input(k))>0&imag(input(k))<=2
            DemoduResult(6*k-1)=2*(3-imag(input(k)));
        elseif imag(input(k))>2&imag(input(k))<=6
            DemoduResult(6*k-1)=4-imag(input(k));
        elseif imag(input(k))>6
            DemoduResult(6*k-1)=2*(5-imag(input(k)));
        elseif imag(input(k))>-2&imag(input(k))<=0
            DemoduResult(6*k-1)=2*(3+imag(input(k)));
        elseif imag(input(k))>-6&imag(input(k))<=-2
            DemoduResult(6*k-1)=4+imag(input(k));
        else
            DemoduResult(6*k-1)=2*(5+imag(input(k)));
        end
        % b2 & b5
        if real(input(k))>4
            DemoduResult(6*k-3)=6-real(input(k));
        elseif real(input(k))<-4
            DemoduResult(6*k-3)=6+real(input(k));
        elseif real(input(k))>0&real(input(k))<=4
            DemoduResult(6*k-3)=real(input(k))-2;
        else 
            DemoduResult(6*k-3)=-2-real(input(k));
        end
        if imag(input(k))>4
            DemoduResult(6*k)=6-imag(input(k));
        elseif imag(input(k))<-4
            DemoduResult(6*k)=6+imag(input(k));
        elseif imag(input(k))>0&imag(input(k))<=4
            DemoduResult(6*k)=imag(input(k))-2;
        else 
            DemoduResult(6*k)=-2-imag(input(k));
        end
    end
end

⌨️ 快捷键说明

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