如何在 C++ 中测量这个区域?
(更新:我发布了解决方案和代码作为答案,而不是再次编辑问题)
理想线(红色虚线)是从起点绘制的图,每个测量角度加上平均上升;这是我通过平均获得的。我用黑色测量了测试数据。如何量化蓝色倾角的面积?X 轴是统一的,因此简化了斜率和数学。
我可以确定像这样的区域大小的截止值,然后标记这部分以进行重新测试或失败。很少会出现更靠近右侧的另一个下降,但为标准偏差设置截止值通常会使这些部分失效。
更新
迭戈的回答帮助我形象化了这一点。现在我可以看到我正在尝试做什么,我将研究实现“自制倾角检测器”的算法。:)
为什么?
我创建了一个测试台来测试我正在销售的节气门位置传感器。我试图通过分析收集的数据以编程方式量化绘图的直接程度。这个特殊的模型让我很烦恼。
我不想出售的零件的示例图:
X 轴是等距的节气门开度角。步进电机转动输入轴,每 0.75° 停止以测量 10 位 ADC 上的输出,该输出被转换到 Y 轴。该图是映射到位图坐标的data[idx]
转换。然后我使用 Bresenham 算法在位图中的点之间画线。idx,value
(x,y)
我的其他 TPS 产品产生惊人的线性输出。
地块的下(左)部分对于任何机动车辆的正常使用都至关重要;这是当你在城里开车、进入停车场等时。这个特定的部分倾向于在 15° 开口附近形成一个倾角,我希望使用该程序来量化曲线中的这种“倾角”并减少依赖测试者的直觉。在上面的例子中,情节下降但没有回到理想的线。
即使这是一个嵌入式应用程序,打印报告也需要 10 秒,因此我不认为多次单步执行 120 个数据点的数组会浪费周期。另外,由于我使用的是uC32 PIC32 微控制器,内存很大,所以我可以在控制器中思考这个问题。
我已经在尝试什么
测试点之间的上升阵列:我完全忽略了 X 轴,考虑到它是一体的,然后从一个读数到下一个读数进行一系列更改。该数组有助于报告的“点之间的最小上升:0 最大:14”。我称这个数组deltas。
我尝试在 上使用标准偏差deltas,但是,在测试期间,我发现低标准偏差不是这部分的可靠衡量标准。如果下降很快回到早期数据点所暗示的原始线,则标准偏差可能会很低(观察到低至 2.3),但该部分仍然是我不想使用的部分。我尝试将截止值设置为 2.6,但它失败了太多部分,情节很好。与上述相关的另一个更线性的部分可以可靠地依赖 Std Dev 的质量。
峰度似乎根本不适用于这种情况。我今天了解了峰度,并找到了一个统计库,其中包括峰度和偏度。在继续测试的过程中,我发现在这两个测量中,没有对应于通过或失败的正、负或幅度趋势。同一位先生共享了一个线性回归库,但我相信 Lin Reg 与我的情况无关,因为我对 AVGdeltas作为我的理想线的假设感到满意。线性回归和 R^2 更适合从不太理想的数据或更大的集合中找到一条线。
将每个 delta 与 AVG 和 Std Dev 进行比较,我设置了一个监视器来检查每个 delta 与deltas的数据的最终平均值。在这里,我也找不到可靠的指标。太多好的零件无法通过将任何 delta 限制在距离平均值 2 倍 Std Dev 之内的测试。最终,我可以确定的与 AVG 的唯一差异是AVG+Std Dev
与 AVG 本身的差异。任何更具限制性的东西都会失败,否则好的部分。大约 15° 开口的难以捉摸的倾角可以通过这个测试。
自制dip检测器给电脑的串口监视器供电deltas时,我观察到deltasdip期间连续出现负值,所以我在dip检测器中编程,但对我来说感觉很粗糙。如果连续有 5 个或更多负数deltas,我将它们相加。我已经看到,如果我将这个总和与 AVG 的下降差异除以负增量的数量,超过 2.9 或 3 的值可能意味着失败。我观察到持续 6 到 15 个三角洲的下降。容易观察到的下降与 AVG 总和的差异将达到 -35。
与 AVG 相比的趋势累积变化上述内容让我认为,deltas当它偏离 AVG 时,观察其总和可能是答案。意思是,我逐步遍历数组并将每个增量与 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';
}
...
}
然后一个具有奇妙线性图的部分出现了 58 个数据点,sumOfDiffs
是 AVG 的两倍多!我觉得这很神奇,因为在 ~120 个数据点的末尾,sumOfDiffs
值为 -0.000057。
在测试期间,最终sumOfDiffs
结果通常会记录为 0.000000,并且只有在异常糟糕的零件上才会大于 0.000100。实际上,我发现这非常令人惊讶:“坏部分”如何积累很高的准确性。
监控 sumOfDiffs 的示例输出下面的输出显示发生了下降。在整个测试中,运行sumOfDiffs
距离 AVG 的 2 倍以上的 AVG 是测试的结果。这种下降从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在任意总范围内进行测试,并选择任何单个增量可能有多大的限制。与之前的 30 点测试相比,我的 120+ 点测试感觉很高级,但该测试不知道这些下降。