作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Arduino 构建一个设备来检测环境噪声的变化,并用 C 语言编写。
因为声音传感器每秒都会给我一个声级,所以在不存储所有连续数据的情况下如何找到近似中值?确定当前环境噪声水平发生变化的最佳方法是什么?
最佳答案
听起来你想要的叫做移动中位数(与 moving average 非常相似)。这就是当您需要将最后 n
值存储在数组中并计算中位数时。
这就是它的样子:
int data[5] = {0, 0, 0, 0, 0};
int dataI = 0;
int sortedData[5] = {0, 0, 0, 0, 0};
void pushNewData(int d) {
data[dataI] = d;
dataI++;
if(dataI > 4) {
dataI = 0;
}
}
int median() {
for(int i = 0; i < 5; i++) {
sortedData[i] = data[i];
}
// Use a sorting algorithm here to sort sortedData
return sortedData[3];
}
另一方面,如果您想获得数百小时数据的中位数,则必须存储每个数据值。如果这是您的用例,我强烈建议您使用平均值。由于平均值只是sum/n
,因此您只能有两个变量并将其相加。当然,您必须考虑溢出。
假设您仍然想要一个中位数(例如,如果您担心数据不对称或担心异常值)。在这种情况下,您可以轻松构建直方图并使用它估计中位数。
您可以通过创建一个整数数组来完成此操作。索引 0 代表值 0-5
,索引 2 代表值 6-10
,依此类推。 (每个值范围的大小会根据您的设置而有所不同。)每次出现新的数据点时,您都会检查该点属于哪个“桶”(值范围),并且会增加该数组中相应的计数器。
可以很容易地根据这些数据估算出中位数。假设您提取了以下数据:
Values 00-05: 1
Values 06-10: 7
Values 11-15: 8
Values 16-20: 2
Values 21-25: 1
Values 26-30: 5
由于 n = 24,中位数将为 n=12。第 12 个数据点将在 11-15
范围内,因此中位数将在 11 到 15 之间。
您可以轻松地使用 3 或 1 的范围来实现相同的效果,而不是 5 的范围。只需要注意溢出和内存使用:除了确保不要使用太多存储桶之外,您还应该使用无符号长整型数组。
关于c - 如何从连续数据中找到近似中位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511623/
我是一名优秀的程序员,十分优秀!