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 リンクの性能と比較します。

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

clear; close all
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');

入力引数

すべて折りたたむ

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

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

変調次数。2 のべき乗のスカラー整数で指定します。変調次数は信号コンスタレーションのポイント数を指定します。

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

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

  • 'gray'グレイ符号の順序を使用します。

  • 'bin' — 通常の 2 値符号の順序を使用します。

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

データ型: char | double

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: z = qamdemod(y,M,symOrder,'OutputType','bit')

単位平均パワー フラグ。'UnitAveragePower' と数値または logical 0 (false) または 1 (true) で構成されるコンマ区切りペアとして指定します。このフラグが 1 (true) の場合、関数は 1 オームを基準とした 1 ワットの平均電力にコンスタレーションをスケーリングします。このフラグが 0 (false) の場合、関数は、QAM コンスタレーション点が最小距離 2 で分割されるように、コンスタレーションをスケーリングします。

出力のタイプ。'OutputType' と、'integer''bit''llr''approxllr' のいずれかから成るコンマ区切りのペアとして指定します。

データ型: char

ノイズ分散。'NoiseVariance' と次のオプションのいずれかで構成されるコンマ区切りのペアとして指定します。

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

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

ヒント

'OutputType'‘llr’ のときに、復調計算で Inf 値または -Inf 値が出力される場合は、指定されたノイズ分散値が S/N 比 (SNR) より小さいためと考えられます。対数尤度アルゴリズムでは有限の精度演算を使用して指数が計算されるため、大きいまたは小さい数値を扱う指数計算で正または負の無限大が得られることがあります。詳細は、厳密な LLR アルゴリズムを参照してください。

この問題を回避するには、代わりに 'OutputType'‘approxllr’ に設定します。近似 LLR アルゴリズムでは指数が計算されません。

依存関係

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

データ型: double

コンスタレーションをプロットするためのオプション。'PlotConstellation' と数値または 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 ビットだけ異なるシステムです。

互換性の考慮事項

すべて展開する

R2018b 以降はエラー

拡張機能

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

R2006a より前に導入