gpt4 book ai didi

c - 如何从连续数据中找到近似中位数?

转载 作者:行者123 更新时间:2023-12-02 01:50:01 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com