|
原帖子在这里:
谁能帮我看一段150行C语言滤波算法,红包酬谢 (amobbs.com 阿莫电子论坛)
当然了,算法内容我没有看,直接看了12楼说的话自己写了一个,写了两个版本:C#和C++(C)fszhang/MV_Filter (github.com)
数值变化检测以当前值的10%波动为阈值。
Unity做的显示在这里:
Unity制作加权滑动平均算法演示_哔哩哔哩_bilibili
- void DataAVG(byte dataIndex, byte *AVG_Times, uint32_t dataTab[], uint32_t *dataIn, uint32_t *dataLast)
- {
- byte i, dataPosition;
- uint32_t Sum;
- uint32_t PID_Data, PID_DataCurrent, Margin;
- dataTab[dataIndex] = PID_DataCurrent = *dataIn;
- for (i = 0, Sum = 0; i < *AVG_Times; i++)
- {
- if (dataIndex >= i)
- dataPosition = (byte)(dataIndex - i);
- else
- dataPosition = (byte)(AVG_DataTabCount + dataIndex - i);
- Sum += dataTab[dataPosition];
- }
- PID_Data = Sum / (*AVG_Times);
- Margin = PID_Data / 10;
- if (((PID_DataCurrent > (PID_Data + Margin)) && (*dataLast > (PID_Data + Margin))) ||
- (((PID_DataCurrent + Margin) < PID_Data) && ((*dataLast + Margin) < PID_Data)))
- {
- *AVG_Times = 2;
- }
- else
- {
- if (*AVG_Times < AVG_DataTabCount)
- AVG_Times++;
- }
- *dataIn = PID_Data;
- *dataLast = PID_DataCurrent;
- }
复制代码- private void DataAVG(byte dataIndex, ref byte AVG_Times, ref UInt32[] dataTab, ref UInt32 dataIn, ref UInt32 dataLast)
- {
- byte i, dataPosition;
- UInt32 Sum;
- UInt32 PID_Data, PID_DataCurrent, Margin;
- dataTab[dataIndex] = PID_DataCurrent = dataIn;
- for (i = 0, Sum = 0; i < AVG_Times; i++)
- {
- if (dataIndex >= i)
- dataPosition = (byte)(dataIndex - i);
- else
- dataPosition = (byte)(AVG_DataTabCount + dataIndex - i);
- Sum += dataTab[dataPosition];
- }
- PID_Data = Sum / (AVG_Times);
- Margin = PID_Data / 10;
- if (((PID_DataCurrent > (PID_Data + Margin)) && (dataLast > (PID_Data + Margin))) ||
- (((PID_DataCurrent + Margin) < PID_Data) && ((dataLast + Margin) < PID_Data)))
- {
- AVG_Times = 2;
- }
- else
- {
- if (AVG_Times < AVG_DataTabCount)
- AVG_Times++;
- }
- dataIn = PID_Data;
- dataLast = PID_DataCurrent;
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|