qamdemod
直交振幅復調
説明
例
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 個検出されるか ビットが転送されるまで継続します。
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
シンボルの順序。以下のいずれかのオプションを指定します。
データ型: 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++ コードを生成します。
この関数は、GPU 配列の入力をサポートします。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入関数 qamdemod は、引数 OutputDataType を使用して出力のデータ型を拡張することができます。これまで、出力のデータ型は、入力のデータ型から継承されるか、固定小数点数に設定されていました。今回の追加により、出力のデータ型を single または double としても指定できるようになりました。
関数 qamdemod において、グラフィックス処理装置 (GPU) でコードを実行するための gpuArray (Parallel Computing Toolbox) オブジェクト処理のサポートが追加されました。
R2018b 以降、関数 qamdemod を使用して QAM コンスタレーションの初期位相をオフセットできなくなりました。
代わりに、関数 genqamdemod を使用して復調される QAM 信号の初期位相をオフセットします。あるいは、次のコードに示すように、qamdemod の変調された入力と目的の初期位相を乗算することもできます。
Z = qamdemod(Y.*exp(-1i*initPhase,M))
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)