滑动滤波(或称为滑动平均滤波)常用于对数据进行平滑处理,以去除噪声并提高数据的稳定性。以触摸屏获取到的坐标点为例,每个坐标点包含 x
和 y
值,滑动滤波的过程是将某个点的值与其前后若干个邻近点的平均值替换,使得它们经过平滑处理后显得更加平滑。
#include <stdio.h>
#define WINDOW_SIZE 3 // 滑动窗口大小
// 滑动滤波函数
void movingAverageFilter(float *input, float *output, int dataSize, int windowSize) {
for (int i = 0; i < dataSize; i++) {
float sum = 0.0f;
int count = 0;
// 计算窗口内的平均值
for (int j = -windowSize / 2; j <= windowSize / 2; j++) {
int index = i + j;
if (index >= 0 && index < dataSize) {
sum += input[index];
count++;
}
}
output[i] = sum / count;
}
}
int main() {
// 示例输入数据:x坐标和y坐标
float x[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f};
float y[] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f};
int dataSize = sizeof(x) / sizeof(x[0]);
float smoothedX[dataSize];
float smoothedY[dataSize];
// 对x坐标进行滑动滤波
movingAverageFilter(x, smoothedX, dataSize, WINDOW_SIZE);
// 对y坐标进行滑动滤波
movingAverageFilter(y, smoothedY, dataSize, WINDOW_SIZE);
// 输出平滑后的坐标点
printf("Smoothed Points:\n");
for (int i = 0; i < dataSize; i++) {
printf("(%f, %f)\n", smoothedX[i], smoothedY[i]);
}
return 0;
}
说明:
-
WINDOW_SIZE:定义了滑动窗口的大小。窗口越大,平滑效果越明显,但可能会丢失一些细节。
-
movingAverageFilter:滑动滤波函数,对输入的数组进行滑动平均滤波,并将结果存储在输出数组中。
-
main:主函数中定义了一组示例的
(x, y)
坐标点,并调用滑动滤波函数对它们进行平滑处理,最后输出平滑后的坐标点。
注意事项:
-
滑动窗口的大小应根据实际需求进行调整。
-
对于边界点,代码中使用了条件判断来确保不会访问数组外的数据。
-
该代码仅适用于一维数据的滑动滤波,对于二维坐标点,分别对
x
和y
进行滤波处理。