ADCからより多くの分解能を得るためにADCサンプルを平均化できないのはなぜですか?


8

Arduino ADCから10ビットを超える精度を取得しようとしていますが、その背後にある理論を実際に理解することはできません。よく引用されるAtmelアプリケーションノート(http://www.atmel.com/Images/doc8003.pdf)は、

通常の平均化では変換の分解能が向上しないことに注意してください。間引き、または補間は平均化方法であり、オーバーサンプリングと組み合わせて、解像度を向上させます

それから彼らが「間引き」のために提案するのは小数点を動かすことです。これは、移動するすべての場所のバイナリ読み取り値を半分にすることになるため、ベース10の値を2または4または8で除算するか、何を使用するかを決定します。デシメーションが間違っていると理解していますか?


「オーバーサンプリングと組み合わせると、解像度が上がります」-解像度を上げるには、より多くのサンプルを取得する必要があると彼らは言っていると思います。(何とは対照的に、私は知りません。多分彼らは、誰かが同じサンプルを自分自身で何度も平均化するのに十分愚かだと思うかもしれませんか?)
user253751

DSP(デジタル信号処理)の分野では、「間引き」という用語は、サンプルがあまり変化しない場合(信号ナイキスト境界を超えてオーバーサンプリングする場合、または平滑化フィルターの後)にサンプルを削除(ドロップ)する通常のアルゴリズムを意味します。この用語は、古代ローマ(?)で、戦場で失敗した連隊の3人目の兵士などすべてを殺すという慣習に由来しています。
Ale..chenski 2017

また、平均化アルゴリズムの一部である可能性もありますが、Atmelの記事が小数点の移動を提案している場所はわかりません。
Ale..chenski 2017

回答:


7

私はそのメモを見てみましたが、それは確かに奇妙な主張(または、それらが実際に何を意味するかを言うのに混乱する方法)です。

おそらくそれらが実際に意味するのは、より多くの解像度を得たい場合、得られたビットを(整数演算で)スローするため、後で数値を単一のサンプルと同じスケールに除算/シフトすることができないという点です。

ADCサンプルにノイズ多い場合は、もちろん、元のスケールで除算してノイズの少ない値を取得できます。


私はあなたの質問から考える他の事は、オーバーサンプリングを行うに右のあなたは効果的なローパスフィルタを使用する必要があり、単純な移動平均ではないことがポイントだったよう適切に設計されたFIRのような低域通過フィルタであることで良いです(またはIIR)フィルター—ただし、メモのテキストではサポートされていないようです。


ローパスフィルターまたは移動平均フィルターは1 / fノイズをフィルターで除去しません。これは、フィルターが機能しなくなった場合に下位ビットにノイズが多い理由のほとんどです
電圧スパイク

16

あなたが誰かに最も近いセンチメートルに正確な45.2cmボードを測定するように頼むなら、彼らは45と答えます(またはすべきです)。次にそれをもう一度測定するように頼めば、彼らは再び45と答えます。演習をさらに8回繰り返し、すべての測定値の平均は正確に45になるはずです。入力を何回サンプリングしても、値は45になります。もちろん、これらすべての測定値の平均は45(ボードの長さは45.2cmですが)。

最初の測定の前に0.45cm、2番目の前に0.35cm、5番目の前に0.05cm、6番目の前に0.05cmなど、最大で0.45cm手前まで読み取るように測定装置を調整させた場合10番目の場合、2つの測定値は46を読み取り、残りの8つは45を読み取ります。それらすべての平均は45.2になります。

実際には、物事を非常に正確に偏らせるように管理することは困難です。各測定の前に測定装置をランダムに調整して、長さ0.5cmから0.5cmの間のどこかを読み取る場合、測定値の約1/5が46と残りの45を読み取りますが、調整がランダムであるため、実際の割合は高くなる可能性があります以下。10回の測定を行っても、完全な意味のある精度の数値は追加されませんが、平均で約100は追加されます。

平均化と右シフトの区別についての論文の理論的根拠を完全に理解しているとは思えません。平均化によって達成される見かけの精度が意味のある精度レベルを超える可能性があることに注意する必要がありますが、私の経験から、右シフトするタイミングと量は、プロセッサーの数値範囲の制限によって駆動される必要があるという質問です。オーバーフローを発生させずに可能な限り拡大した数値を扱うと、少量のノイズに過度の重要性を付けない限り、丸め誤差の影響を最小限に抑えることができます。

ちなみに、元の使用法では、軍を「間引く」とは、その中の兵士の1/10を殺すことでした。ADCからのデータを間引くとは、ADCの一部を破棄することです。「小数点」という語句を含む共通の接頭辞は、関連付けを意味するものではありません。


14

短い答えはノイズであり、それは必ずしも重要なノイズではなく、ノイズタイプです。もう1つの問題は、INLのような非線形効果であり、平均値が失われる

最初にノイズに:

ガウス分布をサンプリングすると、次のようになります。

ここに画像の説明を入力してください

赤い線は実際の熱分布(時間平均)に近く、青いヒストグラムは多くのADCサンプルを表しています。この分布を継続的にサンプリングすると、より良い統計が得られ、平均値または平均をより正確に見つけることができます(これは通常、その後でした)はい、信号が移動し、フィルタリングと信号対ノイズが存在することを認識しています周波数の内容によって異なりますが、信号が今のところ移動していないDCの場合を考えてみましょう。

μ=1Σ=1バツ

問題はフリッカーノイズまたは1 / fノイズです。分布がガウスではなくなっているため、ガウス平均が変動し、統計が崩れます。

これは貧弱なモデルですが、このINLのような見た目も問題であると考えることができます。これは、平均を落とすいくつかのエラーを引き起こす可能性があるためです。

μ=1Σ=1バツ+error

それはおそらく混乱を招くので、以下に示すように時間ドメインを見てみましょう

上の画像では、ガウスノイズのある信号を確認できます。中央から「線を引く」ことで平均を求めるのは簡単です。このような信号から取得するサンプルが多いほど、平均の精度と知識が向上します。

下の画像では、フリッカーノイズがどのように見えるかを確認できます。平均化はここでは役に立ちません。

問題は、ほとんどの電子機器にフリッカーノイズがあり、抵抗には(室温からの影響がないと仮定して)ありませんが、トランジスタとICにはあります。これらの影響を克服するチョッピング増幅器と呼ばれる増幅器があります。

もう1つ知っておくべきことは、ADCがあり(線形には新しいSARコアがある)、エンジニアが1 / fノイズの影響(およびINLのようなADCの他の非線形効果)をADCビットよりもはるかに低いレベルまで排除するために取り組んだことです値。重いオーバーサンプリングを採用して、14ビットコアから32ビット値を取り出すことができます。

出典:EDN- 1 / fノイズ-キャンドルの点滅 ここに画像の説明を入力してください


非常に興味深いですが、アプリケーションノートがちらつきノイズに言及していたとは思いません
プランピー、

すべての良い点。単純な平均化フィルターはSINC(すべての係数は同じ)ですが、完全に収束することはできません(後で引用-現在電話を使用)。
Peter Smith

6

それから彼らが「間引き」のために提案するのは小数点を動かすことです。

ではない正確に。その間引きの部分は、私の見解では、複数のサンプルの通常の「平均化」ではあるが、ビット幅は保持しているが、それほど多くの情報を保持していないと主張しています。したがって、m個のnビットADCの読み取り値を平均しても、結果の平均は依然としてnビットのADC読み取り値です。

提案されたアプローチは、控えめに言っても、結果の平均がより高いビット幅を持つようにnビットADCの読み取り値を平均化することです。たとえば、4つの10ビットADC読み取り値を合計して2で割ると、11ビットADC読み取り値が得られます。

私は常にそれがオーバーサンプリングが専門的に行われてきた方法であると思いました。ネット上の人々によるこの単純な平均は、間違ったアプローチであると広く理解されています。

もう1つの点は、ノイズを減らすために、オーバーサンプリングはノイズがある場合にのみ効果があるということです。神によって設計された10ビットADCがある場合(つまり、すべての測定値が変化のない絶対的な真の測定値である場合)、オーバーサンプリングは機能しません。

ノイズを追加するためのPWMの使用に関する記事の最後にある特定の回路は正しくありません。ノイズを追加するピンには、DCブロッキングコンデンサが必要です。実質的でない点は、PWMピンである必要がないことです。通常のGPIOピンが機能します。


>ネット上の人々によるこの単純な平均は、間違ったアプローチであると広く理解されています。それらをフロートとして平均化するのではない
プランピー

4

まず、ADCはその電圧リファレンスと同じぐらい優れています。arduinoが+ 5Vを基準として使用している場合、+ 5Vレギュレータは1-5%のようにノイズが多く、精度が低く、出力電圧は電流の量に依存するため、あらゆる種類の精度を忘れることがあります測定時と最後の数ミリ秒の両方で。

したがって、精度または精度が必要な場合は、要件に一致する基準電圧を選択してください。電圧の絶対精度が必要ない場合は、正確で安定しているのではなく、安定している必要があるだけなので、安価になります。

Arduino内でSAR ADCをテストしていません。私は近親者であるAT90PWM3Bの1つを経験しました。かなり良いです。入力電圧が一定の場合、ADCの読み取り値が何度も繰り返され、電圧が値の間にある場合は1 LSBが変動します。SAR ADCからより良い結果を期待することはできません。(私は良質の外部電圧リファレンスを使用しました)

したがって、ここではノイズは問題になりません...

実際、ノイズはあなたの友達です...

測定したい電圧がADC値100.1に落ちるとしましょう

10回測定しますが、ADCは優れているため、毎回100回測定されます。

したがって、1 LSBのノイズのように、信号に少しノイズが必要です。100.1を測定する場合、10のうち9倍の100と10分の1の101が得られます。したがって、平均は100.1になります。

それがセンサーからのものである場合、通常は無料で十分なノイズがあります。


現在の方法で精度と精度の両方を失っているすべての方法についての良い点。私はtl431(精度調整可能なシャント)を敷設していて、それを接続してみます。
プランピー2017

線形電圧レギュレータは、MHz範囲の応答時間を持っているため、ADCの周波数範囲ではかなり安定しています。
JimmyB 2017

次に、同じVcc(ポテンショメータ、分圧器タイプのセンサー)に関連する電圧のみを測定する場合があります。
JimmyB 2017

「MHz範囲内」の応答があるLDO ???? 男性にデータシートを送ってください。会いたいです!ほとんどの場合、arduinoにはクラミー1117またはそれに類似したものが付属しており、過渡応答が非常に遅くなります。
peufeu 2017

4

欠けているのは「間引き」の意味です。

厳密に言うと、「間引き」は1/10への削減です。つまり、10から1に減らします。

サンプリングで使用される「間引き」は厳密な意味を失います。1/10ではなく、「数を減らす」という意味です。

つまり、サンプルの数を平均して、同じ数だけサンプルの数を減らします。

例として、1000Hzでサンプリングし、平均4サンプルの場合、平均のみを維持します。最終的に、毎秒1000サンプルではなく、250サンプルしかありません。時間分解能は失われましたが、電圧分解能は1ビット増加しました。

4の各係数に対して、1ビットを獲得します。平均して4の間引き、10ビットの解像度から11ビットの解像度まで。

別の4の因数(4 * 4 = 16の合計)は、10ビットから12ビットに変更します。もう1つの係数4は、13ビットの解像度になります。

ただし、ここで64倍のオーバーサンプリングになっていることに注意してください。有効なサンプリングレートは同じ係数で低下します。1000Hzのサンプリングレートの例を使用すると、1秒あたり約15の実効サンプルになります。

これはデシメーションであり、多くのハイビットADCが高解像度を取得します。彼らは、高レート、平均(またはデジタルローパスフィルターを使用)でサンプリングし、間引きします。

極端な例では、数ビット単位でオーバーサンプリングして16ビットの有効ビット深度を提供するシングルビットADC(単純なコンパレータ)があります。

これが機能するために留意する必要があることの1つは、ADCが測定できる最小値とほぼ等しい信号のノイズが必要であることです。5Vの基準電圧を使用する10ビットADCの場合、これはピーク間で約5mVのノイズになります。

ノイズの平均化は、ビットゲインが実際に発生する場所です。512のADCカウントと513のADCカウントの値の間に正確にある信号(DC)があるとします。ノイズがない場合、測定値は常に同じになります。平均化すると、サンプルと同じ値が得られます。

ノイズを測定可能な最小値程度で追加すると、非常に異なって見えます。信号自体は変化しませんが、測定値は信号の真の値を中心に「揺れ」ます。平均はサンプルとは異なり、使用するサンプルが多いほど、信号の実際の値に近づきます


私は、Arduino(10ビットADCを備えたAtmelプロセッサーを使用)でこの手法を使用して、行っていたいくつかの測定でより良い分解能を得ました。

13ビットまで取得しましたが、さらに必要なことがわかりました。別の4の係数を使用することもできますが、各サンプルで時間がかかりすぎて、もう1つだけ取得できました。

オーバーサンプリングを使った実験は、ADCを改善するために時間とお金を費やすことなく、私がやっていることが機能する(認識できるが、うるさい結果が出る)ことを示しました。概念実証があれば、先に進んでより優れたADCを取得できます。その証拠を得ることで、数行のコードと少しの時間しかかかりません。

少なくとも16ビットが必要であることがわかりました。これは、4096サンプルを平均化することを意味します。
これは、Arduinoソフトウェアで可能な最速のサンプリングを使用して約0.5秒です。

14400回の測定が必要だったので、完全な実行には2時間かかりました。

私はその患者ではありません、そして私が測定していたものはその間一定に留まりません。内部ではるかに高いオーバーサンプリングレートを使用し、低いレートでより高い解像度のサンプルを提供するADCの使用に切り替える必要がありました。

多くのことと同様に、デシメーションとは、ある方向(ビット深度)でのパフォーマンスを向上させながら、別の方向(サンプリングレート)でのパフォーマンスを犠牲にする妥協です。


3
間引きの意味について少し時間をかけて説明します。厳密には 1/10の削減意味し、9/10のアイテムを保持します。
パイプ

2

だからあなたは理論を学ぶことができますが、私は実際には単純なモデルだけが重要であることを伝えることができます。信号がノイズ内にある限り、平均化できます。その後、信号はそのままで、ノイズ成分の平均がゼロになります。これにより、帯域幅を犠牲にして解像度を得ることができます。

たとえば、16ビットのADCがあり、最後の4ビットにノイズが多い場合、それらをフィルタリングして信号をそこに取得できます。しかし、少しだけうるさい場合は、平均するものがあまりないため、新しい情報はあまり得られません。

本当に高い解像度(および低帯域幅)が必要な場合は、シグマデルタADCの動作を確認してください。それらは1ビットの高レート信号を持ち、それはより高い解像度で、時には20ビット以上の帯域幅までフィルタリングされます。


2

なぜできないのですか? できますが、計画が確実に機能するように、エラーとノイズのすべての原因を考慮する必要があります。

平均化は、標準偏差エラーを減らすことにより、分解能を向上させる働きをします。 σ。満たすべき基準は、ガウスノイズが量子化誤差を超えていなければならないということです。定義される仕様は合計エラーであり、量子化エラーまたは分解能が合計エラーバジェットのごくわずかな部分に寄与するようにします。

たとえば、解像度を2ビットずつ改善したいが、ノイズがすでに3ビットである場合は、ノイズを2 + 3 = 5ビットだけ減らすと同時に、解像度を2ビットずつ上げる方法を検討する必要があります。

  • これは、レイテンシのコストで平均25を超えるサンプルを平均化するデジタルソリューション、またはノイズ除去フィルタリング、コモンモードノイズを除去する信号のバランス調整、および/またはデジタル平均化による信号のシールドによるアナログソリューションです。

nが解像度の必要な追加ビットである場合、2進数を右シフト(または間引き)x1は/ 2に等しくなります。

平均化することは、 σ ノイズの低減 バツ xサンプルの場合はレイテンシがx時間サンプルだけ増えるため、レイテンシを減らすにはオーバーサンプリングが必要です。

「間引き」という用語は、10進数値と2進化10進数の両方に適用されます。整数値を読み取るカウンターがあり、10個の結果を平均化することで視覚化できます。10で割ると、小数点以下の桁数が増えますが、 σ ノイズの低減は 1/10=1/3.3 xサンプルの場合、レイテンシはx時間のサンプルだけ増加するため、レイテンシを削減するにはオーバーサンプリングが必要です。

foversaメートルplg=4fNyqあなたst

ただし、そのサンプルレートでのノイズは、fs 解像度を最高に改善するには、xサンプルの一部で+/- 1ビットをディザリングするのに十分である必要があります。

  • たとえば、帯域幅が10kHzの場合、 fNyqあなたst= 20kHz
  • 10ビットの解像度を12ビットに変換する場合、n = 2の場合、解像度を10ビットから12ビットに増やすには、16個の10ビット値を合計する必要があります。16個の10ビット値の合計は14ビットの結果を生成し、最後の2ビットは貴重な情報を保持することが期待されていません。

量子化エラーが多すぎたり、ランダムノイズが多すぎたりすると、エラーを減らすためにより多くの平均化が必要になり、より多くの平均化により結果の待ち時間が増加します。

ADCの速度とエラーを最適化するには、全測定範囲内の任意の信号に対して、合計エラーバジェットと使用可能な分解能(ビット)、必要なSNR、または絶対エラーを定義する必要があります。最初にすべてのエラーの原因を定義することは難しいように思えるかもしれませんが、

例:ゲインエラー、オフセットエラー、量子化エラー、CMノイズエラー、DMノイズエラー、Vrefノイズまたはオフセットエラー、環境ノイズなど、遅延エラー(平均化による)

次に、他のすべてのエラーの原因を最小限に抑えた後、上記の設計エラーバジェットを達成するために必要な分解能のビット数を決定します。

同じことが(低速信号の)平均化と信号帯域幅のオーバーサンプリングとリアルタイムADCの間引きにも当てはまります。

これは、ゲインまたはオフセットエラーを修正しません。ランダムノイズが不十分な場合、ノイズを追加して信号をディザリングする必要があります。理想的には、他のすべてのノイズとエラーの発生源が1ビットを超えないようにして、標準偏差またはディザーがサンプル数全体で+/- 1の値になるようにします。ただし、両方の方法で連続するサンプルによって同じ読み取り値が得られないように、十分なノイズが必要です。


1

その背後にある理論は、簡潔に言えば、オーバーサンプリングに関するウィキペディアの記事の次の文からとることができます。

ただし、SNRはsqrt(N)(...)増加します。無相関ノイズを合計すると振幅がsqrt(N)増加し、コヒーレント信号を合計すると平均がN増加します。その結果、SNR(または信号/ノイズ)はsqrt(N)増加します。この例では、N = 256の場合にダイナミックレンジが8ビット増加し、「コヒーレント信号」の内容がN増加しますが、ノイズはsqrt(N)= sqrt(256の係数で変化します。 )= 16の例(16ビットの増加と混同しないでください)なので、SNRは16倍に変化します。

したがって、信号が特定の基準に一致する場合(十分に低速でノイズが少ないなど)、実際には4サンプルごとに1ビットを増やします。次に、結果として得られる4つのサンプルごとに、「結合」を取得して、別の高解像度サンプルを形成し、最終的に、ADCで読み取るn個のサンプルごとにlog_4(n)ビットを取得できます。

間引き部分については、特にここで整数(ADCサンプル)について話していることを考慮すると、それは実際には平均化されていません。あなたが持っている場合たとえば、サンプル113そして2、あなたの平均は次のようになります。

int result = (1+1+3+2)/4;

整数演算で平均化しているので、1.75の「数学的結果」は1に切り捨てられます。2を掛けると、になります2

今、あなたがそれを間引きするならば:

int result = (1+1+3+2)>>1;

結果はになります3。これは2で除算することと同じであると主張できますが、3が1、1、3、2の平均であることは間違いありません。違いを見ます?

今、あなたは単にすべてを合計し、最後のビットを捨てないようにしたくなるかもしれません。ただし、このビットはノイズであることを忘れないでください。実際には使用できません。


ノイズ振幅がsqrt(N)で増加し、コヒーレント信号がNで増加する場合、SNRはsqrt(N)ではなくN / sqrt(N)で増加する必要があると
思います

@Plumpieもう一度数学をチェックしてください:N/sqrt(N) = sqrt(N)
RonanPaixão2017

1

質問の理論的な部分は誰もがすでにカバーしているようですが、Arduinoを使用しているので、この手法でADCの解像度を高めようとする私の冒険を読みたくなるかもしれません。

ディザリングとオーバーサンプリングによるArduino ADCの解像度の向上

ノイズの特性はストーリーの重要な部分であり、ADCを非同期で読み取りながら、ピンに抵抗を付けてピンにパルスを送るだけで、かなり良いディザーを生成できることがわかります。それは完璧ではなく、達成しようとしている余分なサンプル/ビットの数に応じて変化する小さな同期オフセットを取得します。また、この手法はArduinoのレールの安定性の悪さに依存しているため、優れたプラクティスに従うのではなく、実際に欠陥に設計しているという批判も受け入れます。しかし、それはとても簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.