Main Content

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

位相変調の例

以下の例では、位相変調 (PM) の手法を示します。

PSK および PAM 信号への位相ノイズの影響の比較

PSK と PAM の変調スキームを比較し、PSK の方が位相ノイズの影響を受けやすいことを示します。PSK の方が位相ノイズの影響を受けやすいのは、PAM コンスタレーションが線形であるのに対し PSK コンスタレーションが円形であるためです。

シンボル数と変調次数のパラメーターを指定します。ランダム データ シンボルを生成します。

len = 10000;                
M = 16;                     
msg = randi([0 M-1],len,1);

位相ノイズ System object™ を作成し、構成された設定を表示します。

phasenoise = comm.PhaseNoise(Level=[-70 -80])
phasenoise = 
  comm.PhaseNoise with properties:

              Level: [-70 -80]
    FrequencyOffset: [2000 20000]
         SampleRate: 1000000
       RandomStream: 'Global stream'

PSK と PAM の両方を使用して msg を変調し、2 つの方法を比較します。

txpsk = pskmod(msg,M);
txpam = pammod(msg,M);

変調された信号の位相をずらします。

rxpsk = phasenoise(txpsk);
rxpam = phasenoise(txpam);

受信信号の散布図を作成します。

scatterplot(rxpsk);
title('Noisy PSK Scatter Plot')

scatterplot(rxpam);
title('Noisy PAM Scatter Plot')

受信信号を復調します。

recovpsk = pskdemod(rxpsk,M);
recovpam = pamdemod(rxpam,M);

それぞれの変調スキームのシンボル誤りの数を計算します。PSK 信号の場合、かなり多数のシンボル誤りが発生します。

numerrs_psk = symerr(msg,recovpsk);
numerrs_pam = symerr(msg,recovpam);
[numerrs_psk numerrs_pam]
ans = 1×2

   795     3

DQPSK 信号コンスタレーション点と遷移の比較

このモデルでは、DQPSK Modulator Baseband ブロックの出力をプロットします。イメージは DQPSK 信号コンスタレーションの各シンボルから次のシンボルへの有効な遷移を示します。

doc_dqpsk_plot は次のブロックを使用します。

Random Integer Generator ブロックでは、M-ary 数を 4 に設定し、初期シードを任意の正のスカラー整数 (結果をランダムにするため関数randnの出力を使用可能) に設定し、サンプル時間を 0.01 に設定します。

DQPSK Modulator Baseband ブロック内の既定の位相オフセットは π/4 であるため、このプロットは π/4-DQPSK 変調を示しています。位相オフセットの信号コンスタレーションへの影響を確認するには、DQPSK Modulator Baseband ブロックの [Phase offset] パラメーターを π/8 または別の値に変更します。再びモデルを再び実行し、プロットの変化の様子を観察します。

8-PSK 変調データの GPU をベースとした畳み込み符号化とビタビ復号化

GPU ベースの畳み込み符号化器 System object を作成します。

conEnc = comm.gpu.ConvolutionalEncoder;

ビット入力信号を受け入れる GPU ベースの位相偏移変調 (PSK) の変調器 System object を作成します。

modPSK = comm.gpu.PSKModulator(BitInput=true);

S/N 比が 7 の GPU ベースの加法性ホワイト ガウス ノイズ (AWGN) チャネル System object を作成します。

chan = comm.gpu.AWGNChannel( ...
    NoiseMethod='Signal to noise ratio (SNR)', ...
    SNR=7);

ビット値の列ベクトルを出力する GPU ベースの PSK 復調器 System object を作成します。

demodPSK = comm.gpu.PSKDemodulator(BitOutput=true);

0 または 1 の硬判定値の入力ベクトルを受け入れる、GPU ベースのビタビ復号化器 System object を作成します。

vDec = comm.gpu.ViterbiDecoder(InputFormat='Hard');

3 つのデータ サンプルを無視した後に比較を行う、エラー レート System object を作成します。受信データは送信データよりも 34 個のサンプル分遅れます。

error = comm.ErrorRate(ComputationDelay=3,ReceiveDelay=34);

次の for ループを使用してデータを処理し、シミュレーションを実行します。

for counter = 1:20
    data = randi([0 1],30,1);
    encodedData = conEnc(gpuArray(data));
    modSignal = modPSK(encodedData);
    receivedSignal = chan(modSignal);
    demodSignal = demodPSK(receivedSignal);
    receivedBits = vDec(demodSignal);
    errors = error(data,gather(receivedBits));
end

誤り数を表示します。

errors(2)
ans = 26

参考

関数

オブジェクト

ブロック

関連する例

詳細