このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
シンボル マッピングの例
グレイ符号の順序とバイナリ符号の順序のエラー レートの比較
適切に構成された PSK 変調器および PSK 復調器 System object を使用して、グレイ符号化とバイナリ符号化を比較します。このシミュレーションは、ビット エネルギーとノイズ パワー スペクトル密度の比 () の値の範囲に対して反復実行され、各 点についてグレイ符号化が指定したビット エラーの最大数 (maxNumErrs
) またはビットの最大数 (maxNumBits
) に達するまで実行されます。
初期化
システム変数を初期化し、変調、復調、AWGN チャネル、エラー レートの各処理に対する System object を作成します。comm.AWGNChannel
System object™ および関数randi
では既定の乱数ストリームが使用されるため、乱数発生器シードを設定して、結果に再現性をもたせます。乱数ストリーム シードを設定する前に、乱数発生器の状態を保存し、例の最後に復元します。
M = 8; % Modulation order for 8-PSK sps = 10000; % Samples per frame maxNumErrs=100; % Stop simulation if 100 errors reached maxNumBits=1e8; % Stop simulation if 1e8 bits transmitted prevState = rng; rng(529558);
PSK 変調器 System object および PSK 復調器 System object を作成し、バイナリ入力データを 8-PSK グレイ符号化された信号コンスタレーションとバイナリ符号コンスタレーションに割り当てます。
pskmod = comm.PSKModulator( ... ModulationOrder=M, ... SymbolMapping="Gray", ... PhaseOffset=0, ... BitInput=true); pskdemod = comm.PSKDemodulator( ... ModulationOrder=M, ... SymbolMapping="Gray", ... PhaseOffset=0, ... BitOutput=true, ... OutputDataType="uint8", ... DecisionMethod="Hard decision"); pskmodb = comm.PSKModulator( ... ModulationOrder=M, ... SymbolMapping="Binary", ... PhaseOffset=0, ... BitInput=true); pskdemodb = comm.PSKDemodulator( ... ModulationOrder=M, ... SymbolMapping="Binary", ... PhaseOffset=0, ... BitOutput=true, ... OutputDataType="uint8", ... DecisionMethod="Hard decision");
AWGN チャネルの System object を作成して、変調信号にノイズを追加します。処理ループのノイズ手法は に設定されます。PSK 変調器は 1 W の電力でシンボルを生成するので、AWGN チャネル オブジェクトの信号強度プロパティも 1 W に設定されます。
awgnchan = comm.AWGNChannel( ... NoiseMethod="Signal to noise ratio (Eb/No)", ... BitsPerSymbol=log2(M), ... SignalPower=1);
シンボル エラー レート計算機 System object とビット エラー レート計算機 System object を作成し、復調された整数およびビット データと元のソース データを比較します。この比較により、シンボル誤りおよびビット エラーの統計値が生成されます。エラー レート計算機 System object の出力は、計算されたエラー レート、観測されたエラー数、および処理されたデータ量から構成された 3 要素ベクトルになります。シミュレーションでは 3 要素ベクトルを使用して、シミュレーションを停止するタイミングを決定します。
symerror = comm.ErrorRate; biterror = comm.ErrorRate; biterrorb = comm.ErrorRate;
フレーム処理ループ
8-PSK 変調を使用してデータの符号化、変調、および復調を行うフレーム処理ループを設定します。このループは、0 ~ 12 dB の範囲の 値について 2 dB 刻みで通信システムをシミュレートします。
各 値について、グレイ符号化されたビットのビット エラー レート計算機 System object で処理されるエラーの最大数 (maxNumErrs
) またはビットの最大数 (maxNumBits
) のいずれかに達すると、シミュレーションは停止します。
EbNoVec = 0:2:12; % Eb/No values to simulate SERVec = zeros(size(EbNoVec)); % SER history BERVec = zeros(size(EbNoVec)); % BER history for Gray ordered BERVecb = zeros(size(EbNoVec)); % BER history for binary ordered for p = 1:length(EbNoVec) % Reset System objects reset(symerror); reset(biterror); reset(biterrorb); awgnchan.EbNo = EbNoVec(p); % Reset SER and BER for the current Eb/No value SER = zeros(3,1); BER = zeros(3,1); while (BER(2)<maxNumErrs) && (BER(3)<maxNumBits) % Generate random data txSym = randi([0 M-1],sps,1,"uint8"); txBits = int2bit(txSym,log2(M),true); % Convert symbols to bits tx = pskmod(txBits); txb = pskmodb(txBits); rx = awgnchan(tx); rxb = awgnchan(txb); rxBits = pskdemod(rx); rxBitsb = pskdemodb(rxb); rxSym = bit2int(rxBits,log2(M),true); SER = symerror(txSym,rxSym); % SER for Gray-coded data BER = biterror(txBits,rxBits); % BER for Gray-coded data BERb = biterrorb(txBits,rxBitsb); % BER for binary-coded data end % Save history of SER and BER values SERVec(p) = SER(1); BERVec(p) = BER(1); BERVecb(p) = BERb(1); end
既定のストリームを復元します。
rng(prevState)
結果分析
この例のデータを解析して、理論上の性能とシミュレーションでの性能を比較します。関数berawgn
を使用して、理論上の誤り確率を計算します。グレイ符号化のシミュレートされたシンボル エラー レート、グレイ符号化とバイナリ符号化のビット エラー レート、およびグレイ符号化の理論上のシンボル誤り確率とビット エラー確率をプロットします。
[theorBER,theorSER] = berawgn(EbNoVec,"psk",M,"nondiff"); figure; semilogy( ... EbNoVec,SERVec,"o", ... EbNoVec,BERVecb,"x", ... EbNoVec,BERVec,"*", ... EbNoVec,theorSER,"-", ... EbNoVec,theorBER,"-"); legend("Symbol error rate", "Bit error rate (Binary)", ... "Bit error rate (Gray)", "Theoretical Symbol error rate", ... "Theoretical Bit error rate", "Location","SouthWest"); xlabel("Eb/No (dB)"); ylabel("Error Probability"); title("Symbol and Bit Error Probability"); grid on;
Simulink を使用した AWGN チャネルのグレイ符号 M-PSK 変調エラー レート
この例では、doc_gray_code
を使用して、M-PSK 変調のビット エラー レート (BER) とシンボル エラー レート (SER) を計算します。AWGN 環境下での M-PSK 変調の理論上のエラー レート性能を、グレイ符号シンボル マッピングのエラー レート性能およびバイナリ符号シンボル マッピングのエラー レート性能と比較します。
Random Integer Generator ブロックはソースとして機能し、整数のシーケンスを生成します。Integer to Bit Converter ブロックは、各整数を対応するバイナリ表現に変換します。doc_gray_code
モデルのM-PSK Modulator Basebandブロックは、次を行います。
[0, (M - 1] の範囲の整数を表すバイナリ値の入力を受け入れる。ここで、M は変調次数です。
グレイ符号の順序付けを使用して、バイナリ表現をコンスタレーション点に割り当てる。
[0, (2 (M - 1) / M)] の範囲の等間隔の位相をもつ、単位振幅の複素フェーザ出力を生成する。
AWGN Channel ブロックは、変調されたデータにホワイト ガウス ノイズを付加します。M-PSK Demodulator Baseband ブロックは、ノイズを含むデータを復調します。Bit to Integer Converter ブロックは、各バイナリ表現を、対応する整数に変換します。次に、2 つの個別のError Rate Calculationブロックが、復調されたデータのエラー レートを計算します。"SER Calculation" というラベルの付いたブロックは整数データを比較してシンボル エラー レートの統計を計算し、"BER Calculation" というラベルの付いたブロックはビット データを比較してビット エラー レートの統計を計算します。Error Rate Calculation ブロックの出力は、計算されたエラー レート、観察された誤り数、および処理されたデータ量を含む 3 要素ベクトルになります。
シミュレーションの実行時間を短縮し、かつ Eb/N0 比が増加してもエラーの統計値が確実に安定するように、モデルは 100 個のエラーが発生するか 1e8 ビットが送信されるまで実行するように構成されています。
モデルは、コールバック関数 PreLoadFcn
を使用して、ブロック パラメーターの構成に使用する変数を初期化します。詳細については、モデル コールバック (Simulink)を参照してください。
エラー レート曲線の生成
関数
を使用して、AWGN 環境下での非差分 8-PSK の理論上の BER を Eb/N0 値の範囲にわたって計算します。グレイ符号シンボル マッピングを使用し、同じ範囲の Eb/N0 値にわたって berawgn
doc_gray_code
モデルをシミュレーションします。
"Constellation orders" パラメーターを Gray
ではなく Binary
に設定するように M-PSK Modulator Baseband ブロックと M-PSK Demodulator Baseband ブロックを変更して、グレイ符号化とバイナリ符号化を比較します。バイナリ符号シンボル マッピングを使用し、同じ範囲の Eb/N0 値にわたって doc_gray_code
モデルをシミュレーションします。
関数semilogy
を使用して結果をプロットします。グレイ符号システムは、バイナリ符号システムよりも優れたエラー レート性能を実現します。さらに、グレイ符号のエラー レートは、理論上のエラー レート統計と一致しています。
グレイ符号化の変調信号
PSK、DPSK、FSK、QAM、および PAM の変調タイプの場合、グレイ コンスタレーションは、対応する変調関数の System object™ またはブロックでシンボル マッピングをグレイ符号化に設定することによって取得されます。既定のシンボル順序は、グレイ符号化された順序を変調のために使用します。
変調関数の場合、"gray"
、"bin"
、またはカスタムのシンボル順序を指定するベクトルを指定できます。この例では、グレイ符号化されたシンボル マッピングで関数qammod
を使用します。コンスタレーション プロットをチェックすると、隣接要素がすべて 1 ビットずつ異なっているため、変調されたシンボルがグレイ符号化されていることがわかります。
k = 4; M = 2^k; y = int2bit([0:M-1]',k,false); symorder = "gray"; xmap = qammod(y,M,symorder, ... InputType="bit", ... PlotConstellation=true);