このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
qamdemod
直交振幅復調
説明
例
8-QAM 信号の復調
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 シンボル マッピングを伴う QAM 復調
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 固定小数点信号の復調
固定小数点 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
硬判定および軟判定ビタビ復号化の BER の推定
硬判定および軟判定ビタビ復号化器の 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')
予想どおり、軟判定復号化の結果が最も優れています。
軟判定 OQPSK 変調/復調
関数 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');
入力引数
y
— 入力信号
スカラー | ベクトル | 行列 | 3 次元配列
QAM の結果として得られた入力信号。複素数値のスカラー、ベクトル、行列または 3 次元配列として指定します。行列および 3 次元配列の各列が独立したチャネルと見なされます。
データ型: single
| double
| fi
複素数のサポート: あり
M
— 変調次数
スカラー整数
変調次数。2 のべき乗のスカラー整数で指定します。変調次数は信号コンスタレーション点の数を指定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name
を引用符で囲みます。
例: z = qamdemod(y,M,symOrder,'OutputType','bit')
UnitAveragePower
— 単位平均パワー フラグ
false
または 0
(既定値) | true
または 1
単位平均パワー フラグ。'UnitAveragePower'
と数値または logical 0
(false
) または 1
(true
) で構成されるコンマ区切りペアとして指定します。このフラグが 1
(true
) の場合、関数は 1 オームを基準とした 1 ワットの平均電力にコンスタレーションをスケーリングします。このフラグが 0
(false
) の場合、関数は、QAM コンスタレーション点が最小距離 2 で分割されるように、コンスタレーションをスケーリングします。
OutputType
— 出力のタイプ
'integer'
(既定値) | 'bit'
| 'llr'
| 'approxllr'
出力のタイプ。'OutputType'
と、'integer'
、'bit'
、'llr'
、'approxllr'
のいずれかから成るコンマ区切りのペアとして指定します。
データ型: char
NoiseVariance
— ノイズ分散
1
(既定値) | 正のスカラー | 正の値のベクトル
ノイズ分散。'NoiseVariance'
と次のオプションのいずれかで構成されるコンマ区切りのペアとして指定します。
正のスカラー — 同じノイズ分散値がすべての入力要素で使用されます。
正の値のベクトル — ベクトルの長さは入力信号の最後の次元の要素数に等しくなければなりません。ベクトルの各要素は、対応する最後の次元に沿った入力のすべての要素のノイズ分散を指定します。
ヒント
対数尤度アルゴリズムでは有限の精度演算を使用して指数が計算されるため、大きいまたは小さい数値を扱う指数計算で正または負の無限大が得られることがあります。近似 LLR アルゴリズムでは指数が計算されません。詳細は、硬判定復調と軟判定復調を参照してください。
'OutputType'
が ‘llr’
のときに、復調計算の出力で Inf
値または -Inf
値が返されるのは、指定されたノイズ分散値が S/N 比 (SNR) より小さいためと考えられます。
出力値 Inf
または -Inf
が返されることを回避するには、'llr'
の代わりに ‘approxllr’
に 'OutputType'
を設定します。
依存関係
この名前と値のペアの引数を有効にするには、'OutputType'
を 'llr'
または 'approxllr'
に設定します。
データ型: double
PlotConstellation
— コンスタレーションをプロットするためのオプション
false
または 0
(既定値) | true
または 1
コンスタレーションをプロットするためのオプション。'PlotConstellation'
と数値または logical 0
(false
) または 1
(true
) で構成されるコンマ区切りペアとして指定します。QAM コンスタレーションをプロットするには、'PlotConstellation'
を true
に設定します。
出力引数
z
— 復調された出力信号
スカラー | ベクトル | 行列 | 3 次元配列
復調された出力信号。スカラー、ベクトル、行列または 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 より前に導入R2018b: 初期位相入力の削除
R2018b 以降、関数 qamdemod
を使用して QAM コンスタレーションの初期位相をオフセットできなくなりました。
代わりに、関数 genqamdemod
を使用して復調される QAM 信号の初期位相をオフセットします。あるいは、次のコードに示すように、qamdemod
の変調された入力と目的の初期位相を乗算することもできます。
z = qamdemod(y.*exp(-1i*initPhase,M))
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)