Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

qamdemod

説明

Z = qamdemod(Y,M) は、所与の変調次数 M の直交振幅変調 (QAM) 信号 Y について、復調した信号 Z を返します。

Z = qamdemod(Y,M,symOrder) は、復調した信号 Z を返し、復調のシンボルの順序を指定します。

Z = qamdemod(___,Name=Value) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、OutputType=bit は出力信号の型をビットに設定します。

すべて折りたたむ

8-QAM 信号を復調し、シンボル 0 および 3 に対応する点をプロットします。

ランダムな 8 値データ シンボルを生成します。

data = randi([0 7],1000,1);

8-QAM を適用して data を変調します。

txSig = qammod(data,8);

AWGN チャネルを通して、変調された信号を渡します。

rxSig = awgn(txSig,18,'measured');

初期位相 π/8 を使用して受信信号を復調します。

rxData = qamdemod(rxSig.*exp(-1i*pi/8),8);

基準コンスタレーション点を生成します。

refpts = qammod((0:7)',8) .* exp(1i*pi/8);

シンボル 0 および 3 に対応する受信信号の点を、基準コンスタレーションに重ねてプロットします。これらのシンボルに対応する受信データが表示されます。

plot(rxSig(rxData==0),'g.');
hold on
plot(rxSig(rxData==3),'c.');
plot(refpts,'r*')
text(real(refpts)+0.1,imag(refpts),num2str((0:7)'))
xlabel('In-Phase')
ylabel('Quadrature')
legend('Points corresponding to 0','Points corresponding to 3', ...
    'Reference constellation','location','nw');

WLAN シンボル マッピングを伴う 16-QAM を使用して、ランダム データを変調および復調します。入力データ シンボルが復調されたシンボルに一致することを検証します。

ランダムなシンボルの 3 次元配列を生成します。

x = randi([0,15],20,4,2);

WLAN 標準に基づいて 16-QAM コンスタレーション用のカスタムのシンボル マッピングを作成します。

wlanSymMap = [2 3 1 0 6 7 5 4 14 15 13 12 10 11 9 8];

データを変調し、単位平均信号強度をもつようにコンスタレーションを設定します。コンスタレーションをプロットします。

y = qammod(x,16,wlanSymMap, ...
    UnitAveragePower=true, ...
    PlotConstellation=true);

受信信号を復調します。

z = qamdemod(y,16,wlanSymMap, ...
    UnitAveragePower=true);

復調された信号が元のデータと等しいことを検証します。

isequal(x,z)
ans = logical
   1

固定小数点 QAM 信号を復調し、データが正しく復元されていることを検証します。

変調次数を 64 として設定し、シンボルあたりのビット数を求めます。

M = 64;
bitsPerSym = log2(M);

ランダムなビットを生成します。ビット モードで動作している場合、入力データの長さはシンボルあたりのビット数の整数倍でなければなりません。

x = randi([0 1],10*bitsPerSym,1);

バイナリ シンボル マッピングを使用して入力データを変調します。固定小数点データを出力するように変調器を設定します。数値データ型は符号付きで、語長は 16 ビット、小数部の長さは 10 ビットです。

y = qammod(x,M,'bin', ...
    InputType='bit', ...
    OutputDataType=numerictype(1,16,10));

64-QAM 信号を復調します。復調されたデータが入力データと一致することを検証します。

z = qamdemod(y,M,'bin',OutputType='bit');
s = isequal(x,double(z))
s = logical
   1

硬判定および軟判定ビタビ復号化器の AWGN 環境下でのビット エラー レート (BER) 性能を推定します。この性能を、符号化されていない 64-QAM リンクの性能と比較します。

シミュレーション パラメーターを設定します。

rng default
M = 64;                % Modulation order
k = log2(M);           % Bits per symbol
EbNoVec = (4:10)';     % Eb/No values (dB)
numSymPerFrame = 1000; % Number of QAM symbols per frame

BER の結果のベクトルを初期化します。

berEstSoft = zeros(size(EbNoVec)); 
berEstHard = zeros(size(EbNoVec));

符号化率 1/2、拘束長 7 の畳み込み符号に対するトレリス構造体およびトレースバック長を設定します。

trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;

主処理ループでは以下の手順を実行します。

  • バイナリ データを生成する

  • データの畳み込み符号化

  • データ シンボルに QAM 変調を適用します。送信信号の単位平均パワーを指定する

  • AWGN チャネルを通して、変調された信号を渡す

  • 硬判定手法と近似 LLR 手法を使用して受信信号を復調します。受信信号の単位平均パワーを指定する

  • 硬判定手法と非量子化手法を使用して信号をビタビ復号化する

  • ビット エラー数を計算する

while ループは、誤りが 100 個検出されるか 107 ビットが転送されるまで継続します。

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Noise variance calculation for unity average signal power
    noiseVar = 10.^(-snrdB/10);
    % Reset the error and bit counters
    [numErrsSoft,numErrsHard,numBits] = deal(0);
    
    while numErrsSoft < 100 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame*k,1);
        
        % Convolutionally encode the data
        dataEnc = convenc(dataIn,trellis);
        
        % QAM modulate
        txSig = qammod(dataEnc,M, ...
            InputType='bit', ...
            UnitAveragePower=true);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal using hard decision (bit) and
        % soft decision (approximate LLR) approaches.
        rxDataHard = qamdemod(rxSig,M, ...
            OutputType='bit', ...
            UnitAveragePower=true);
        rxDataSoft = qamdemod(rxSig,M, ...
            OutputType='approxllr', ...
            UnitAveragePower=true, ...
            NoiseVariance=noiseVar);
        
        % Viterbi decode the demodulated data
        dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
        dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
        
        % Calculate the number of bit errors in the frame. 
        % Adjust for the decoding delay, which is equal to 
        % the traceback depth.
        numErrsInFrameHard = ...
            biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
        numErrsInFrameSoft = ...
            biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
        
        % Increment the error and bit counters
        numErrsHard = numErrsHard + numErrsInFrameHard;
        numErrsSoft = numErrsSoft + numErrsInFrameSoft;
        numBits = numBits + numSymPerFrame*k;

    end
    
    % Estimate the BER for both methods
    berEstSoft(n) = numErrsSoft/numBits;
    berEstHard(n) = numErrsHard/numBits;
end

硬判定と軟判定の推定 BER データをプロットします。符号化されていない 64-QAM チャネルの理論上の性能をプロットします。

semilogy(EbNoVec,[berEstSoft berEstHard],'-*')
hold on
semilogy(EbNoVec,berawgn(EbNoVec,'qam',M))
legend('Soft','Hard','Uncoded','location','best')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

予想どおり、軟判定復号化の結果が最も優れています。

関数 qamdemod を使用して、OQPSK 変調された信号の軟判定出力をシミュレートします。

OQPSK 変調された信号を生成します。

sps = 4;
msg = randi([0 1],1000,1);
oqpskMod = comm.OQPSKModulator( ...
    SamplesPerSymbol=sps, ...
    BitInput=true);
oqpskSig = oqpskMod(msg);

生成された信号にノイズを追加します。

impairedSig = awgn(oqpskSig,15);

軟判定復調の実行

QPSK に相当する信号を作成し、同相と直交を揃えます。

impairedQPSK = complex( ...
    real(impairedSig(1+sps/2:end-sps/2)), ...
    imag(impairedSig(sps+1:end)));

受信した OQPSK 信号に整合フィルターを適用します。

halfSinePulse = sin(0:pi/sps:(sps)*pi/sps);
matchedFilter = dsp.FIRDecimator(sps,halfSinePulse, ...
    DecimationOffset=sps/2);
filteredQPSK = matchedFilter(impairedQPSK);

フィルター処理した OQPSK 信号の軟復調を実行するために、関数 qamdemod を使用します。qamdemod のシンボル マッピングを comm.OQPSKModulator で使用されるシンボル マッピングに一致させてから、信号を復調します。

oqpskModSymbolMapping = [1 3 0 2];
demodulated = qamdemod(filteredQPSK,4,oqpskModSymbolMapping, ...
    OutputType='llr');

ユーティリティ関数 helperAvgPow2MinD を使用して、関数 qammod および qamdemod の硬判定出力用に平均電力の正規化を適用します。正規化された平均電力に合わせてコンスタレーションをスケーリングし、基準となるコンスタレーションとスケーリング後のコンスタレーションをプロットします。

指定した平均電力と変調次数に基づいてシンボルの最小距離を計算します。

M = 64;
avgPwr = 2;
minD = helperAvgPow2MinD(avgPwr,M);

範囲 [0, M - 1] のランダムな整数から成る信号を変調し、変調後のシンボルをスケーリングします。

x = randi([0,M-1],1000,1);
y = qammod(x,M);
yTx = (minD/2) .* y;

信号の平均電力が、指定した平均電力 avgPow とほぼ同じであることを確認します。

sigPwr = mean(abs(yTx).^2)
sigPwr = 2.0141
avgPwr
avgPwr = 2

RF またはチャネル劣化要因を適用せずに、送信信号を受信信号に割り当てます。受信信号を歪ませる劣化要因がないため、復調された信号は元の信号と一致します。硬判定を使用してシンボルを復調し、信号が正しく復調されたことを確認します。

yRx = yTx;
z = qamdemod(yRx*2/minD,M);
checkDemodIsEqual = isequal(x,z)
checkDemodIsEqual = logical
   1

refC = qammod([0:M-1]',M);

コンスタレーションを表示します。

maxAx = ceil(max(abs(refC)));
cd = comm.ConstellationDiagram(2, ...
    'ShowReferenceConstellation',0, ...
    'ShowLegend',true, ...
    'XLimits',[-(maxAx) maxAx],'YLimits',[-(maxAx) maxAx], ...
    'ChannelNames', ...
    {'y','yTx'});
cd(y,yTx)

ユーティリティ関数 helperPeakPow2MinD を使用して、関数 qammod および qamdemod の硬判定出力用にピーク電力を正規化します。正規化されたピーク電力に合わせてコンスタレーションをスケーリングし、基準となるコンスタレーションとスケーリング後のコンスタレーションをプロットします。

指定したピーク電力と変調次数に基づいてシンボルの最小距離を計算します。

M = 16;
pkPwr = 30;
minD = helperPeakPow2MinD(pkPwr,M);

範囲 [0, M - 1] のランダムな整数から成る信号を変調し、変調後のシンボルをスケーリングします。

x = randi([0,M-1],1000,1);
y = qammod(x,M);
yTx = (minD/2) .* y;

信号のピーク電力が、指定したピーク電力 pkPow とほぼ同じであることを確認します。

sigPwr = max(abs(yTx).^2)
sigPwr = 30
pkPwr
pkPwr = 30

RF またはチャネル劣化要因を適用せずに、送信信号を受信信号に割り当てます。受信信号を歪ませる劣化要因がないため、復調された信号は元の信号と一致します。硬判定を使用してシンボルを復調し、信号が正しく復調されたことを確認します。

yRx = yTx;
z = qamdemod(yRx*2/minD,M);
checkDemodIsEqual = isequal(x,z)
checkDemodIsEqual = logical
   1

refC = qammod([0:M-1]',M);

コンスタレーションを表示します。

maxAx = ceil(max(abs(refC)));
cd = comm.ConstellationDiagram(2, ...
    'ShowReferenceConstellation',0, ...
    'ShowLegend',true, ...
    'XLimits',[-(maxAx) maxAx],'YLimits',[-(maxAx) maxAx], ...
    'ChannelNames', ...
    {'y','yTx'});
cd(y,yTx)

入力引数

すべて折りたたむ

QAM の結果として得られた入力信号。複素数値のスカラー、ベクトル、行列または 3 次元配列として指定します。行列および 3 次元配列の各列が独立したチャネルと見なされます。

データ型: double | single | fi
複素数のサポート: あり

変調次数。2 の正の整数乗として指定します。変調次数は信号コンスタレーション点の数を指定します。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

シンボルの順序。以下のいずれかのオプションを指定します。

  • 'gray' — グレイ符号の順序を使用します。詳細については、グレイ符号を参照してください。

  • 'bin' — バイナリ符号の順序を使用します。

  • ベクトル — カスタムのシンボル順序を使用します。ベクトルの長さは M でなければなりません。ベクトルは、範囲 [0, (M – 1)] の一意の要素値を使用しなければなりません。最初の要素はコンスタレーションの左上の点に対応しており、続く要素は左から右の列方向に実行されます。

データ型: string | char | double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: Z = qamdemod(Y,M,symOrder,'OutputType','bit')

コンスタレーションを単位平均電力にスケーリングするオプション。数値または logical を使用して、0 (false) または 1 (true) として指定します。

  • true に設定した場合、関数は 1 オームを基準とした 1 ワットの平均電力にコンスタレーションをスケーリングします。

  • false に設定した場合、関数は、QAM コンスタレーション点が最小距離 2 で分割されるように、コンスタレーションをスケーリングします。

出力のタイプ。'integer''bit''llr' または 'approxllr' として指定します。

出力のデータ型。'double''single''uint8' 'uint16''uint32''int8' 'int16''int32'、または 'logical' として指定します。この引数は、出力される変調後シンボルの最終的なデータ型を決定します。

  • OutputType'integer' または 'bit' として指定した場合、出力のデータ型を 'double''single''uint8' 'uint16''uint32''int8' 'int16'、または 'int32' として指定できます。

  • OutputType'bit' として指定した場合、出力のデータ型を 'logical' としても指定できます。

  • OutputType'llr' または 'approxllr' として指定した場合、この引数は無視され、出力のデータ型は入力 Y のデータ型と同じになります。

  • この引数を指定しない場合、出力のデータ型は、入力 Y が浮動小数点数の場合は Y のデータ型と同じになり、入力 Y が固定小数点数の場合は uint1 になります。

ノイズ分散。正のスカラーまたは正の値のベクトルとして指定します。この引数を設定する場合、次のようになります。

  • 正のスカラー — 同じノイズ分散値がすべての入力要素で使用されます。

  • 正の値のベクトル — ベクトルの長さは入力信号の最後の次元の要素数に等しくなければなりません。ベクトルの各要素は、対応する最後の次元に沿った入力のすべての要素のノイズ分散を指定します。

ヒント

厳密な LLR アルゴリズムは有限の精度演算で指数を計算します。計算に非常に大きな正または負の振幅が含まれる場合、厳密な LLR アルゴリズムの結果は次のようになります。

  • ノイズ分散が極度に大きい値の場合は、Inf または -Inf

  • ノイズ分散と信号強度の両方が非常に小さい値の場合は NaN

近似 LLR アルゴリズムでは指数が計算されません。近似 LLR アルゴリズムを使用することによって、Inf-Inf、および NaN の結果を回避できます。

依存関係

この名前と値のペアの引数を有効にするには、OutputType'llr' または 'approxllr' に設定します。

コンスタレーションをプロットするためのオプション。数値または logical を使用して、0 (false) または 1 (true) として指定します。QAM コンスタレーションをプロットするには、PlotConstellation=true を指定します。

出力引数

すべて折りたたむ

復調された出力信号。スカラー、ベクトル、行列または 3 次元配列として返されます。データ型は入力信号 Y と同じです。この出力の値と次元は、次の表に示すように、指定した OutputType 値によって異なります。

'OutputType'qamdemod の戻り値出力の次元
'integer'復調した整数値 ([0, (M – 1)] の範囲)Z の次元は入力 Y と同じになります。
'bit'復調されたビットZ の行数は、Y の行数の log2(M) 倍になります。復調された各シンボルは log2(M) ビットのグループにマッピングされます。ここで、最初のビットは最上位ビット (MSB) を表し、最後のビットは最下位ビット (LSB) を表します。
'llr'厳密な対数尤度アルゴリズムを使用して計算された各ビットの対数尤度比の値。詳細は、厳密な LLR アルゴリズムを参照してください。
'approxllr'各ビットの近似対数尤度比の値。この値は近似対数尤度アルゴリズムを使用して計算されます。詳細については、近似 LLR アルゴリズムを参照してください。

詳細

すべて折りたたむ

グレイ符号

交番 2 進符号とも呼ばれる "グレイ符号" は、隣接するコンスタレーション点の間でビット パターンが 1 ビットだけ異なるシステムです。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入

すべて展開する