Main Content

comm.GMSKModulator

GMSK 法を使用した変調

説明

comm.GMSKModulatorSystem object™ は、ガウス最小偏移変調 (GMSK) 法を使用して変調します。出力は、変調信号のベースバンド表現です。詳細については、アルゴリズムを参照してください。

GMSK 法を使用して信号を変調するには、次のようにします。

  1. comm.GMSKModulator オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

gmskmodulator = comm.GMSKModulator は、GMSK 変調方式を使用して入力信号を変調する変調器 System object を作成します。

gmskmodulator = comm.GMSKModulator(Name,Value) は、名前と値からなる 1 つ以上の引数を使用してプロパティを設定します。たとえば、comm.GMSKModulator(PulseLength=6) はガウス パルス整形の長さを 6 つのシンボル区間として指定します。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

入力をビットとして提供するオプション。数値または logical の 0 (false) または 1 (true) として指定します。

  • このプロパティを false に設定する場合、入力 X は、-1 または 1 の値をもつ、倍精度または符号付き整数データ型の列ベクトルでなければなりません。

  • このプロパティを true に設定する場合、入力 X0 および 1 からなる、倍精度または logical データ型の列ベクトルでなければなりません。

データ型: logical

ガウス パルス整形の帯域幅とシンボル時間の積。正のスカラー値として指定します。詳細については、アルゴリズムを参照してください。

変調される信号に対するこのプロパティの効果を確認するには、GMSK 変調される信号に対する帯域幅と時間の積による効果の例を参照してください。

データ型: double

パルス長。正の整数として指定します。パルス長の値は、シンボル区間でのガウス パルス整形の長さを表します。

データ型: double

シンボル プレヒストリ。-11、またはこれらの値と等しい要素を持つベクトルとして指定します。このプロパティは、オブジェクトの最初の呼び出しの前に、変調器によって使用されるデータ シンボルを新しいものから順番に定義します。

  • スカラー値は長さ PulseLength – 1 のベクトルに展開されます。

  • ベクトルの場合、長さが PulseLength – 1 でなければなりません。

データ型: double

変調波形の初期位相オフセット (ラジアン単位)。数値スカラーとして指定します。

データ型: double

シンボルあたりのサンプル数。正の整数として指定します。シンボルあたりのサンプル数は、入力サンプルから出力サンプルへのアップサンプリング係数を表します。

データ型: double

出力のデータ型。'double' または 'single' として指定します。

使用法

説明

Y = gmskmodulator(X) は GMSK 変調を入力データに適用し、変調された GMSK ベースバンド信号を返します。

入力引数

すべて展開する

入力データ。整数、あるいは整数またはビットからなる列ベクトルとして指定します。

  • BitInputfalse に設定する場合、入力データは倍精度または符号付き整数でなければなりません。

  • BitInputtrue に設定する場合、入力データは倍精度または logical でなければなりません。

データ型: double | int8 | int16 | int32 | logical

出力引数

すべて展開する

GMSK 変調されたベースバンド信号。列ベクトルとして返されます。

出力ベクトル Y の長さは、SamplesPerSymbol プロパティ値で指定したシンボルあたりのサンプル数に入力サンプル数を掛け合わせたものと同じです。OutputDataType プロパティは、出力のデータ型を指定します。

データ型: double | single

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

0 と 1 のバイナリ シーケンスを GMSK 変調器の出力にマッピングします。このマッピングは MSK 変調にも適用されます。

バイナリ入力を受け入れる GMSK 変調器を作成します。この変調器のパルス長とシンボルあたりのサンプル数の値は 1 に設定します。

gmskmodulator = comm.GMSKModulator( ...
    BitInput=true, ...
    PulseLength=1, ...
    SamplesPerSymbol=1);

すべて 0 の入力シーケンスを作成します。シーケンスを変調します。

x = zeros(5,1);
y = gmskmodulator(x)
y = 5×1 complex

   1.0000 + 0.0000i
  -0.0000 - 1.0000i
  -1.0000 + 0.0000i
   0.0000 + 1.0000i
   1.0000 - 0.0000i

各点の位相角を決定します。関数 unwrap を使用してトレンドを表示します。

theta = unwrap(angle(y))
theta = 5×1

         0
   -1.5708
   -3.1416
   -4.7124
   -6.2832

0 のシーケンスにより、サンプル間で位相が -π/2 シフトします。

変調器をリセットします。すべて 1 の入力シーケンスを変調します。

reset(gmskmodulator)
x = ones(5,1);
y = gmskmodulator(x)
y = 5×1 complex

   1.0000 + 0.0000i
  -0.0000 + 1.0000i
  -1.0000 - 0.0000i
   0.0000 - 1.0000i
   1.0000 + 0.0000i

各点の位相角を決定します。関数 unwrap を使用してトレンドを表示します。

theta = unwrap(angle(y))
theta = 5×1

         0
    1.5708
    3.1416
    4.7124
    6.2832

1 のシーケンスにより、サンプル間で位相が +π/2 シフトします。

GMSK 変調器と復調器のペアを作成します。AWGN チャネル オブジェクトを作成します。

gmskmodulator = comm.GMSKModulator( ...
    BitInput=true, ...
    InitialPhaseOffset=pi/4);
gmskdemodulator = comm.GMSKDemodulator( ...
    BitOutput=true, ...
    InitialPhaseOffset=pi/4);
channel = comm.AWGNChannel( ...
    NoiseMethod='Signal to noise ratio (SNR)', ...
    SNR=0);

エラー レート計算機を作成し、ビタビ アルゴリズムによって発生する変調器と復調器の間の遅延を考慮します。

errorRate = comm.ErrorRate( ...
    ReceiveDelay=gmskdemodulator.TracebackDepth);

以下の手順を繰り返して 100 フレームのデータを処理します。

  1. 300 要素のランダムなバイナリ データのベクトルを生成します。

  2. データを GMSK 変調します。

  3. 変調データを AWGN チャネルを介して渡します。

  4. データを GMSK 復調します。

  5. データのフレームについて誤り統計を収集します。

for counter = 1:100
   % Transmit 100 3-bit words
   data = randi([0 1],300,1);
   modSignal = gmskmodulator(data);
   noisySignal = channel(modSignal);
   receivedData = gmskdemodulator(noisySignal);
   errorStats = errorRate(data, receivedData);
end

誤りの統計を表示します。

fprintf('Error rate = %f\nNumber of errors = %d\n', ...
         errorStats(1), errorStats(2))
Error rate = 0.000133
Number of errors = 4

この例は、GMSK 変調される信号に対する帯域幅と時間 (BT) の積による効果を説明しています。

バイナリ データのベクトルを作成し、このデータに GMSK 変調を適用します。

d = [0 1 1 0 1 0 0 1 1 1]';
a = comm.GMSKModulator(BitInput=true,SamplesPerSymbol=10)
a = 
  comm.GMSKModulator with properties:

                BitInput: true
    BandwidthTimeProduct: 0.3000
             PulseLength: 4
        SymbolPrehistory: 1
      InitialPhaseOffset: 0
        SamplesPerSymbol: 10
          OutputDataType: 'double'

x = a(d);
BTa = sprintf('BT=%2.1f',a.BandwidthTimeProduct);

位相角をプロットし、関数 unwrap を使用してトレンドをより適切に表示します。

plot(unwrap(angle(x)),'red-');
title('Bandwidth Time Product Effect')
hold on; 
plot(1:10:length(x),unwrap(angle(x(1:10:end))),'*');
grid on

BT 積を 1 に設定し、同じプロットで位相角をプロットします。

a = comm.GMSKModulator(BitInput=true, ...
    SamplesPerSymbol=10,BandwidthTimeProduct=1)
a = 
  comm.GMSKModulator with properties:

                BitInput: true
    BandwidthTimeProduct: 1
             PulseLength: 4
        SymbolPrehistory: 1
      InitialPhaseOffset: 0
        SamplesPerSymbol: 10
          OutputDataType: 'double'

x = a(d);
BTb = sprintf('BT=%2.1f',a.BandwidthTimeProduct);
plot(unwrap(angle(x)),'blue-.');
plot(1:10:length(x),unwrap(angle(x(1:10:end))),'o');

BT 積を 0.1 に設定し、同じプロットで位相角をプロットします。

a = comm.GMSKModulator(BitInput=true, ...
    SamplesPerSymbol=10,BandwidthTimeProduct=0.1)
a = 
  comm.GMSKModulator with properties:

                BitInput: true
    BandwidthTimeProduct: 0.1000
             PulseLength: 4
        SymbolPrehistory: 1
      InitialPhaseOffset: 0
        SamplesPerSymbol: 10
          OutputDataType: 'double'

BTc = sprintf('BT=%2.1f',a.BandwidthTimeProduct);

このパルスの拡散は BT 積に逆比例し、BT が小さくなるほど、ビット シンボル周期において拡散がより大きくなります。パルスのピーク振幅は BT 積に直接比例し、ピーク振幅が小さくなるほど、ビット シンボル周期において拡散がより小さくなります。パルスの帯域幅が減少するにつれ、パルス存続時間が長くなります。

x = a(d);
plot(unwrap(angle(x)),'green--');
plot(1:10:length(x),unwrap(angle(x(1:10:end))),'x');
legend(BTa,'',BTb,'',BTc,'')
hold off;

Figure contains an axes object. The axes object with title Bandwidth Time Product Effect contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent BT=0.3, BT=1.0, BT=0.1.

パルス長の異なるガウス最小偏移変調 (GMSK) および最小偏移変調 (MSK) のアイ ダイアグラムをプロットして GMSK および MSK の変調スキームを比較します。

シンボル変数あたりのサンプルを設定します。

sps = 8;

ランダムなバイナリ データを生成します。

data = randi([0 1],1000,1);

バイナリ入力を受け入れる GMSK 変調器および MSK 変調器を作成します。GMSK 変調器の PulseLength プロパティを 1 に設定します。

gmskMod = comm.GMSKModulator( ...
    BitInput=true, ...
    PulseLength=1, ...
    SamplesPerSymbol=sps);
mskMod = comm.MSKModulator( ...
    BitInput=true, ...
    SamplesPerSymbol=sps);

GMSK 変調器および MSK 変調器を使用してデータを変調します。

modSigGMSK = gmskMod(data);
modSigMSK = mskMod(data);

SNR が 30 dB の AWGN チャネル経由で変調信号を渡します。

rxSigGMSK = awgn(modSigGMSK,30);
rxSigMSK = awgn(modSigMSK,30);

関数eyediagramを使用して、ノイズを含む信号のアイ ダイアグラムをプロットします。GMSK パルスの長さを 1 に設定すると、アイ ダイアグラムはほぼ同じになります。

eyediagram(rxSigGMSK,sps,1,sps/2)

Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents Quadrature.

eyediagram(rxSigMSK,sps,1,sps/2)

Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents Quadrature.

GMSK 変調器オブジェクトの PulseLength プロパティを 3 に設定します。プロパティは調整不可能であるため、最初にオブジェクトを解放する必要があります。

release(gmskMod)
gmskMod.PulseLength = 3;

更新した GMSK 変調器オブジェクトを使用して変調信号を生成し、生成した変調信号を AWGN チャネル経由で渡します。

modSigGMSK = gmskMod(data);
rxSigGMSK = awgn(modSigGMSK,30);

GSMK などの連続位相変調 (CPM) 波形では、波形は前のシンボルや現在のシンボルの値に依存します。パルスの長さが長くなるとアイ ダイアグラムのパスの数が増加することを確認するために、GMSK 信号のアイ ダイアログラムをプロットします。

eyediagram(rxSigGMSK,sps,1,sps/2)

Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents Quadrature.

GMSK 変調器オブジェクトの PulseLength パラメーターを他の値に変更して実験できます。プロパティを偶数に設定した場合、変調信号をわかりやすく表示するために gmskMod.InitialPhaseOffsetpi/4 に、関数 eyediagram のオフセット引数を sps/2 から 0 に更新する必要があります。ガウス パルス整形をよりわかりやすく表示するには、View CPM Phase Tree Using Simulinkの例で説明したように、信号の位相を表示するスコープを使用しなければなりません。

アルゴリズム

BandwidthTimeProduct プロパティは、帯域幅と時間の積を表します。このプロパティを使用すると帯域幅が狭くなりますが、符号間干渉が増加します。PulseLength プロパティは、シンボル区間でのガウス パルス整形の長さを測定します。以下の方程式によって周波数パルス整形が定義されます。Bb はパルスの帯域幅を表し、T はシンボル区間を表します。Q(t) は相補累積分布関数です。

g(t)=12T{Q[2πBbtT2ln(2)]Q[2πBbt+T2ln(2)]}Q(t)=t12πeτ2/2dτ

この System object では、1 の入力シンボルによって πp/2 ラジアンの位相シフトが生じます。これは、変調指数 0.5 に相当します。

参照

[1] Anderson, John B., Tor Aulin, and Carl-Erik Sundberg. Digital Phase Modulation. New York: Plenum Press, 1986.

拡張機能

バージョン履歴

R2012a で導入