最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

適応イコライザー

適応イコライザー構造は伝播チャネル特性における時間のばらつきの最適ではないイコライズを提供しますが、計算量がMLSE イコライザーより少ないため効果的です。

この節の概要

Communications Toolbox™ では、comm.LinearEqualizer および comm.DecisionFeedbackEqualizer の System object と Linear Equalizer および Decision Feedback Equalizer のブロックが、タップ付き遅延線フィルターを使用して、分散チャネルを介して線形変調信号をイコライズします。これらの機能は、有限入力応答 (FIR) フィルターとしてモデル化されたチャネルの推定を使用して、信号の推定を出力します。

受信信号の復号化には次の手順を使用します。

  1. 入力信号内のシンボルに、チャネル推定に対応する FIR フィルターを適用します。

  2. 信号の推定が出力され、次のシンボルのタップ重みを更新するためにも使用されます。信号の推定と重みの更新は、適応イコライザー構造とアルゴリズムによって異なります。

適応イコライザー構造のオプションは、線形または判定フィードバックです。適応アルゴリズムのオプションは、最小平均二乗 (LMS)、再帰的平均二乗 (RMS)、または定包絡線基準アルゴリズム (CMA) です。適応イコライザーに関する情報として、イコライザーについての参考文献の参考文献を参照してください。

シンボル タップ間隔

シンボル間隔イコライザーまたは分数シンボル間隔イコライザーとして動作するようにイコライザーを構成できます。

  • シンボル間隔レートでイコライザーを動作させるには、シンボルあたりのサンプル数を 1 に指定します。シンボル レート イコライザーでは、タップはシンボル区間の間隔で配置されます。シンボル レート イコライザーはタイミング位相の影響を受けます。

  • 分数シンボル間隔レートでイコライザーを動作させるには、シンボルあたりの入力サンプル数を 1 より大きい整数に指定し、そのサンプリング レートでオーバーサンプリングされた入力信号を指定します。分数シンボル間隔イコライザーでは、入力シンボル区間の整数分の 1 の間隔でタップが配置されています。分数シンボル間隔イコライザーはタイミング位相の影響を受けません。

メモ

MLSE イコライザーは非整数のシンボル間隔をサポートしていますが、使用は推奨されません。MLSE の計算量と負荷は、チャネルの時間分散の長さと共に指数関数的に増大します。入力のオーバーサンプリングは、指数項にシンボルあたりのサンプル数を乗算することを意味します。

線形イコライザー

線形イコライザーは、チャネルの周波数応答に null が存在しない場合、符号間干渉 (ISI) を削除できます。チャネルの周波数応答に null が存在する場合、線形イコライザーはノイズを強調する傾向があります。この場合は、ノイズが強調されないように判定フィードバック イコライザーを使用します。

線形イコライザーは、入力信号からのサンプルを格納するタップ付き遅延線で構成されます。シンボル周期ごとに一度、イコライザーは遅延ラインで値の重み付き総和を出力し、次のシンボル周期のための準備として重みを更新します。

線形イコライザーはシンボル間隔または分数シンボル間隔にすることができます。

  • シンボル間隔イコライザーの場合、シンボルあたりのサンプル数 K は 1 です。出力サンプルレートは入力サンプルレートと等しくなります。

  • 分数シンボル間隔イコライザーの場合、シンボルあたりのサンプル数 K は 1 より大きい整数です。通常、分数間隔イコライザーの K は 4 です。出力サンプルレートは 1/T、入力サンプルレートは K/T になります。ここで、T はシンボル周期です。タップ重みの更新は、出力レートで起こります。

この図は、重みが L、シンボル周期が T、シンボルあたりのサンプル数が K の線形イコライザーを示しています。K が 1 の場合、結果は分数シンボル間隔線形イコライザーではなくシンボル間隔線形イコライザーです。

シンボル周期ごとに、イコライザーはタップ付き遅延線で K 個の入力サンプルを受信します。イコライザーはその後、遅延線で値の重み付き総和を出力し、次のシンボル周期のための準備として重みを更新します。

判定フィードバック イコライザー

判定フィードバック イコライザー (DFE) は、周波数選択性チャネルでの符号間干渉 (ISI) を軽減する非線形イコライザーです。チャネルの周波数応答に null が存在する場合、DFE はノイズを強調しません。DFE は、入力信号からのサンプルを格納し、フォワード フィルターとフィードバック フィルターを含む、タップ付き遅延線で構成されます。フォワード フィルターは、線形イコライザーに類似しています。一方、フィードバック フィルターは、入力がイコライズされた信号に行われる判定であるようなタップ付き遅延線を含みます。シンボル周期ごとに一度、イコライザーは遅延ラインで値の重み付き総和を出力し、次のシンボル周期のための準備として重みを更新します。

DFE はシンボル間隔または分数シンボル間隔にすることができます。

  • シンボル間隔イコライザーの場合、シンボルあたりのサンプル数 K は 1 です。出力サンプルレートは入力サンプルレートと等しくなります。

  • 分数シンボル間隔イコライザーの場合、シンボルあたりのサンプル数 K は 1 より大きい整数です。通常、分数シンボル間隔イコライザーの K は 4 です。出力サンプルレートは 1/T、入力サンプルレートは K/T になります。タップ重みの更新は、出力レートで起こります。

この図は、合計 N 個の重みをもち、シンボル周期が T で、シンボルあたりのサンプル数が K 個の分数シンボル間隔 DFE を示しています。フィルターには、L 個のフォワードの重みと N-L 個のフィードバックの重みがあります。フォワード フィルターは最上部にあり、フィードバック フィルターは最下部にあります。K が 1 の場合、結果は分数シンボル間隔 DFE ではなくシンボル間隔 DFE です。

各シンボル周期において、イコライザーはフィードバック フィルターでの 1 つの判定またはトレーニング サンプル同様、フォワード フィルターで K 入力サンプルを受信します。それから、イコライザーは、フォワードおよびフィードバック遅延線に、値の重み付き総和を出力し、重みを更新して次のシンボル周期に備えます。

メモ

図の Adaptive Algorithm ブロックに対するアルゴリズムは、フォワードおよびフィードバックの重みを同時に最適化します。同時最適化は、RLS アルゴリズムには特に重要です。

基準信号と操作モード

標準的なアプリケーションにおいて、イコライザーはトレーニング モードでチャネルについての情報を集めはじめ、後で判定指向モードに切り替えます。

  • イコライザーがトレーニング モードで動作している場合、基準信号は前もって設定された既知の送信されたシーケンスです。

  • イコライザーが判定指向モードで動作している場合、基準信号は検出された出力信号となり、図では yd で示されます。

メモ

CMA アルゴリズムにはトレーニング モードがありません。トレーニング モードは、LMS または RLS アルゴリズムを使用している場合にのみ適用されます。

誤りを計算

誤りを計算する操作は、次の式で与えられる信号を生成します。ここで、R はコンスタレーションに関連する定数です。

e={dy  LMS or RLSy(R|y|2)CMA

タップ重みの更新

線形および判定フィードバックのイコライザー構造の場合、LMS、RLS、または CMA の選択によって、タップ重みの設定と誤り計算の実行に使用されるアルゴリズムが決まります。新しいタップ重みのセットは、以下に応じて異なります。

  • 現在のタップ重みのセット

  • 入力信号

  • 出力信号

  • LMS および RLS 適応アルゴリズムの場合のみ、基準信号 d。基準信号の特性は、イコライザーの操作モードによって異なります。

最小平均二乗アルゴリズム

LMS アルゴリズムの場合、前の図の w はすべての重み wi のベクトル、u はすべての入力 ui のベクトルです。現在の重み集合に基づき、LMS アルゴリズムは次の式で新しい重み集合を作成します。

wnew = wcurrent + (StepSize) u*e

適応アルゴリズムで使用されるステップ サイズは、正のスカラーとして指定します。ステップ サイズを大きくすると、イコライザーの収束時間が短縮されますが、イコライズされた出力信号の安定性は低下します。LMS 適応アルゴリズムを使用する際に許容される最大ステップ サイズを決定するには、オブジェクト関数 maxstep を使用します。* 演算子は複素共役を表し、誤り計算は e = d - y を表します。

再帰的最小二乗アルゴリズム

RLS アルゴリズムの場合、前の図の w はすべての重み wi のベクトル、u はすべての入力 ui のベクトルです。現在の入力の集合 u と逆相関行列 P を基に、RLS アルゴリズムは最初にカルマン ゲイン ベクトル K を次のように計算します。

K=Pu(ForgettingFactor)+uHPu.

適応アルゴリズムで使用される忘却係数は、範囲 (0, 1] のスカラーとして指定します。忘却係数を小さくすると、イコライザーの収束時間が短縮されますが、イコライズされた出力信号の安定性は低下します。H はエルミート転置を表します。現在の逆相関行列に基づき、新しい逆相関行列は次のようになります。

Pnew=Pcurrent(1KuH)ForgettingFactor.

現在の重み集合に基づき、RLS アルゴリズムは次の式で新しい重み集合を作成します。

wnew = wcurrent+K*e

* 演算子は複素共役を表し、誤り計算は e = d - y を表します。

定包絡線基準アルゴリズム

CMA 適応アルゴリズムの場合、前の図の w はすべての重み wi のベクトル、u はすべての入力 ui のベクトルです。現在の重み集合に基づき、CMA 適応アルゴリズムは次の式で新しい重み集合を作成します。

wnew = wcurrent + (StepSize) u*e

適応アルゴリズムで使用されるステップ サイズは、正のスカラーとして指定します。ステップ サイズを大きくすると、イコライザーの収束時間が短縮されますが、イコライズされた出力信号の安定性は低下します。CMA 適応アルゴリズムにより許容される最大ステップ サイズを決定するには、オブジェクト関数 maxstep を使用します。* 演算子は複素共役を表し、誤り計算は e = y(R - |y|2) です。ここで、R はコンスタレーションに関連する定数です。

適応イコライザーの構成

線形または判定フィードバックのイコライザー構造を選択します。LMS、RLS、または CMA のうちどの適応アルゴリズムを使用するかを決定します。構造およびアルゴリズム固有の操作モードの設定を指定します。

イコライザーの構成には、線形構造または判定フィードバック構造の選択、適応アルゴリズムの選択、構造およびアルゴリズム固有の操作モードの指定が含まれます。

最適な適応アルゴリズムの選択は、個々の状況によって異なります。ニーズに最も合っている適応アルゴリズムを決定するには、以下の一般化を考慮します。

  • LMS アルゴリズムの実行は高速ですが、収束が遅く、その複雑度は重みの数と共に線形に増大します。

  • RLS アルゴリズムは迅速に収束しますが、その複雑度は、大まかに言って、重みの数の 2 乗で増大します。このアルゴリズムは、重みの数が大きい場合、不安定になることがあります。

  • 定包絡線基準アルゴリズム (CMA) はトレーニング信号が利用できない場合に有効であり、PSK のような定数係数の変調に対して最も良く機能します。

    メモ

    CMA が付加的なサイド情報をもたない場合、位相不確定性を導入できます。たとえば、CMA により求められた重みは完全な QPSK コンスタレーションを作成しますが、90、180、または 270 度の位相回転を導入します。この場合、位相不確定性補正アルゴリズムを採用するか、位相不確定性の影響を受けない差分変調方式を選択します。

適応イコライザーの任意のプロパティを表示または変更するには、オブジェクト プロパティの表示と変更のチャネル オブジェクトに対して説明した構文を使用します。

適応アルゴリズムの詳細は、イコライザーについての参考文献に記載されている参考文献を参照してください。

適応イコライザーの指定

MATLAB® で使用する適応イコライザー オブジェクトを作成するには、comm.LinearEqualizer または comm.DecisionFeedbackEqualizer System object™ を選択します。Simulink® の場合は、Linear Equalizer または Decision Feedback Equalizer ブロックを使用します。シミュレーションの伝播チャネル特性に基づいて、イコライズの基準を使用してイコライザー構造を選択します。

イコライザー オブジェクトは、イコライザーについての情報を記録する多数のプロパティをもちます。プロパティは、次のものに関連します。

  • イコライザーの構造 (タップ数など)。

  • イコライザーが使用する適応アルゴリズム (LMS または CMA アルゴリズムのステップ サイズなど)。

  • イコライザーの現在の状態に関する情報。イコライザー オブジェクトは重みの値を出力できます。

イコライザー オブジェクトの任意のプロパティを表示または変更するには、オブジェクト プロパティの表示と変更でチャネル オブジェクトに対して説明した構文を使用してください。

イコライザー オブジェクトの定義

このコードは、3 つの構成のイコライザー オブジェクトを作成します。

  • 10 個の重みをもつシンボル間隔線形 RLS イコライザー。

  • シンボルごとに 10 個の重み、1 つの BPSK コンスタレーション、および 2 つのサンプルをもつ分数間隔線形 RLS イコライザー。

  • フィードフォワード フィルターに 3 つの重み、フィードバック フィルターに 2 つの重みをもつ判定フィードバック RLS イコライザー。

  • 3 つのイコライザー オブジェクトはすべて忘却係数 0.3 で RLS 適応アルゴリズムを指定。

異なるタイプのイコライザーを作成します。'Name,Value' ペアを使用して設定されていないプロパティには既定の設定が使用されます。

eqlin = comm.LinearEqualizer('Algorithm','RLS','NumTaps',10,'ForgettingFactor',0.3)
eqlin = 
  comm.LinearEqualizer with properties:

                          Algorithm: 'RLS'
                            NumTaps: 10
                   ForgettingFactor: 0.3000
    InitialInverseCorrelationMatrix: 0.1000
                      Constellation: [1x4 double]
                       ReferenceTap: 3
                         InputDelay: 0
              InputSamplesPerSymbol: 1
              TrainingFlagInputPort: false
                 AdaptAfterTraining: true
               InitialWeightsSource: 'Auto'
                 WeightUpdatePeriod: 1

eqfrac = comm.LinearEqualizer('Algorithm','RLS','NumTaps',10,'ForgettingFactor',0.3, ...
    'Constellation',[-1 1],'InputSamplesPerSymbol',2)
eqfrac = 
  comm.LinearEqualizer with properties:

                          Algorithm: 'RLS'
                            NumTaps: 10
                   ForgettingFactor: 0.3000
    InitialInverseCorrelationMatrix: 0.1000
                      Constellation: [-1 1]
                       ReferenceTap: 3
                         InputDelay: 0
              InputSamplesPerSymbol: 2
              TrainingFlagInputPort: false
                 AdaptAfterTraining: true
               InitialWeightsSource: 'Auto'
                 WeightUpdatePeriod: 1

eqdfe = comm.DecisionFeedbackEqualizer('Algorithm','RLS','NumForwardTaps',3, ...
    'NumFeedbackTaps',2,'ForgettingFactor',0.3)
eqdfe = 
  comm.DecisionFeedbackEqualizer with properties:

                          Algorithm: 'RLS'
                     NumForwardTaps: 3
                    NumFeedbackTaps: 2
                   ForgettingFactor: 0.3000
    InitialInverseCorrelationMatrix: 0.1000
                      Constellation: [1x4 double]
                       ReferenceTap: 3
                         InputDelay: 0
              InputSamplesPerSymbol: 1
              TrainingFlagInputPort: false
                 AdaptAfterTraining: true
               InitialWeightsSource: 'Auto'
                 WeightUpdatePeriod: 1

適応アルゴリズムの割り当て

Algorithm プロパティを使用して、イコライザーで使用される適応アルゴリズムを割り当てます。オブジェクトの作成時に、またはオブジェクトの作成後にインライン式により、名前と値のペアを使用して割り当てを行います。

アルゴリズムの割り当て

イコライザー オブジェクトを作成するときに適応アルゴリズムを割り当てます。

eqlms = comm.LinearEqualizer('Algorithm','LMS');

イコライザー オブジェクトを作成し、オブジェクトの作成後にインライン式を使用して目的の適応アルゴリズムを割り当てます。

eqrls = comm.LinearEqualizer;
eqrls.Algorithm
ans = 
'LMS'

eqrls の作成時には、既定のプロパティ設定が使用されます。LMS が既定の適応アルゴリズムです。eqrls を更新して RLS 適応アルゴリズムを使用します。

eqrls.Algorithm = 'RLS';
eqrls.Algorithm
ans = 
'RLS'

オブジェクトのクローン作成と複製

既存のイコライザー オブジェクトのクローンを作成することで適応アルゴリズム オブジェクトを作成してから、そのプロパティを変更します。eqlms のクローンを作成して独立したイコライザー eqcma を作成してから、アルゴリズムを 'CMA' に更新します。

eqcma = clone(eqlms);
eqcma.Algorithm
ans = 
'LMS'
eqcma.Algorithm = 'CMA';
eqcma.Algorithm
ans = 
'CMA'

独立した複製が必要な場合は、等号演算子 c2 = c1 を使用してオブジェクトを複製する代わりに、clone コマンドを使用します。

eqlms.NumTaps
ans = 5
eq2 = eqlms;
eq2.NumTaps = 6;
eq2.NumTaps
ans = 6
eqlms.NumTaps
ans = 6

clone コマンドは、eqlms に依存しない eqlms のコピーを作成します。一方、コマンド eqB = eqAeqA への参照として eqB を作成するので、eqBeqA は常に同一のプロパティ設定をもちます。

イコライザーの学習

異なる学習スキームを使用した線形イコライズ システム

最小平均二乗 (LMS) アルゴリズムを使用した線形イコライズを示して、AWGN チャネル経由で渡した QPSK シンボルを復元します。異なるイコライザーの学習スキームを適用して、シンボルの誤差の大きさを示します。

システム設定

AWGN の影響を受ける QPSK 変調システムをシミュレートします。200 個のトレーニング シンボルと 1800 個のランダム データ シンボルで構成されるパケットを送信します。パケット データを復元するように線形 LMS イコライザーを構成します。

M = 4;
numTrainSymbols = 200;
numDataSymbols = 1800;
SNR = 20;
trainingSymbols = pskmod(randi([0 M-1],numTrainSymbols,1),M,pi/4);
numPkts = 10;
lineq = comm.LinearEqualizer('Algorithm','LMS', ...
    'NumTaps',5,'ReferenceTap',3,'StepSize',0.01);

リセットを使用する各パケットの先頭でのイコライザーの学習

先頭に追加されたトレーニング シンボルを使用して各パケットを処理します。各パケットの処理後にイコライザーをリセットします。各パケットの後にイコライザーをリセットすると、イコライザーは事前知識なしにタップを学習するようになります。最初、2 番目、および最後のパケットのイコライザー誤差信号プロットは、各パケットの先頭でシンボル誤りが多くなっていることを示しています。

jj = 1;
figure
for ii = 1:numPkts
    b = randi([0 M-1],numDataSymbols,1);
    dataSym = pskmod(b,M,pi/4);
    packet = [trainingSymbols;dataSym];
    rx = awgn(packet,SNR);
    [~,err] = lineq(rx,trainingSymbols);
    reset(lineq)
    if (ii ==1 || ii == 2 ||ii == numPkts)
        subplot(3,1,jj)
        plot(abs(err))
        title(['Packet # ',num2str(ii)])
        xlabel('Symbols')
        ylabel('Error Magnitude')
        axis([0,length(packet),0,1])
        grid on;
        jj = jj+1;
    end
end

リセットを使用しない各パケットの先頭でのイコライザーの学習

先頭に追加されたトレーニング シンボルを使用して各パケットを処理します。各パケットの処理後にイコライザーをリセットしません。各パケットの後にリセットしないことで、イコライザーは前のパケットの学習によるタップ重みを保持します。最初、2 番目、および最後のパケットのイコライザー誤差信号プロットは、最初のパケットに対する初期学習の後に、後続のパケットが各パケットの先頭でシンボル誤りが少なくなることを示しています。

release(lineq)
jj = 1;
figure
for ii = 1:numPkts
    b = randi([0 M-1],numDataSymbols,1);
    dataSym = pskmod(b,M,pi/4);
    packet = [trainingSymbols;dataSym];
    channel = 1;
    rx = awgn(packet*channel,SNR);
    [~,err] = lineq(rx,trainingSymbols);
    if (ii ==1 || ii == 2 ||ii == numPkts)
        subplot(3,1,jj)
        plot(abs(err))
        title(['Packet # ',num2str(ii)])
        xlabel('Symbols')
        ylabel('Error Magnitude')
        axis([0,length(packet),0,1])
        grid on;
        jj = jj+1;
    end
end

周期的なイコライザーの学習

時変チャネルの影響を受ける信号があるシステムには、チャネル変動に対してロックを維持するために周期的なイコライザーの学習が必要です。1800 個のデータ シンボルごとに 200 個のシンボルの学習を行うシステムを指定します。学習の合間では、イコライザーはタップ重みを更新しません。イコライザーはパケットあたり 200 個のシンボルを処理します。

Rs = 1e6;
fd = 20;
spp = 200; % Symbols per packet
b = randi([0 M-1],numDataSymbols,1);
dataSym = pskmod(b,M,pi/4);
packet = [trainingSymbols; dataSym];
stream = repmat(packet,10,1);
tx = (0:length(stream)-1)'/Rs;
channel = exp(1i*2*pi*fd*tx);
rx = awgn(stream.*channel,SNR);

AdaptAfterTraining プロパティを false に設定して、学習フェーズの後にイコライザーのタップ重みの更新を停止します。

release(lineq)
lineq.AdaptAfterTraining = false
lineq = 
  comm.LinearEqualizer with properties:

                Algorithm: 'LMS'
                  NumTaps: 5
                 StepSize: 0.0100
            Constellation: [1x4 double]
             ReferenceTap: 3
               InputDelay: 0
    InputSamplesPerSymbol: 1
    TrainingFlagInputPort: false
       AdaptAfterTraining: false
     InitialWeightsSource: 'Auto'
       WeightUpdatePeriod: 1

劣化したデータをイコライズします。チャネルからの角度誤差、イコライザーの誤差信号、およびコンスタレーションをプロットします。チャネルが変動しても、イコライザー出力からチャネルの影響は除去されません。また、出力コンスタレーションが同期せずに回転し、ビット誤りが発生します。

[y,err] = lineq(rx,trainingSymbols);

figure
subplot(2,1,1)
plot(tx, unwrap(angle(channel)))
xlabel('Time (sec)')
ylabel('Channel Angle (rad)')
title('Angular Error Over Time')
subplot(2,1,2)
plot(abs(err))
xlabel('Symbols')
ylabel('Error Magnitude')
grid on
title('Time-Varying Channel Without Retraining')

scatterplot(y)

TrainingInputPort プロパティを true に設定し、trainFlag 入力により信号が送られたときにタップを再学習するようにイコライザーを構成します。イコライザーは、trainFlagtrue の場合にのみ学習を行います。イコライザーは 2000 個のシンボルごとにタップを再学習し、チャネルの変動に対してロックを維持します。チャネルからの角度誤差、イコライザーの誤差信号、およびコンスタレーションをプロットします。チャネルが変動すると、イコライザー出力からチャネルの影響が除去されます。また、出力コンスタレーションが同期せずに回転することがなくなり、ビット誤りが減少します。

release(lineq)
lineq.TrainingFlagInputPort = true;
symbolCnt = 0;
numPackets = length(rx)/spp;
trainFlag = true;
trainingPeriod = 2000;
eVec = zeros(size(rx));
yVec = zeros(size(rx));
for p=1:numPackets
    [yVec((p-1)*spp+1:p*spp,1),eVec((p-1)*spp+1:p*spp,1)] = ...
        lineq(rx((p-1)*spp+1:p*spp,1),trainingSymbols,trainFlag);
    symbolCnt = symbolCnt + spp;
    if symbolCnt >= trainingPeriod
        trainFlag = true;
        symbolCnt = 0;
    else
        trainFlag = false;
    end
end
figure
subplot(2,1,1)
plot(tx, unwrap(angle(channel)))
xlabel('t (sec)')
ylabel('Channel Angle (rad)')
title('Angular Error Over Time')
subplot(2,1,2)
plot(abs(eVec))
xlabel('Symbols')
ylabel('Error Magnitude')
grid on
title('Time-Varying Channel With Retraining')

scatterplot(yVec)

EVM ベースの学習を使用したシンボルの線形イコライズ

定包絡線基準アルゴリズム (CMA) と EVM ベースのタップの学習を使用して、線形イコライザーで QPSK シンボルを復元します。CMA などのブラインド イコライザー アルゴリズムを使用する場合は、AdaptWeights プロパティを使用して学習を開始および停止し、イコライザーのタップを学習することができます。補助関数を使用してプロットを生成し、位相補正を適用します。

システム変数を初期化します。

rng(123456);
M = 4; % QPSK
numSymbols = 100;
numPackets = 5000;
raylChan = comm.RayleighChannel('PathDelays',[0 1], ...
    'AveragePathGains',[0 -12],'MaximumDopplerShift',1e-5);
SNR = 50;
adaptWeights = true;

イコライザーおよび EVM の System object を作成します。イコライザー System object は、CMA 適応アルゴリズムを使用して線形イコライザーを指定します。補助関数を呼び出して Figure のプロットを初期化します。

lineq = comm.LinearEqualizer('Algorithm','CMA', ...
    'NumTaps',5,'ReferenceTap',3, ...
    'StepSize',0.03,'AdaptWeightsSource','Input port')
lineq = 
  comm.LinearEqualizer with properties:

                Algorithm: 'CMA'
                  NumTaps: 5
                 StepSize: 0.0300
            Constellation: [1x4 double]
             ReferenceTap: 3
    InputSamplesPerSymbol: 1
       AdaptWeightsSource: 'Input port'
     InitialWeightsSource: 'Auto'
       WeightUpdatePeriod: 1

info(lineq)
ans = struct with fields:
    Latency: 2

evm = comm.EVM('ReferenceSignalSource', ...
    'Estimated from reference constellation');
[errPlot,evmPlot,scatSym,adaptState] = initFigures(numPackets,lineq);

イコライズ ループ

イコライズ ループを実装するには、次の手順に従います。

  1. PSK データ パケットを生成します。

  2. レイリー フェージングと AWGN を送信データに適用します。

  3. 受信データにイコライズを、イコライザー出力に位相補正を適用します。

  4. EVM を推定し、EVM レベルに基づいて adaptWeights フラグを true または false に切り替えます。

  5. Figure のプロットを更新します。

for p=1:numPackets
    data = randi([0 M-1],numSymbols,1);
    tx = pskmod(data,M,pi/4);
    rx = awgn(raylChan(tx),SNR);
    rxDelay = finddelay(rx,tx);
    [y,err,wts] = lineq(rx,adaptWeights);
    y = phaseCorrection(y);
    evmEst = evm(y);
    adaptWeights = (evmEst > 20);
    
    updateFigures(errPlot,evmPlot,scatSym,adaptState, ...
        wts,y(end),evmEst,adaptWeights,p,numPackets)
end

rxDelay
rxDelay = 0

Figure のプロットは、EVM が変化するにつれて、イコライザーが判定指向の重み適応モードのオンとオフを切り替えていることを示しています。

補助関数

この補助関数は、シミュレーション結果の 4 つのプロットを示す Figure を初期化します。

function [errPlot,evmPlot,scatter,adaptState] = initFigures(numPkts,lineq)
yVec = nan(numPkts,1);
evmVec = nan(numPkts,1);
wVec = zeros(lineq.NumTaps,1);
adaptVec = nan(numPkts,1);

figure
subplot(2,2,1)
evmPlot = stem(wVec);
grid on; axis([1 lineq.NumTaps 0 1.8])
xlabel('Taps'); ylabel('|Weights|'); title('Tap Weight Magnitude')

subplot(2,2,2)
scatter = plot(yVec, '.');
axis square; axis([-1.2 1.2 -1.2 1.2]); grid on
xlabel('In-phase'); ylabel('Quadrature'); title('Scatter Plot');
subplot(2,2,3)
adaptState = plot(adaptVec);
grid on; axis([0 numPkts -0.2 1.2])
ylabel('Training'); xlabel('Symbols'); title('Adapt Weights Signal')
subplot(2,2,4)
errPlot = plot(evmVec);
grid on; axis([1 numPkts 0 100])
xlabel('Symbols'); ylabel('EVM (%)'); title('EVM')
end

この補助関数は Figure を更新します。

function updateFigures(errPlot,evmPlot,scatSym, ...
    adaptState,w,y,evmEst,adaptWts,p,numFrames)
persistent yVec evmVec adaptVec

if p == 1
    yVec = nan(numFrames,1);
    evmVec = nan(numFrames,1);
    adaptVec = nan(numFrames,1);
end

yVec(p) = y;
evmVec(p) = evmEst;
adaptVec(p) = adaptWts;

errPlot.YData = abs(evmVec);
evmPlot.YData = abs(w);
scatSym.XData = real(yVec);
scatSym.YData = imag(yVec);
adaptState.YData = adaptVec;
drawnow limitrate
end

この補助関数は位相補正を適用します。

function y = phaseCorrection(y)
a = angle(y((real(y) > 0) & (imag(y) > 0)));
a(a < 0.1) = a(a < 0.1) + pi/2;
theta = mean(a) - pi/4;
y = y * exp(-1i*theta);
end

イコライザーを使用する際の遅延

適切にイコライズするには、システム遅延を求めて考慮しなければなりません。次の例に示すように、関数 finddelay を使用してシステム遅延を求めることができます。この例では LMS 線形イコライズを使用していますが、同じ方法が RLS および CMS 適応アルゴリズムと判定フィードバック イコライザーにも有効です。

遅延信号の線形イコライズ

送信シンボルと受信サンプルの間に遅延があるシステムをシミュレートします。一般的なシステムには送信側と受信側のフィルターがあり、これにより遅延が発生します。システムを同期させるには、この遅延を考慮しなければなりません。この例では、送信フィルターと受信フィルターを使用せずにシステム遅延が発生しています。線形イコライズは、最小平均二乗 (LMS) アルゴリズムを使用して、QPSK シンボルを復元します。

シミュレーション変数を初期化します。

M = 4; % QPSK
numSymbols = 10000;
numTrainingSymbols = 1000;
mpChan = [1 0.5*exp(1i*pi/6) 0.1*exp(-1i*pi/8)];
systemDelay = dsp.Delay(20);
snr = 24;

QPSK 変調されたシンボルを生成します。送信シンボルにマルチパス チャネルのフィルター処理、システム遅延、および AWGN を適用します。

data = randi([0 M-1],numSymbols,1);
tx = pskmod(data,M,pi/4); % OQPSK
delayedSym = systemDelay(filter(mpChan,1,tx));
rx = awgn(delayedSym,snr,'measured');

イコライザーおよび EVM の System object を作成します。イコライザー System object は、LMS アルゴリズムを使用して線形イコライザーを指定します。

lineq = comm.LinearEqualizer('Algorithm','LMS', ...
    'NumTaps',9,'ReferenceTap',5);
evm = comm.EVM('ReferenceSignalSource', ...
    'Estimated from reference constellation');

入力遅延を調整しないイコライズ

受信シンボルをイコライズします。

[y1,err1,wts1] = lineq(rx,tx(1:numTrainingSymbols,1));

関数 finddelay を使用して、受信シンボルと送信シンボルの間の遅延を検出します。

rxDelay = finddelay(tx,rx)
rxDelay = 20

イコライザー情報を表示します。レイテンシ値は、イコライザーによって発生した遅延を示します。合計遅延を、rxDelay とイコライザーのレイテンシの合計として計算します。

eqInfo = info(lineq)
eqInfo = struct with fields:
    Latency: 4

totalDelay = rxDelay + eqInfo.Latency;

イコライザー出力が収束するまで、シンボル誤り率は高くなります。誤り出力 err1 をプロットして、イコライズされた出力がいつ収束するかを判断します。

plot(abs(err1))
xlabel('Symbols')
ylabel('Error Magnitude')
title('Equalizer Error Signal')

このプロットでは、1000 個のシンボルの学習期間を超えて過度な誤りが示されています。シンボルを復調してシンボル誤りを計算するときは、収束していない出力と、イコライザー出力と送信シンボルの間のシステム遅延を考慮して、最初の 2000 個のシンボルをスキップします。

dataRec1 = pskdemod(y1(2000+totalDelay:end),M,pi/4);
symErrWithDelay = symerr(data(2000:end-totalDelay),dataRec1)
symErrWithDelay = 5999
evmWithDelay = evm(y1)
evmWithDelay = 29.5795

イコライザー System object で受信遅延が考慮されていないため、誤り率と EVM が高くなります。

イコライザーでの入力遅延の調整

遅延値を使用して InputDelay プロパティを設定し、受信データをイコライズします。InputDelay は調整できないプロパティであるため、InputDelay プロパティを再構成するには lineq System object を解放しなければなりません。受信シンボルをイコライズします。

release(lineq)
lineq.InputDelay = rxDelay
lineq = 
  comm.LinearEqualizer with properties:

                Algorithm: 'LMS'
                  NumTaps: 9
                 StepSize: 0.0100
            Constellation: [1x4 double]
             ReferenceTap: 5
               InputDelay: 20
    InputSamplesPerSymbol: 1
    TrainingFlagInputPort: false
       AdaptAfterTraining: true
     InitialWeightsSource: 'Auto'
       WeightUpdatePeriod: 1

[y2,err2,wts2] = lineq(rx,tx(1:numTrainingSymbols,1));

タップ重みとイコライズされた誤差の大きさをプロットします。ステム プロットは、システム遅延が除去される前後のイコライザーのタップ重みを示します。2 次元ライン プロットは、遅延が除去された信号と比較して、遅延信号のイコライザー収束が遅いことを示しています。

subplot(2,1,1)
stem([real(wts1),real(wts2)])
xlabel('Taps')
ylabel('Tap Weight Real')
legend('rxDelayed','rxDelayRemoved')
grid on
subplot(2,1,2)
stem([imag(wts1),imag(wts2)])
xlabel('Taps')
ylabel('Tap Weight Imaginary')
legend('rxDelayed','rxDelayRemoved')
grid on

figure
plot([abs(err1),abs(err2)])
xlabel('Symbols')
ylabel('Error Magnitude')
legend('rxDelayed','rxDelayRemoved')
grid on

イコライズされた信号 rxDelayed および rxDelayRemoved の誤り出力をプロットします。遅延が除去された信号では、イコライザーは 1000 個のシンボルの学習期間中に収束します。シンボルを復調してシンボル誤りを計算するときは、収束していない出力と、イコライザー出力と送信シンボルの間のシステム遅延を考慮して、最初の 500 個のシンボルをスキップします。システム遅延を考慮するためにイコライザーを再構成すると、信号のイコライズが改善され、シンボル誤りと EVM が減少します。

eqInfo = info(lineq)
eqInfo = struct with fields:
    Latency: 4

totalDelay = rxDelay + eqInfo.Latency;
dataRec2 = pskdemod(y2(500+totalDelay:end),M,pi/4);
symErrDelayRemoved = symerr(data(500:end-totalDelay),dataRec2)
symErrDelayRemoved = 0
evmDelayRemoved = evm(y2(500+totalDelay:end))
evmDelayRemoved = 9.4435

Simulink での適応イコライザーの利用

フィルター処理とフェージング チャネルによる適応イコライズ

このモデルでは、フェージング チャネルによる通信リンクでの、選択された適応イコライザーの動作を示します。送信側と受信側は、ルート レイズド コサインのパルス整形フィルター処理を行います。subsystem ブロックにより、最小平均二乗 (LMS) または再帰的最小二乗 (RLS) 適応アルゴリズムを使用して、線形イコライザーまたは判定フィードバック イコライザーを選択できます。

モデルの構造

  • 送信機は、トレーニング シーケンスを含む 16QAM のランダムな信号データを生成し、ルート レイズド コサインのパルス整形フィルター処理を適用します。

  • チャネル障害には、マルチパス フェージング、ドップラー シフト、搬送周波数オフセット、可変整数遅延、自由空間パス損失、および AWGN が含まれます。

  • 受信機は、ルート レイズド コサインのパルス整形フィルター処理、AGC を適用し、イコライザー モード コントロールを含めてトレーニングを有効にすることで、以下の選択肢からのイコライザー アルゴリズムの選択を可能にします。

  • また、モデルでは、さまざまなイコライザーと適応アルゴリズムがどのように動作するかを理解するのに役立つスコープも使用します。

モデル例の調査

モデルを試す

このモデルには、設定を変更して結果を観察するためのいくつかの方法が用意されています。File>Model Properties>Callbacks にある InitFcn によって slex_adaptive_eq_with_fading_init が呼び出され、モデルが初期化されます。このファイルを有効化すると、モデルの以下のような設定を変更できます。

  • SNR などのシステム パラメーター。

  • ロールオフやフィルター長などのパルス整形フィルター パラメーター

  • パス損失の値。

  • チャネル条件: レイリーまたはライス フェージング、チャネル パス ゲイン、チャネルのパス遅延、ドップラー シフト。

  • イコライザーの選択と構成。

モデルに関する考慮事項

以下の標準ベースでない通信リンクは、最新の通信システムを表しています。

  • 最適なイコライザーの構成は、チャネル条件によって異なります。初期化ファイルは、異なるイコライザーの機能を強調するドップラー シフトおよびマルチパス フェージング チャネル パラメーターを設定します。

  • 判定フィードバック イコライザー構造は、大きな符号間干渉に対して線形イコライザー構造よりも優れたパフォーマンスを発揮します。

  • RLS アルゴリズムは、高いドップラー周波数に対して LMS アルゴリズムよりも優れたパフォーマンスを発揮します。

  • LMS アルゴリズムの実行は高速ですが、収束が遅く、その複雑度は重みの数と共に線形に増大します。

  • RLS アルゴリズムは迅速に収束しますが、その複雑度は大まかに重みの数の 2 乗として増大し、重みの数が多いときは不安定になる可能性があります。

  • 異なるイコライザーに用いられるチャネルには、以下の特性があります。

  • その他のチャネル障害に対する初期設定は、すべてのイコライザーに対して同じです。搬送周波数オフセット値は、50 Hz に設定されます。自由空間パス損失は、60 dB に設定されます。可変整数遅延は 2 サンプルに設定されます。これは、イコライザーによってタイミング再生が必要になります。

深いチャネル フェージングとパス損失により、イコライザーの入力信号レベルが目的の出力信号レベルよりもかなり小さくなる可能性があり、その結果イコライザーの収束時間が許容できない範囲で長くなる可能性があります。AGC ブロックは、受信信号の振幅を調整して、イコライザーの収束時間を短縮します。最適な AGC 出力電力レベルは、選択された変調方式に基づいて調整されなければなりません。16QAM の場合、望ましい出力電力である 10 W が使用されます。

イコライザーの学習はシミュレーションの開始時に実行されます。

シミュレーションの実行

シミュレーションを実行すると、シンボルの誤り統計が計算され、以下の図が生成されます。

  • 受信フィルターの後の信号のコンスタレーション ダイアグラム。

  • AGC の後の信号のコンスタレーション ダイアグラム。

  • イコライズ後の信号のコンスタレーション ダイアグラム (信号品質測定値を表示)。

  • イコライザーの誤差のプロット。

ここに示されているプロットの場合、選択されたイコライザー アルゴリズムは RLS Linear です。これらの数値を監視することで、受信信号品質がシミュレーション時間が進むにしたがって変化することが確認できます。

After Rx FilterAfter AGC のコンスタレーション プロットは、イコライズ前の信号を示します。After AGC は、送信された信号に対するチャネル条件の影響を示します。After Eq プロットは、イコライズ後の信号を示します。イコライズの後にコンスタレーション ダイアグラムでプロットされる信号は、イコライズ処理の効果に基づいて信号品質の変動を示します。シミュレーションをとおして、イコライズ前にプロットされた信号は、16QAM コンスタレーションから顕著に逸脱します。After Eq コンスタレーションでは、イコライザーの誤差信号が変化するにつれて、改善または劣化が見られます。Eq Error プロットの開始時の狭いスパイクは、シミュレーション開始時のイコライズが適切でないことを示しています。イコライザーは迅速に収束しますが、5 ~ 6 ms でチャネル フェージング条件が悪化し、イコライザーの誤差が増加しています。

その他の調査

Equalizer Selector ブロックをダブルクリックして、異なるイコライザーを選択します。シミュレーションを実行して、さまざまなイコライザー オプションのパフォーマンスを確認します。信号ロガーを使用して、この実験の結果を比較できます。ブロック線図の信号線を右クリックし、[選択した信号のログ] を選択します。

MATLAB™ コマンド プロンプトで、edit slex_adaptive_eq_with_fading_init.m を入力して初期化ファイルを開き、パラメーターを変更してシミュレーションを再実行します。信号のログを有効にした場合は、シミュレーションの実行の終了後、シミュレーション データ インスペクターを開いてログ記録された信号を確認します。次に例を示します。

  • チャネル特性 (params.maxDoppler|、params.pathDelays、および params.pathGains) を調整します。RLS 適応アルゴリズムは、最大ドップラーが増加するにつれて、LMS 適応アルゴリズムよりも優れたパフォーマンスを発揮します。

参考

System object

ブロック

関連するトピック