Main Content

General QAM Modulation-Demodulation Compatibility Considerations

Replace instances of modem.genqammod and modem.genqamdemod with genqammod and genqamdemod. To generate soft decision output, use comm.GeneralQAMModulator and comm.GeneralQAMDemodulator.

  • This code sample shows you bit input and multichannel input support for general QAM modulated signals:

    %% Bit Input
    % Multichannel input
    x = randi([0,1],16,3);
    
    M = 16;
    nBits = log2(M);
    inSize = size(x);
    outSize = inSize;
    % nBits bits make one symbol
    outSize(1) = outSize(1)/nBits;
    
    % M-QAM constellation
    const = qammod((0:M-1)',M);
    
    % Modulate
    m1 = modem.genqammod('InputType','Bit','Constellation',const);
    ym1 = m1.modulate(x);
    
    % Convert bit input to integer
    % Each column is a bit representation of an integer
    xTmp = reshape(x,nBits,numel(x)/nBits);
    % each row is a bit representation of an integer, left-MSB
    xTmp = xTmp'; 
    xIntCol = bi2de(xTmp,'left-msb');
    xIntMat = reshape(xIntCol,outSize);
    
    % Compare modulator function output
    yf1 = genqammod(xIntMat,const);
    err = max(abs(ym1(:) - yf1(:)))
    err =
    
         0

  • This code sample shows you how to simulate multichannel input/output and soft decision output for general QAM-modulated signals:

    %% Soft decision output
    % Multichannel input
    x = randi([0,1],16,3);
    
    M = 16;
    nBits = log2(M);
    inSize = size(x);
    outSize = inSize;
    % nBits bits make one symbol
    outSize(1) = outSize(1)/nBits;
    
    % 16-QAM constellation
    const = qammod((0:M-1)',M);
    
    % Modulate
    m1 = modem.genqammod('InputType','Bit','Constellation',const);
    ym1 = m1.modulate(x);
    
    % Convert bit input to integer
    % Each column is a bit representation of an integer
    xTmp = reshape(x,nBits,numel(x)/nBits);
    % Each row is a bit representation of an integer, left-MSB
    xTmp = xTmp'; 
    xIntCol = bi2de(xTmp,'left-msb');
    
    % Compare System object output
    s1 = comm.GeneralQAMModulator('Constellation',const);
    ysTmp = s1(xIntCol);
    ys1 = reshape(ysTmp,outSize);
    
    err1 = max(abs(ym1(:) - ys1(:)))
    
    % Demodulate (LLR)
    m2 = modem.genqamdemod('Constellation',const,'OutputType','Bit', ...
        'DecisionType','LLR','NoiseVariance',0.2);
    ym2 = m2.demodulate(ym1);
    
    s2 = comm.GeneralQAMDemodulator('Constellation',const,'BitOutput',true, ...
        'DecisionMethod','Log-likelihood ratio','Variance',0.2);
    % Columnize ys1 as System object supports only column vector input
    ys2 = s2(ys1(:));
    ys2 = reshape(ys2,inSize);
    err2 = max(abs(ym2(:) - ys2(:)))
    
    err1 =
    
         0
    
    err2 =
    
         0