使わない分岐配線のノッチを追跡する
目標
開放した分岐の周期的なノッチを見つけ、整合したときの信号の減少まで、実際のAC応答で比べます。 前提知識は、前のシグナルインテグリティ・ピン負荷のラボ、Pythonの関数・複素数・JSON・ファイル処理です。 目安は85分です。基本の60分が終わる前に、+時間で延長してください(最大180分)。 セッションが終了するとファイルは消えるので、ソースと報告書を別に保管してください。
なぜ重要なのか
配線の長さと終端は、周波数ごとに異なる負荷を作ります。ノッチを消したからといって、信号の大きさまで保てたわけではありません。最も深い1点だけを見て周期を推測したり、範囲外の共振を観測したように報告したりしない方法を学びます。理想的な単一モードの無損失の分岐線路であり、実物の測定・寄生成分・損失・実際のバスの認証の代わりにはなりません。
ステップ
- すべての実装は、/root/stub-notch/analyze.pyに保存します。predict(config,hz)は、理論のHをcomplexで返します。configは、delay_ns=0.2/0.35/0.5/1、termination=open/matchedの、ちょうど2つのキーのdictです。delay_nsは、boolではないint/floatだけを受け付けます。hzは、boolではない有限の正のint/floatです。それ以外の入力はValueErrorです。元のオブジェクトは変更しません。openはH=0.5/(1+0.5j*tan(2πfTD))、matchedは1/3です。TDはnsから秒に換算します。
- relative_response(rows)は、有効な(Hz,実部,虚部)のタプルのリストを受け取り、(Hz,相対dB)のタプルのリストを返します。相対dBは20log10(2*複素数の絶対値)です。分岐のないH=0.5が、固定の基準です。大きさが0ならValueErrorで、すべてのサンプルと順序を保ちます。
- notches(points,threshold_db=-15)は、周波数が厳密に増加している有効な(Hz,dB)のリストから、内側の局所最小値を探し、hz, dbのオブジェクトのリストで返します。両側の隣より低く、しきい値以下の底だけを含め、端点は除外します。同じdBで連続した平らな底は、両側の外の隣より低いときに1つと数え、最初の周波数を選びます。結果は、周波数の昇順です。
- infer_delay(found)は、有効な、周波数が昇順のノッチのリストを受け取ります。2つ未満ならNoneです。それ以外は、隣り合うHzの間隔の中央値spacing_hz、1e9/(2*spacing_hz)であるdelay_ns、すべての間隔のabs(間隔−中央値)/中央値のうち最大のmax_relative_errorを返します。入力の設定や、最初のノッチの絶対的な位置で、代わりに計算しません。
- band_min(points,low_hz,high_hz)は、有効な(Hz,dB)の表の、閉じた関心区間で最も低いdBと、その位置を、hz, dbのオブジェクトで返します。区間の中のすべてのサンプルと、両方の境界のHz対dBの線形補間値を比べてください。ちょうど同じ値なら、低い周波数です。表の範囲を外れたり、low>=highだったりするとValueErrorです。内側のサンプルがなくても、2つの境界を比べます。
- analyze(folder)は、config.jsonと、提供されるsimulator.read_responseで読んだresponse.tsvを分析します。下の参考のオブジェクトを返してください。ノッチ・周期・10–200MHzの最悪値は、観測した表から計算します。すべてのサンプルの複素Hと、predictの結果の差の絶対値の最大を求め、1e-8以下かどうかを判定します。設定だけが変わって一致しなくても、元の観測を残し、生のファイルを変えません。
- campaign(values,folder)は、重複のない1–8個の設定のlist全体を先に検証し、新しいフォルダーを作ります。提供されるsimulator.capture(config,folder/case-NN)を実行して、analyzeします。NNは順番どおりの00からで、観測したconfigが要求と異なればValueErrorです。resultsのリスト、すべてのpassedの論理積all_pass、model=lossless_parallel_stub、measured=Falseを返し、同じオブジェクトをreport.jsonに保存します。失敗した条件と元の4つのファイルを保存し、既存のフォルダーは、空でも拒否します。設定のエラーでは、フォルダーも作りません。
参考
コードは/root/stub-notch/analyze.py、提供されるヘルパーは/opt/lab/fixtures/stub_notch/simulator.pyです。 追加のインストール・インターネット・機器は必要ありません。capture(config,新しいフォルダー)はPathを返し、config.json、 circuit.cir、response.tsv、ngspice.logを残します。read_response(path)は、全体の1991サンプルの、 ヘッダー・有限の数値・10MHz–2GHz・1MHz間隔を検査し、(Hz,実部,虚部)のリストを返します。 壊れた表はValueErrorです。openの遠い端は1兆Ωの抵抗で近似し、すべての線路・本線・ソースは50Ωです。 ヘルパーが計算するのは回路と生の応答だけで、ノッチ・規格の判定は学習者が実装します。
ステップ6の戻りのキーは、config, notches, periodic, band, max_complex_error, consistent, meets_spec, passed, measuredです。notchesは既定の−15dBの検出結果、 periodicはinfer_delayの結果、bandはband_min(points,1e7,2e8)の結果です。 consistentはmax_complex_error<=1e-8、meets_specはband.db>=−1、 passedは両方がTrueかどうかで、measured=Falseです。これは学習用の規格であり、ボードの認証ではありません。 1つ以下のノッチのperiodicはNoneです。設定の遅延を代わりに使ったり、観測を削除したりしません。
最後のステップの実装のあと、実際の6つの条件を、次のように実行してください。すべてが合格するリストではないので、 正常な報告書のall_pass=Falseです。再実行には、run-02のように新しい名前を使ってください。
cd /root/stub-notch
PYTHONPATH=/opt/lab/fixtures/stub_notch python3 - <<'PY'
from analyze import campaign
conditions = [dict(delay_ns=t, termination=m) for t in (0.2,0.5,1) for m in ('open','matched')]
print(campaign(conditions, '/root/stub-notch/run-01'))
PY
ソースは64KiB以下の通常のファイルで、importしたときは何も出力してはいけません。採点は、別の小さなサンプルと実際の エンジンの条件を使います。一般的な数値の許容誤差は相対・絶対とも1e-8、ノッチの周波数は、補間せずに選んだ サンプルのHzです。ルールが有効な数値の表を受け取ると明記した関数は、追加のパーサーを作る必要はありません。 採点のプロセスは、CPU 12秒・ファイル8MiB・全体で35秒の制限です。受講時間とは異なります。
分岐の負荷を複素数で計算する
すべての実装は、/root/stub-notch/analyze.pyに保存します。predict(config,hz)は、理論のHをcomplexで返します。configは、delay_ns=0.2/0.35/0.5/1、termination=open/matchedの、ちょうど2つのキーのdictです。delay_nsは、boolではないint/floatだけを受け付けます。hzは、boolではない有限の正のint/floatです。それ以外の入力はValueErrorです。元のオブジェクトは変更しません。openはH=0.5/(1+0.5j*tan(2πfTD))、matchedは1/3です。TDはnsから秒に換算します。
ソース50Ωから見た負荷は、本線の50Ωと分岐の入力の並列です。整合しても、分岐の負荷がなくなるわけではありません。
すべての条件に同じ基準を使う
relative_response(rows)は、有効な(Hz,実部,虚部)のタプルのリストを受け取り、(Hz,相対dB)のタプルのリストを返します。相対dBは20log10(2*複素数の絶対値)です。分岐のないH=0.5が、固定の基準です。大きさが0ならValueErrorで、すべてのサンプルと順序を保ちます。
それぞれの応答の最大値で割ると、整合した分岐の信号の減少が消えます。実部だけで大きさを計算しないでください。
谷を1つずつ検出する
notches(points,threshold_db=-15)は、周波数が厳密に増加している有効な(Hz,dB)のリストから、内側の局所最小値を探し、hz, dbのオブジェクトのリストで返します。両側の隣より低く、しきい値以下の底だけを含め、端点は除外します。同じdBで連続した平らな底は、両側の外の隣より低いときに1つと数え、最初の周波数を選びます。結果は、周波数の昇順です。
最も深い1点だけを選ばないでください。−15dBもしきい値に含め、両端が低いものは、観測した内側のノッチではありません。
ノッチの間隔から遅延を求める
infer_delay(found)は、有効な、周波数が昇順のノッチのリストを受け取ります。2つ未満ならNoneです。それ以外は、隣り合うHzの間隔の中央値spacing_hz、1e9/(2*spacing_hz)であるdelay_ns、すべての間隔のabs(間隔−中央値)/中央値のうち最大のmax_relative_errorを返します。入力の設定や、最初のノッチの絶対的な位置で、代わりに計算しません。
最初のノッチの1/(4TD)と、繰り返しの間隔の1/(2TD)を区別してください。不規則な間隔の偏差も残します。
関心のある帯域の最も弱いところを探す
band_min(points,low_hz,high_hz)は、有効な(Hz,dB)の表の、閉じた関心区間で最も低いdBと、その位置を、hz, dbのオブジェクトで返します。区間の中のすべてのサンプルと、両方の境界のHz対dBの線形補間値を比べてください。ちょうど同じ値なら、低い周波数です。表の範囲を外れたり、low>=highだったりするとValueErrorです。内側のサンプルがなくても、2つの境界を比べます。
今回のグリッドは、線形の周波数です。直前のRCのラボの対数軸での補間をそのままコピーすると、結果が変わってしまいます。
ノッチがないことと規格に合格することを区別する
analyze(folder)は、config.jsonと、提供されるsimulator.read_responseで読んだresponse.tsvを分析します。下の参考のオブジェクトを返してください。ノッチ・周期・10–200MHzの最悪値は、観測した表から計算します。すべてのサンプルの複素Hと、predictの結果の差の絶対値の最大を求め、1e-8以下かどうかを判定します。設定だけが変わって一致しなくても、元の観測を残し、生のファイルを変えません。
整合した分岐にはノッチがありませんが、関心のある帯域の固定の基準のゲインを、別に検査する必要があります。複素モデルと規格は、別の条件です。
長さと終端の条件を比べる
campaign(values,folder)は、重複のない1–8個の設定のlist全体を先に検証し、新しいフォルダーを作ります。提供されるsimulator.capture(config,folder/case-NN)を実行して、analyzeします。NNは順番どおりの00からで、観測したconfigが要求と異なればValueErrorです。resultsのリスト、すべてのpassedの論理積all_pass、model=lossless_parallel_stub、measured=Falseを返し、同じオブジェクトをreport.jsonに保存します。失敗した条件と元の4つのファイルを保存し、既存のフォルダーは、空でも拒否します。設定のエラーでは、フォルダーも作りません。
ノッチが深い条件を結果から外したり、整合を無条件に成功として扱ったりしません。異なる実行の結果を、同じフォルダーに上書きしないでください。