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 = 0This 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