Main Content

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

HDL QAM 送信機および受信機

この例では、HDL コード生成をサポートする Simulink® ブロックを使用して、HDL コード生成およびハードウェア実装用に 64-QAM 送信機と受信機を実装する方法を示します。

HDL QAM Tx サブシステムは、複素数値の 64-QAM 変調コンスタレーションを生成します。受信機サブシステムの動作のデモンストレーションのため、浮動小数点チャネル モデル Channel を使用して、減衰、チャネル ノイズ、搬送波周波数オフセットおよび非整数遅延を付加します。HDL QAM Rx サブシステムは、租周波数再生、タイミング再生、フレーム同期とフレーム振幅および位相再生を使用して、チャネル劣化要因を緩和するための実用的なデジタル受信機を実装します。次に、Text Message Decoding サブシステムはデータ パケットを受信し、パケットを復号化し、それらを MATLAB® コマンド ウィンドウに出力します。

例の構造

モデルを開くには、次のように入力します。

modelname = 'commqamtxrxhdl';
open_system(modelname);
set_param(modelname,'Open','on');

次のイメージは、QAM 受信機モデルの最上位構造を示したものです。QAM Tx HDL サブシステムと QAM Rx HDL サブシステムは、HDL コード生成用に最適化されています。

QAM Tx HDL サブシステムを開くには、次のように入力します。

set_param(modelname,'Open','off');
set_param([modelname '/QAM Tx HDL'],'Open','on');

次のイメージは、QAM Tx HDL サブシステムの詳細な構造を示したものです。

QAM Tx HDL サブシステムには次のコンポーネントが含まれています。これらについては、「HDL QAM 送信機」のセクションで詳しく説明されています。

  • Data Generation & Packetization - シンボルにマップするビットをグループ化し、送信するパケットを生成

  • Symbol Mapping - Data Generation & Packetization サブシステムからのビット出力を QAM シンボルにマップ

  • Pulse Shaping - 送信前に内挿 RRC (ルート レイズド コサイン) フィルターを使用してシンボルのパルス整形とアップサンプリングを実行

set_param([modelname '/QAM Tx HDL'],'Open','off'); 
set_param([modelname '/Channel'],'Open','on');

Channel サブシステムの構造は、次のとおりです。Channel サブシステムは、減衰と周波数オフセットが指定されている AWGN チャネルに類似しており、ソフトウェアで実行することを意図されています。そのため、ここでは、Phase/Frequency Offset ブロックなどのような HDL コード生成でサポートされていないブロックを使用することができます。Phase/Frequency Offset ブロックは固定小数点データ型をサポートしていません。そのため、Channel サブシステムの入力での double 型への変換もサポートしていません。信号は、Channel サブシステムから出力される前に固定小数点型に戻されます。非整数遅延と AWGN が送信信号に適用され、その信号が Gain ブロックで減衰されます。

set_param([modelname '/Channel'],'Open','off'); 
set_param([modelname '/QAM Rx HDL'],'Open','on');

次のイメージは、QAM Rx HDL サブシステムの詳細な構造を示したものです。

QAM Rx HDL サブシステムには次のコンポーネントが含まれています。

  • Automatic Gain Control - 受信信号の強度を正規化します。

  • Coarse Frequency Offset Correction - 受信信号のおおよその周波数オフセットを推定して補正。このサブシステムには、係数 2 でダウンサンプリングする Root Raized Cosine Receive Filter ブロックも含まれます。

  • Timing Recovery - 再生されたタイミング ストローブに従って入力信号をリサンプルし、適切なサンプリング時点においてシンボル判定を実行します。

  • Magnitude & Phase Recovery - パケット検出、位相と振幅の細かな補正を実行します。

  • Demodulate - 信号を復調し、シンボルをビットにマッピング解除します。

set_param([modelname '/QAM Rx HDL'],'Open','off'); 
set_param([modelname '/Text Message Decoding'],'Open','on');

次のイメージは、Text Message Decoding サブシステムの構造を示したものです。

このサブシステムはソフトウェアで実行されるように設計されているため、サブシステムはフレームベースの信号を使用して計算を高速化します。Text Message Decoding サブシステムには、8 つのサンプルベース boolean 入力信号 (dValidpacketStart、および信号 bit1bit6) があります。dataframer MATLAB Function ブロックは、サンプルベースの信号をフレームベースの信号に変換します。復調されたビットは、dValid が高位に設定されている場合にのみ有効です。dataframer ブロックは、dValid 信号を使用して遅延線を受信ビットで満たし、newPacket 信号を使用して遅延線に格納されたデータを出力に転送し、遅延線をリセットします。

Descramble and Print サブシステムは、イネーブル信号が high になった場合にのみ受信データを処理します。以上のことは、遅延線に 336 の復調された有効ビットが蓄積された場合、または newPacket 信号が高位の場合に発生します。これにより、dataframer ブロックが RxGo 信号を高位に設定します。シミュレーションの実行中、Descramble and Print サブシステムは、文字列 "Hello world! ~64QAM test string~ ###" を MATLAB コマンド ウィンドウに出力します。ここで、'###' は '000'、'001'、'002'、...、'099' の繰り返しシーケンスです。サブシステムは、50 パケットごとに、正常に受信された直近の 50 パケットにおけるデータのビット エラー レートを MATLAB コマンド ウィンドウに出力します。

HDL QAM 送信機

HDL QAM Tx には、Data Generation & Packetization ブロック、Symbol Mapping ブロック、および Pulse Shaping ブロックが含まれます。

Data Generation & Packetization

Controller FSM および Data Source サブシステムは、プリアンブル ビットとデータ ビットを生成し、スクランブルを実行してパケットを構築します。各パケットは、84 ビットのバーカー符号プリアンブルと 252 ビットのスクランブルされたデータから構成されます。Group Bits ブロックは、シンボル マッパーの要求に応じて、入力データ ビット ストリームを入力サンプル レートの 1/6 で 6 ビット整数に変換します。

Data Source サブシステムには 2 サンプルのパイプライン遅延があります。さらに、データ ソースとビット ペアリング サブシステムの間にパイプライン遅延があります。そのため、有効な信号はデータ パスのパイプライン遅延に合うように遅延されます。Group Bits サブシステムは、サンプル レートを 6 分の 1 に減らします。有効なコントロール パスで係数 6 のダウンサンプリングを行うことにより、有効なコントロール パスのサンプル レートが信号パスのサンプル レートと一致するようになります。

set_param([modelname '/Text Message Decoding'],'Open','off');
set_param([modelname '/QAM Tx HDL/Data Generation & Packetization'],'Open','on');

Controller FSM - Controller FSM ブロックは、制御ステート マシンを実装する MATLAB Function ブロックです。FSM には 2 つの状態、Pack_PreambleAppend_Data があります。Pack_Preamble 状態は、load_preamble 信号をアサートし、reset_preamble 信号および load_data 信号をアサート解除します。FSM は 84 クロック サイクルの間、この状態を維持します。次に、FSM は load_preamble 信号をリリースすると同時に Append_Data 状態に移行し、load_data 信号と reset_preamble 信号をアサートします。FSM は 252 クロック サイクルの間、この状態を維持します。load_preamblereset_preamble は boolean で、各パケットの開始時のプリアンブルの負荷を管理する Preamble Address Counter を制御するために使用されます。load_data 信号は boolean で、パケットへのデータの読み込みを制御する Data Address Counter を有効にします。

Data Source - Data Source サブシステムには、プリアンブルとデータ ビットを保存する 2 つのルックアップ テーブル (LUT) が含まれています。Preamble Address Counter サブシステムは、Controller FSM ブロックによって生成される reset_preamble 信号と load_preamble 信号によって制御され、preamble lookup LUT を解決します。Data Access Counter は、Controller FSM ブロックによって生成される load_data 信号によって有効にされ、data lookup LUT を解決します。Preamble Address Counter サブシステムには、Controller FSM ブロックによって生成されるリセット信号があり、各パケットの先頭に同じプリアンブルが挿入されます。データ アドレス シーケンスが非常に長くなり、各パケット内に異なるデータ ビットが配置されることでパケットごとに変化するため、Data Address Counter サブシステムにはリセット信号がありません。さらに、データ LUT のカウンターを有効にするため、load data 入力は、Preamble Data Mux ブロックによるプリアンブルまたはデータ ビットの選択を HDL Data Scrambler コンポーネントが有効にするタイミングを制御します。

set_param([modelname '/QAM Tx HDL/Data Generation & Packetization'],'Open','off'); 
set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Data Source'],'Open','on');

HDL Data Scrambler - HDL Data Scrambler ブロックを表示するには、次のように入力します。

set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Data Source'],'Open','off'); 
set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Data Source/HDL Data Scrambler'],'Open','on');

次のイメージは、HDL Data Scrambler サブシステムを示したものです。サブシステムは、XOR ゲート (剰余 2 の加算用) とレジスタを使用します。有効にされたサブシステムにより、処理すべき新しい入力データがある場合にのみスクランブラーが有効になります。

Group Bits - Group Bits サブシステムは、6 つの個別のビットを 6 ビット符号なし整数出力 (Symbol Mapping コンポーネントに必要な入力形式) にグループ化します。遅延は、Bit Concat ブロックの入力で 6 ビットを整列させるために使用され、6 ビットの符号なし出力に連結されます。その後、この出力がダウンサンプリングされて、正しくグループ化されたビットが選択されます。

set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Data Source/HDL Data Scrambler'],'Open','off'); 
set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Group Bits'],'Open','on');

Symbol Mapping

Symbol Mapping サブシステムは、Rectangular QAM Modulator Baseband ブロックを使用して整数入力値を対応する 64-QAM 複素数値シンボルにマップします。このブロックではグレイ マッピング方式を使用します。

set_param([modelname '/QAM Tx HDL/Data Generation & Packetization/Group Bits'],'Open','off'); 
set_param([modelname '/QAM Tx HDL/Symbol Mapping'],'Open','on');

Pulse Shaping

Pulse Shaping サブシステムは、アップサンプリング係数 4 の RRC Interpolation Filter ブロックを使用します。整合フィルターが受信機に実装されています。フィルターはパイプライン化されます。

set_param([modelname '/QAM Tx HDL/Symbol Mapping'],'Open','off'); 
set_param([modelname '/QAM Tx HDL/Pulse Shaping'],'Open','on');

HDL QAM 受信機

HDL QAM Rx には、次のブロックが含まれます。Automatic Gain Control, Coarse Frequency Offset Correction, Timing Recovery, Magnitude & Phase Recovery, and Demodulate

Automatic Gain Control

Automatic Gain Control サブシステムは、Coarse Frequency Compensation の入力の振幅が 1 ~ -1 の範囲に正規化されるようにします。

set_param([modelname '/QAM Tx HDL/Pulse Shaping'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Automatic Gain Control'],'Open','on');

次のイメージは、Automatic Gain Control サブシステムの構造を示したもので、モデルのパイプライン レジスタが緑色になっています。

Coarse Frequency Offset Correction

Coarse Frequency Offset Correction サブシステムは、Luise-Reggiannini アルゴリズム [1] を使用して周波数オフセットを推定し、補正します。Frequency Offset Estimation サブシステムは、Root Raised Cosine Receive Filter ブロックの出力に基づいて推定を行い、その後、その推定に基づく周波数オフセットの修正を Root Raised Cosine Receive Filter への入力で適用します。これにより、受信信号帯域幅の必要な部分と受信フィルターの周波数応答とがより一層対応し、Root Raised Cosine Receive Filter ブロックの出力での修正に比べて SNR が改善されます。

推定および補正アルゴリズムは閉ループ内での演算であり、以前の周波数オフセットの推定値を反復的に更新するため、システムは徐々に結果に向かって収束します。Loop Gain は推定値を平均します。このアーキテクチャは、[1] で説明されています。Root Raised Cosine Receive Filter ブロックがダウンサンプリング演算を実装するので、フィルターへの入力でレートが一致するようにするには、Repeat ブロックを使用してフィードバック信号をアップサンプリングする必要があります。

Coarse Frequency Offset Correction サブシステムの出力では、Coarse Frequency Offset Correction サブシステムが新しい推定を行うときにサブシステムへの入力における周波数オフセットが同じままであっても、時間の経過とともに変化する残留周波数オフセットがあるということに注意してください。Magnitude and Phase Recovery サブシステムは、残留オフセットを細かく補正します。

set_param([modelname '/QAM Rx HDL/Automatic Gain Control'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Coarse Frequency Offset Correction'],'Open','on');

Frequency Offset Estimation: Frequency Offset Estimation サブシステムは Luise-Regiannini アルゴリズム ([1] を参照) を実装します。サブシステムは、[2] で説明されているように、信号を 4 乗して 4 次の位相推定器を実装します。ハードウェア性能の向上のために付加されたパイプライン化とともに、カスケード接続された 2 つの Product ブロックによって、推定器が実装されます。Discrete FIR Filter は、すべてが 1 で構成される矩形重み付きフィルター ([1] を参照) を実装します。FIR Scale はフィルター ゲインを考慮して FIR 出力をスケーリングします。Complex To Magnitude-Angle HDL Optimized ブロックは、Luise-Reggiannini アルゴリズムで必要な関数 angle を実装するために使用されます。このブロックはハードウェア フレンドリな CORDIC アルゴリズムを使用して位相を計算します。詳細については、Complex to Magnitude-Angle (DSP HDL Toolbox)ブロックを参照してください。Frequency Offset Estimation サブシステムから出力される前に、信号は Luise-Regiannini アルゴリズムで必要な場合はスケーリングされ、さらに、NCO の語長に合うようにスケーリングされます。

set_param([modelname '/QAM Rx HDL/Coarse Frequency Offset Correction'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Coarse Frequency Offset Correction/Frequency Offset Estimation'],'Open','on');

Timing Recovery

Timing Recovery サブシステムを開くには、次のように入力します。

set_param([modelname '/QAM Rx HDL/Coarse Frequency Offset Correction/Frequency Offset Estimation'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Timing Recovery'],'Open','on');

次のイメージは、Timing Recovery サブシステムを示したものです。

Timing Recovery サブシステムは PLL ([3] の Chapter 8 を参照) を実装し、受信信号のタイミングの誤差を補正します。Timing Recovery サブシステムは平均して、入力サンプル 2 つにつき出力サンプルを 1 つ生成します。

Interpolation Control ブロックは剰余 1 の減算カウンター ([3] の Chapter 8.4.3 を参照) を実装し、Interpolation Filter の内挿の選択を容易にするための制御信号を生成します。この制御信号は Timing Error Detector (TED) も有効にし、正確なタイミングの時点でタイミング誤差を計算するようにします。Interpolation Control サブシステムは、Interpolation Filter のタイミング差 mu を更新し、最適なサンプリング時点で内挿を生成します。

Interpolation Filter は、[3] の Chapter 8.4.2 で説明されているように、α=0.5 をもつ Farrow パラボリック フィルターです。このフィルターでは 0.5 の α が使用されているため、すべてのフィルター係数は 1、-1/2、3/2 のいずれかになり、内挿構造は大幅に簡素化されます。Timing Error Detector は、[3] の Chapter 8.4.1 で説明されているように、内挿に基づいて、ゼロクロッシングの際にタイミング誤差を生成します。

タイミング誤差を補正するため、内挿フィルターによって信号で非整数遅延が発生するようにします。この非整数遅延は mu 入力信号によって制御します。タイミング誤差 (遅延) がシンボルの境界に達すると、出力の内挿が 1 つ超過/不足してしまいます。この内挿の超過または不足に対処するため、タイミング誤差検出器にはビット スタッフィングまたはスキッピングが実装されます。

ビット スタッフィングとスキッピングの詳細については、[3] の Chapter 8.4.4 を参照してください。タイミング再生ループは通常、入力サンプル 2 つにつき 1 出力サンプルの割合で生成します。また、入力サンプルレートで実行されるタイミング ストローブ (validOut 信号) も出力します。通常の場合、ストローブの値は 1 と 0 が交互に並んだシーケンスです。しかし、これが起きるのは送信機と受信機間の相対遅延になにかしらの 1 シンボル周期の分数部が含まれ、かつ (シンボル間の) 遅延の整数部が一定である場合のみです。相対遅延の整数部が変化すると、ストローブ値に 0 または 1 が 2 回連続で出力されてしまう場合があります。

Magnitude & Phase Recovery

Magnitude & Phase Recovery サブシステムは、パケット同期、および細かな周波数再生と振幅再生を実施します。

set_param([modelname '/QAM Rx HDL/Timing Recovery'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery'],'Open','on');

パケット同期: Preamble Matched Filter サブシステムは、プリアンブルの時間反転複素共役をフィルターの重みとして使用します。Preamble Matched Filter サブシステムの出力の係数は Modulus サブシステムを使用して計算されます。その後、Modulus サブシステムの出力がしきい値と比較されて、パケットの先頭のプリアンブルが検出されます。この MATLAB Function ブロックは、信号 isPreamble を生成します。この信号は各パケットのプリアンブルの間は高位に保持されます。また、MATLAB function ブロックは dvalid 信号も生成します。この信号はプリアンブルが検出されたときはパケットの存続期間中高い値に設定されます。

振幅と位相の細かな再生: 1-Tap DLMS (遅延最小平均二乗) フィルター サブシステムは、プリアンブルに適応し、Desired Signal Source によって生成される基準信号を使用するというものであり、位相誤差と振幅誤差の両方を補正します。isPreamble 信号は、MATLAB Function ブロックで生成され、パケットが検出された後、14 個のプリアンブル シンボルの期間は高位に維持されます。この信号を使用して、必要な信号ソースを有効にし、1-Tap DLMSAdapt 入力を有効にします。isPreamble 信号が低位の場合、1-Tap DLMS の重みが保持され、Desired Signal Source がリセットされます。ここで遅延 LMS (DLMS) [4] アルゴリズムを使用することにより、より一層のパイプライン処理の導入が可能です。その結果、フィルターのクリティカル パスが減り、ハードウェアでの実装後の実現可能な最大クロック レートが高まります。

Desired Signal Source サブシステムの内部構造を次に示します。data lookup LUT にはプリアンブル シンボルが含まれています。

set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery/Desired Signal Source'],'Open','on');

1-Tap DLMS サブシステムの内部構造を次に示します。

set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery/Desired Signal Source'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery/1-Tap DLMS'],'Open','on');

Demodulate

Demodulate サブシステムは、各 64-QAM 入力シンボルをビットにマップして、入力シンボルごとに 6 ビットを出力します。Rectangular QAM Demodulator Baseband ブロックの HDL コードを生成するため、シンボル間の最大距離は 2 に設定しなければなりません。これは、送信機で生成されるシンボル間の距離の 8 倍です。したがって、それに応じて Demodulate サブシステムへのシンボル入力がスケールアップされなければなりません。この操作は、Shift Arithmetic ブロックを使用して行います。このブロックで、バイナリ ポイントを 3 ビット分だけ左にシフトして、必要な 8 の倍数にします。

set_param([modelname '/QAM Rx HDL/Magnitude & Phase Recovery/1-Tap DLMS'],'Open','off'); 
set_param([modelname '/QAM Rx HDL/Demodulate'],'Open','on');

結果と表示

シミュレーション中、正常に受信されたパケットが MATLAB コマンド ウィンドウに表示されます。MATLAB コマンド ウィンドウは、50 パケットごとに、正常に受信された直近の 50 パケットにおけるデータのビット エラー レートを表示します。

シミュレーションの実行後、モデルには受信機性能のさまざまな側面を示す 6 つの異なる図が表示されます。以下にこれを示し、各プロットについて説明します。最初の 5 つのプロットは、Automatic Gain ControlFrequency Offset EstimationTiming Recoveryの位置推定、Timing Recovery サブシステムの出力と Magnitude & Phase Recover サブシステムの出力におけるコンスタレーションの実数部について、シミュレーション期間中の適応の様子を示しています。最後のプロットは、なんらかの適応が行われた後の Magnitude & Phase Recovery サブシステムの出力におけるコンスタレーション ダイアグラムを示しています。

set_param([modelname '/QAM Rx HDL/Demodulate'],'Open','off');
print_cap = evalc('sim(modelname)'); %#ok<NASGU>
clear print_cap;
tscope1.hide;
tscope2.hide;
tscope3.hide;
constDiag1.hide;
constDiag2.hide;
constDiag3.hide;

自動ゲイン制御のプロット

次のプロットは、出力が正規化されるまでの時間経過に伴う Automatic Gain Control サブシステムの適応の様子を示しています。自動ゲイン制御の適応までの時間と、ゲインが比較的安定したレベルに達した後のリップル数とでバランスをとらなければなりません。自動ゲイン制御ループ ゲインを大きくすると、適応にかかる時間は短くなりますが、適応後の振幅の変動が大きくなります。ループ ゲインを小さくすると、自動ゲイン制御の適応速度が遅くなり、適応後のレベルが滑らかになりますが、適応にかかる時間が長くなります。

tscope1.show;

周波数オフセット推定のプロット

次のプロットは、租周波数オフセットが、システムにより組み込まれた周波数オフセット (青い水平線で表示) に向かって徐々に適応していく様子を示しています。次のイメージは、推定値が実際の周波数オフセットに近づいているものの、まだ残留誤差があり、後にシステムにおいて解決しなければならないことを示しています。

tscope1.hide;
tscope2.show;

タイミング再生位置のプロット

次のプロットは、Interpolation Filter に対する mu 入力を示しています。シミュレーション中はチャネル遅延が変化しないため、時間の経過とともに多少のリップルはあるものの、mu が定常状態に収束することに注意してください。

tscope2.hide;
tscope3.show;

タイミング再生出力の実数部のプロット

次のプロットは、Timing Recovery サブシステムの出力の実数部が 64QAM で想定されている 8 つの個別の振幅レベルへと収束し始めている様子を示しています。ただし、この段階では、祖周波数再生後に残る残留周波数オフセットがまだ受信機で修正されていないので、いくつかの時点では、比較的はっきりと観測できる個々の振幅レベルにおいて、他の場所に比べて信号の品質にばらつきがあります。この時点では、まだ受信機でコンスタレーションが若干回転します。

tscope3.hide;
constDiag1.show;

シンボル推定値の実数部のプロット

次のプロットは、Magnitude & Phase Recovery サブシステムの出力の実数部が時間の経過に伴って適応していく様子を示しています。上記のプロットとは異なり、この図は詳細な周波数再生の後に生成されているため、コンスタレーションは回転しません。ブロックからの出力が有効でないため最初はサンプルがなく、その後、8 つの明確な振幅レベルが示されます。これらは、64-QAM コンスタレーションの 8 つの実際の振幅レベルを表しています。

constDiag1.hide;
constDiag2.show;

再生されたコンスタレーション プロット

次のプロットは、システムにおけるチャネルへの適応時間経過後の Magnitude & Phase Recovery サブシステムの出力時のコンスタレーションを示しています。チャネル ノイズが減ると各コンスタレーション点のサイズが小さくなり、チャネル ノイズが増えると個々のコンスタレーション点が収束し始めます。システムで周波数オフセットに対する修正が正常に行われなかった場合、ここでコンスタレーションの回転が観測されます。

constDiag2.hide;
constDiag3.show;

参考文献

1.Luise, M., and R. Reggiannini. “Carrier Frequency Recovery in All-Digital Modems for Burst-Mode Transmissions.” IEEE Transactions on Communications 43, no. 2/3/4 (February 1995): 1169–78. https://doi.org/10.1109/26.380149.

2.Moeneclaey, M., and G. de Jonghe. “ML-Oriented NDA Carrier Synchronization for General Rotationally Symmetric Signal Constellations.” IEEE Transactions on Communications 42, no. 8 (August 1994): 2531–33. https://doi.org/10.1109/26.310611.

3.Rice, Michael.Digital Communications: A Discrete-Time Approach. Upper Saddle River, N.J: Pearson/Prentice Hall, 2009.

4.Long, G., F. Ling, and J.G. Proakis. “The LMS Algorithm with Delayed Coefficient Adaptation.” IEEE Transactions on Acoustics, Speech, and Signal Processing 37, no. 9 (September 1989): 1397–1405. https://doi.org/10.1109/29.31293..

constDiag3.hide;
close_system(modelname);
clear modelname;