C++ でこの領域を測定するにはどうすればよいですか?
(更新:質問を再度編集するのではなく、ソリューションとコードを回答として投稿しました)
理想的な線 (赤の破線) は、開始点からのプロットで、測定角度ごとに平均上昇が追加されています。これは私が平均して取得します。テストデータを黒で測定しました。青色のくぼみの面積を定量化するにはどうすればよいですか? X 軸がユニット化されているため、傾きと計算が単純化されます。
このような領域のサイズのカットオフを決定し、この部分に再テストまたは失敗のフラグを立てることができます. まれに、右寄りに表示される別のくぼみがありますが、標準偏差のカットオフ値を設定すると、通常、それらの部分は失敗します。
アップデート
ディエゴの答えは、これを視覚化するのに役立ちました。何をしようとしているのかがわかったので、「自家製ディップ検出器」を実装するアルゴリズムに取り組みます。:)
なんで?
私が販売しているスロットル位置センサーをテストするためのテスト ベンチを作成しました。収集されたデータを分析することにより、プロットがどれほどまっすぐであるかをプログラムで定量化しようとしています。この特定のモデルは私を悩ませています。
販売したくない部品のサンプル プロット:
X 軸は、スロットル開度の等間隔の角度です。ステッピング モーターは入力シャフトを回転させ、0.75° ごとに停止して 10 ビット ADC で出力を測定し、Y 軸に変換します。プロットは、をビットマップ座標に変換data[idx]
したものです。次に、ブレゼンハムのアルゴリズムを使用して、ビットマップ内のポイント間に線を引きます。idx,value
(x,y)
私の他の TPS 製品は、驚くほどリニアな出力を生成します。
プロットの下 (左) の部分は、自動車の通常の使用にとって重要です。それは、街中を運転している時、駐車場に入る時などです。この特定の部分は、開口部が 15° 前後に傾斜する傾向があります。このプログラムを使用して、曲線のこの「傾斜」を定量化し、テスターの直感。上記の例では、プロットは落ち込みますが、理想的な線には戻りません。
これは組み込みアプリケーションですが、レポートの印刷には 10 秒かかります。そのため、120 ポイントのデータの配列を何度もステップ実行することはサイクルの無駄だとは考えていません。また、uC32 PIC32 マイクロコントローラーを使用しているため、メモリが十分にあるため、コントローラー内でこの問題を熟考できる余裕があります。
私がすでに試していること
テスト ポイント間の上昇の配列: X 軸を完全に無視し、それがユニット化されていることを考慮してから、ある読み取り値から次の読み取り値への変更の配列を作成します。この配列は、レポートの「ポイント間の最小上昇: 0 最大: 14」に寄与するものです。私はこれを配列と呼びますdeltas。
で標準偏差を使用しdeltasてみましたが、テスト中に、この部品の標準偏差が低いことは信頼できる尺度ではないことがわかりました。ディップが初期のデータ ポイントによって暗示された元のラインにすぐに戻る場合、標準偏差は一見低い (2.3 と低いことが観察されている) 可能性がありますが、その部品はまだ使用したくないものです。カットオフを 2.6 に設定しようとしましたが、素晴らしいプロットで失敗したパーツが多すぎました。上記にリンクされている他のより直線的な部分は、品質のために標準偏差を確実に当てにすることができます。
尖度は、この状況にはまったく当てはまらないようです。今日、尖度について学び、尖度と歪度を含む統計ライブラリを見つけました。継続的なテスト中に、これら 2 つの測定値のうち、合格または不合格に対応する正、負、または振幅の傾向がないことがわかりました。その同じ紳士が線形回帰ライブラリを共有していますが、Lin Reg は私の状況とは無関係であると考えています。AVG がdeltas私の理想的な線であるという仮定に満足しているためです。線形回帰と R^2 は、理想的ではないデータまたははるかに大きなセットから直線を見つけるためのものです。
各デルタを AVG および Std Dev と比較するdeltasのデータの最終平均に対して各デルタをチェックするようにモニターを設定しました。ここでも、信頼できる指標が見つかりませんでした。良品が多すぎると、デルタを平均から標準偏差の 2 倍以内に制限するテストに合格しません。最終的に、私が納得できる AVG からの唯一のバリエーションはAVG+Std Dev
、AVG 自体との差の範囲内に収まることです。より制限的なものは、そうでなければ良い部分に失敗します。そして、15°の開口部付近のとらえどころのないディップは、このテストをこっそり通り抜けることができます.
自作のディップ検出器コンピュータのシリアルモニターにフィードdeltasすると、ディップ中に連続して陰性が観察されdeltasたので、ディップ検出器をプログラムしましたが、非常に粗雑に感じました。deltas連続して 5 つ以上のマイナスがある場合は、それらを合計します。AVG からのディップの差の合計を取り、負のデルタの数で割ると、2.9 または 3 を超える値は失敗を意味する可能性があることを確認しました。6 から 15 デルタまで続くディップを観察しました。容易に観察できるディップは、AVG 合計との差が最大で -35 になります。
AVG からのトレンド累積変動 上記のことから、AVGdeltasから離れていくにつれての合計を見ることが答えになるのではないかと思いました。つまり、配列をステップ実行し、AVG からの各デルタの差を合計します。かなりの部分がこの理論を吹き飛ばすまで、私は何かに取り組んでいると思っていました。AVG
実行中の合計の変動回数が 未満2x AVG
であるほど、直線がより直線的になる傾向が見られました。多くの理想的なパーツは、8 つ以下のデルタ ポイントしか示さずsumOfDiffs
、AVG から大きく外れます。
float sumOfDiffs=0.0;
for( int idx=0; idx<stop; idx++ ){
float spread = deltas[idx] - line->AdcAvgRise;
sumOfDiffs = sumOfDiffs + spread;
...
testVal = 2*line->AdcAvgRise;
if( sumOfDiffs > testVal || sumOfDiffs < -testVal ){
flag = 'S';
}
...
}
そして、素晴らしい線形プロットを持つ部品はsumOfDiffs
、AVG の 2 倍以上である 58 のデータ ポイントで実現しました! sumOfDiffs
120 個までのデータ ポイントの最後で、値が -0.000057であるため、これは驚くべきことだと思います。
テスト中、最終sumOfDiffs
結果はしばしば 0.000000 として登録され、非常に悪い部品でのみ .000100 より大きくなります。実際、これは非常に驚くべきことでした。「悪い部分」がどのように優れた精度を蓄積できるかということです。
sumOfDiffs のモニタリングからの出力例この下の出力は、ディップが発生していることを示しています。sumOfDiffs
テスト全体で、実行が AVG から AVG の 2 倍以上離れているため、テストは監視します。この落ち込みはdeltas idx
23 度から 49 度まで続きます。17.25°から始まり、19.5°続きます。
Avg rise: 6.75 Std dev: 2.577
idx: delta diff from avg sumOfDiffs Flag
23: 5 -1.75 -14.05 S
24: 6 -0.75 -14.80 S
25: 7 0.25 -14.55 S
26: 5 -1.75 -16.30 S
27: 3 -3.75 -20.06 S
28: 3 -3.75 -23.81 S
29: 7 0.25 -23.56 S
30: 4 -2.75 -26.31 S
31: 2 -4.75 -31.06 S
32: 8 1.25 -29.82 S
33: 6 -0.75 -30.57 S
34: 9 2.25 -28.32 S
35: 8 1.25 -27.07 S
36: 5 -1.75 -28.82 S
37: 15 8.25 -20.58 S
38: 7 0.25 -20.33 S
39: 5 -1.75 -22.08 S
40: 9 2.25 -19.83 S
41: 10 3.25 -16.58 S
42: 9 2.25 -14.34 S
43: 3 -3.75 -18.09 S
44: 6 -0.75 -18.84 S
45: 11 4.25 -14.59 S
47: 3 -3.75 -16.10 S
48: 8 1.25 -14.85 S
49: 8 1.25 -13.60 S
Final Sum of diffs: 0.000030
RunningStats analysis:
NumDataValues= 125
Mean= 6.752
StandardDeviation= 2.577
Skewness= 0.251
Kurtosis= -0.277
品質に関する冷静なメモ:この旅の始まりは、主要な自動車 OEM サプライヤーがどのように 4 点テストをこれらの部品の標準的な尺度と考えているかを学んだことでした。私の最初のテスト ベンチは、8k の RAM を搭載した Arduino を使用し、TFT ディスプレイもプリンターも備えておらず、機械的解像度はわずか 3° でした。当時、私は単純deltasに、任意の合計範囲内にあることと、単一のデルタがどれだけ大きくなるかの制限を選択することをテストしました. 私の120点以上のテストは、以前の30点のテストに比べて高級感がありますが、そのテストはこれらの低下については知りませんでした.