C语言实现二阶Savitzky - Golay滤波器算法:完整代码及注意事项
下面是一个用C语言实现的二阶Savitzky - Golay滤波器算法的完整代码: ```c #include <stdio.h> #include <stdlib.h> // 二阶Savitzky - Golay滤波器函数 void savitzky_golay_filter(double *input, int n, int window_size, double *output) { // 检查窗口大小是否为奇数 if (window_size % 2 == 0) { printf("窗口大小必须为奇数!\n"); return; } // 计算窗口半径 int half_window = window_size / 2; // 二阶Savitzky - Golay滤波器系数 double sg_coeffs[] = { -3.0 / 35.0, 12.0 / 35.0, 17.0 / 35.0, 12.0 / 35.0, -3.0 / 35.0 }; // 对每个数据点应用滤波器 for (int i = 0; i < n; i++) { double sum = 0.0; int count = 0; // 遍历窗口内的数据点 for (int j = -half_window; j <= half_window; j++) { int index = i + j; // 边界处理 if (index >= 0 && index < n) { sum += input[index] * sg_coeffs[j + half_window]; count++; } } // 输出滤波后的值 output[i] = sum; } } int main() { // 示例输入数据 double input[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; int n = sizeof(input) / sizeof(input[0]); int window_size = 5; // 分配输出数组的内存 double *output = (double *)malloc(n * sizeof(double)); if (output == NULL) { printf("内存分配失败!\n"); return 1; } // 应用Savitzky - Golay滤波器 savitzky_golay_filter(input, n, window_size, output); // 输出滤波后的数据 printf("滤波后的数据:\n"); for (int i = 0; i < n; i++) { printf("%f\n", output[i]); } // 释放分配的内存 free(output); return 0; } ``` 代码说明: 1. `savitzky_golay_filter` 函数实现了二阶Savitzky - Golay滤波器的核心逻辑。它接受输入数组 `input`、数组长度 `n`、窗口大小 `window_size` 和输出数组 `output` 作为参数。 2. 在函数内部,首先检查窗口大小是否为奇数,若不是则输出错误信息并返回。 3. 计算窗口半径 `half_window`,并定义二阶Savitzky - Golay滤波器的系数。 4. 对输入数组的每个数据点,遍历窗口内的数据点,进行边界处理,计算加权和,并将结果存储在输出数组中。 5. `main` 函数中,定义了示例输入数据,分配输出数组的内存,调用 `savitzky_golay_filter` 函数进行滤波,输出滤波后的数据,最后释放分配的内存。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 窗口大小必须为奇数,否则滤波器的计算会出现问题。 2. 在处理边界数据时,要确保不会越界访问数组。 3. 动态分配内存时,要检查内存分配是否成功,避免因内存分配失败导致程序崩溃。 ######[AI写代码神器 | 893点数解答 | 2025-08-13 10:00:56]
- Verilog 实现 8 位无符号二阶 7 点Savitzky - Golay 光谱曲线平滑滤波及注意要点 (字节豆包 | 404点数解答 | 2025-05-14 16:28:03)166
- 基于 Savitzky - Golay 滤波的光谱曲线处理:计算红边位置、幅值与面积(讯飞星火 | 927点数解答 | 2024-11-13 13:10:27)594
- Python 实现 Savitzky - Golay 滤波的详细过程及注意要点(字节豆包 | 319点数解答 | 2024-12-20 14:16:01)204
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)362
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)207
- C++ 实现完整斗地主:含洗牌、发牌与手牌展示,可按需扩展!(字节豆包 | 1028点数解答 | 2026-01-10 08:02:37)47
- Verilog 实现二次多项式 Savitzky - Golay 滤波:代码示例、解释与注意要点(字节豆包 | 829点数解答 | 2025-07-29 09:52:39)115
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)333
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)191
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)298
- Java 实现矩形与长方体类,轻松计算底面积和体积(字节豆包 | 308点数解答 | 2024-10-20 10:34:27)280
- Java 实现矩形与长方体类:计算底面积与体积的完整代码示例(字节豆包 | 306点数解答 | 2024-10-20 18:34:47)279