125Hzに見える875Hzの正体
一言でいうと
標本から125Hzが見えるという事実だけで、元の入力も125Hzだったと言うことはできません。観測の時計、アナログフィルター、数値の収束を、それぞれ変えて、どこまで区別できるかを確認します。
なぜ必要なのか
宇宙温室のセンサー担当者が、ファンを入れるたびに125Hzの振動が生じると報告します。前の単元で、ADCの取得時間を延ばして、前のチャネルの記憶は減らしました。ところが今回は、電圧が十分に整定しても、おかしな周波数が消えません。ファンに本当に125Hzの成分があるのでしょうか、それとも、速い振動を遅く観測して、別の名前で見ているのでしょうか。
取得時間の問題は、1回の標本が目標電圧に十分近いかを問います。エイリアシングの問題は、異なる連続信号が同じ標本列を作りうるかを問います。前者は各標本の誤差を減らす問題で、後者は、観測で失われた区別可能性の問題です。ビット数を増やしたり、小数点以下をより多く出力したりしても、2つの問題が一緒に解決するわけではありません。
Analog Devicesの入力フィルターFAQは、帯域外の成分が標本化の後に関心帯域へ折り返されて入ってきて、その成分を元の帯域内の信号と区別できないという点を説明しています。ここでは、その原理を引用するところで止まらず、2つの実際のngspice出力ファイルを作って突き合わせます。機器に電圧をかける実験ではありません。
どう動くのか
時計が2つある
シミュレーターが回路を計算する時間間隔と、私たちが結果から標本を取り出す間隔は、異なります。ngspiceは、回路方程式を解くために、時間点を残します。波形ファイルの行番号を、ADCの時計とみなしてはいけません。最初の区間の小さな時間間隔や、内部の適応型の計算のせいで、行の間隔が観測周期と異なることがあります。
今回の回路は、振幅1Vのコサイン入力、直列の1kΩの抵抗、接地につないだコンデンサです。コンデンサがあるときの遮断周波数は、fc=1/(2πRC)で、300Hzと80Hzを比べます。フィルターなしは、コンデンサの代わりに10¹²Ωの負荷で実装します。この負荷のせいで、ゲインが数学的に厳密には1ではありませんが、今回の許容差よりはるかに小さい差です。
ngspice公式チュートリアルは、ネットリストで回路を定義して、過渡解析の結果をファイルとして扱う流れを説明しています。提供されるヘルパーは、その作業だけを受け持ちます。標本を選び、スペクトルを計算し、条件を判定する部分は、自分で書きます。使うバージョンは、イメージに含まれるngspice(バージョン42)で、Webドキュメントのインストールバージョンと同じだとは仮定しません。
回路計算の最大間隔dtは2µsと1µs、全体の長さは90msです。観測の開始は24ms、標本数は64個です。観測レートfsを1000Hzから4000Hzに変えるなら、tᵢ=0.024+i/fsも実際に変えます。1kHzの観測は、最後の標本が87ms、4kHzの観測は39.75msです。同じ64個の数字の周波数軸だけを4倍に変えるのは、新しい測定ではありません。
元のファイルに正確な観測時刻がなければ、すぐ前後の2行の出力電圧を線形補間します。入力列のv(in)ではなく、フィルターの後のv(out)を選ばなければなりません。範囲外を勝手に延長する外挿は拒否します。ファイルが途中で切れているのに、必要な標本の一部があるという理由だけで、正常なレポートを作りません。完全な90msの波形かどうかを先に確認するローダーが提供されます。
異なる周波数が同じ名前を得る理由
実数信号の最初のナイキスト区間は、0–fs/2です。正の入力周波数fに対して、r=f mod fsを求めると、その区間の観測周波数は、min(r,fs−r)です。fs=1000のとき、125、875、1125、1875Hzが、すべて125Hzに折り返されます。abs(fs−f)だけを使うと、最初の隣の区間では合っているように見えても、より遠い区間では間違います。
コサインの標本を代入してみてください。cos(2π(fs−f)i/fs)=cos(2πi−2πfi/fs)=cos(2πfi/fs)です。今回の開始点24msと2つの入力は、位相も合っていて、フィルターなしの125Hzと875Hzの標本列が、数値の許容差の中で重なります。任意の開始点・位相・フィルターでも常に標本列が同じだという意味ではありません。RCフィルターは、振幅だけでなく位相も変えるからです。
そのため、比較関数は、スペクトルの最大振幅だけを見ません。同じfs・開始点・標本数を確認してから、各標本の最大絶対差を求めます。大きさのスペクトルは、位相の情報を捨てます。たとえば、符号が反対のコサインは、同じ大きさのスペクトルを持ちますが、標本列は同じではありません。ここでindistinguishableという名前は、明示した観測と100µVの許容差の中で、区別できなかったという意味です。
DFTを自分で計算する理由
64個の標本xᵢについて、Zₖ=(1/N)Σxᵢ exp(−j2πki/N)を計算します。k番目のビンの周波数は、kfs/Nです。実数信号の片側の結果は、k=0..N/2だけが残ります。内部のビンの振幅は2|Zₖ|ですが、DCとナイキストのビンは|Zₖ|です。端点2つまで無条件に2倍にすると、定数電圧と、交互に符号が変わる信号の振幅を、誇張してしまいます。
1kHzでビン間隔は15.625Hzで、125Hzはビン8です。4kHzで間隔は62.5Hzで、125Hzはビン2、875Hzはビン14です。2つの観測とも、信号の周期がDFTの窓に整数回入るように選びました。この条件を、コヒーレントサンプリング(coherent sampling)といいます。おかげで、窓関数の補正や、ビンの間のピーク推定と混ざらずに、エイリアシングそのものを学べます。
周波数がビンと合わなければ、エネルギーが複数のビンに広がることがあります。そうなると、最大のビンの振幅だけを、元の信号の振幅として使ってはいけません。今回の分析契約の2つの入力の組は、[125,875]と[375,625]に限定します。無信号の浮動小数点のかすに周波数の名前を付けないように、最大振幅が1µV以下ならpeak_hzはnullです。これは今回のレポート規約であり、普遍的なセンサーの検出限界ではありません。
フィルターがあることと、要求を満たすこと
1次RCの定常状態のゲインは、G(f)=1/√(1+(f/fc)²)です。このfは、フィルターに実際に入った元の周波数です。875Hzをすでに折り返された125Hzに置き換えてからRCのゲインを計算すると、フィルターと標本化の順序を逆にしてしまいます。
望む125Hzの振幅を0.9V以上保存し、妨害の875Hzは0.1V以下に減らしたいとします。入力振幅は、どちらも1Vです。解析式の丸めた値は、次のとおりです。実際の実行レポートには、計算値の代わりに、ファイルで観測した値が入ります。
| 条件 | 望む125Hzの振幅 | 妨害875Hzの振幅 | 同時に満たすか |
|---|---|---|---|
| フィルターなし | 約1.000V | 約1.000V | いいえ |
| fc=300Hz | 約0.923V | 約0.324V | いいえ |
| fc=80Hz | 約0.539V | 約0.091V | いいえ |
80Hzのフィルターは妨害を減らしますが、望む信号も減らしすぎます。3つの候補に正解がなければ、4つ目のfcを探し続ければよいのでしょうか。不等式を整理すると、通過帯域はfc≥125/√(1/0.9²−1)、阻止帯域はfc≤875/√(1/0.1²−1)です。それぞれ、約258.09Hz以上と、87.94Hz以下です。区間が重ならないので、この要求は、どんな単一のRCでも満たせません。
これはラボの失敗ではなく、設計の結論です。候補のリストを埋めるために、許容差を広げたり、要求条件をこっそり変えたりしてはいけません。次の設計では、フィルターの次数、観測レート、入力帯域の仮定などを検討しなければなりません。単に今回の3つのフィルターが失敗したという表と、単一RCの全区間の共通部分がないという証明は、異なる強さの根拠です。
数値の精度と設計の適合性を別々に報告する
同じ回路を、dt=2µsと1µsでそれぞれ解き、2つの観測レートで、標本の差が100µV以内かどうかを見ます。そのうえで、4つのレポートの周波数・振幅が、折り返しの式とRCの解析式に合っているかを確認します。収束したからといって、正しい回路になるわけではありません。誤ってつないだ入力列も、時間間隔を小さくすれば、安定して同じ誤答に収束することがあります。
最後に、望む帯域と妨害帯域の要求を、どちらも確認します。レポートは、収束したか、モデルが一致したか、設計要求を満たしたかを、別々のフィールドに残します。実行エラーはエラーとして、正常に分析した後に採用できるフィルターがない場合は、空の候補として残します。両者を一緒にすると、モデルを変えるべきなのか、実行環境を直すべきなのかを、区別できません。
現場での姿
センサー・オーディオ・振動データを扱うチームで、低い周波数のピークを見つけたなら、入力帯域、フィルターの位置、実際の標本の時計から確認します。ファイルに書かれたsample_rateという数字だけを信頼せず、タイムスタンプと取得の設定を一緒に残します。分析の自動化の価値は、グラフを速く描くことだけでなく、誰が再実行しても同じ条件を突き合わせられるようにすることにあります。
Analog Devicesの理想ADCのエイリアシングの解説は、オーバーサンプリングと、アナログ・デジタルフィルターの役割を区別しています。すでに関心帯域へ折り返された妨害は、デジタルのローパスだけでは選んで取り除けません。このページのJavaアプレットを実行したとは主張せず、説明の原理だけを参考にします。実際の計算の根拠は、今回保存した波形です。
今回の結果は、理想RCと、一様な標本化についてのものです。ノイズ、量子化、クロックジッター、非線形ADC、アクティブフィルターの安定度、温度別の部品の変化は、モデルにありません。したがって、実際のボードの性能の認証や、安全の判定に拡大しません。前のステップの取得スイッチモデルも、今回の回路に自動では合成されていません。異なる実験の結論を結合するには、モデルの接続部から検証しなければなりません。
次のラボですること
ステップ8で、折り返し関数、時間の補間、片側DFT、ファイル分析、標本の比較、RCの要求区間、フィルターの判定、条件比較のCLIを、順に作ります。ヘルパーが作ったネットリスト・設定・ログ・元の波形と、自分で作ったJSONレポートを、一緒に読みます。1kHzで区別できなかった入力を、4kHzで観測し直して区別し、単一RCの空の候補が、なぜ妥当な結論なのかを説明するのが、最後の課題です。