C语言 SG滤波平滑函数
时间: 2023-09-05 14:13:25 浏览: 169
下面是一个简单的 C 语言函数,可以实现 SG 平滑滤波:
```c
#include <stdio.h>
#define SIZE 11
#define ORDER 4
double sg_filter(double *x, int n, int m, int order)
{
int i, j, k;
double sum, a[SIZE][SIZE], b[SIZE], c[SIZE];
// 初始化矩阵
for (i = 0; i < m; i++) {
sum = 0;
for (j = 0; j < order + 1; j++) {
a[i][j] = sum;
sum += pow(i, j);
}
}
// 求解矩阵方程
for (i = 0; i < m; i++) {
b[i] = x[i];
}
for (k = 0; k < order + 1; k++) {
for (i = k + 1; i < order + 1; i++) {
c[i] = a[i][k] / a[k][k];
for (j = k + 1; j < order + 2; j++) {
a[i][j] -= c[i] * a[k][j];
}
b[i] -= c[i] * b[k];
}
}
for (i = order; i >= 0; i--) {
sum = b[i];
for (j = i + 1; j < order + 1; j++) {
sum -= a[i][j] * c[j];
}
c[i] = sum / a[i][i];
}
// 计算平滑后的数值
sum = 0;
for (i = 0; i < order + 1; i++) {
sum += c[i];
}
return sum;
}
int main()
{
double x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int n = sizeof(x) / sizeof(double);
int m = n - ORDER;
int i;
for (i = 0; i < m; i++) {
printf("%f\n", sg_filter(x + i, n, m, ORDER));
}
return 0;
}
```
其中,`x` 是输入的数据数组,`n` 是数组大小,`m` 是滤波后的数据点数,`order` 是 SG 滤波的阶数。函数 `sg_filter` 返回平滑后的数据点值。在 `main` 函数中,我们将输入数据点序列的每个子序列进行滤波,输出平滑后的数据点序列。
阅读全文