怎么用C语言写出二阶低通滤波还有卡尔曼滤波代码?给我详细的代码
时间: 2024-04-15 08:28:44 浏览: 84
低通滤波器c语言实现
4星 · 用户满意度95%
当然可以!下面是使用 C 语言编写二阶低通滤波器和卡尔曼滤波器的代码示例:
1. 二阶低通滤波器代码:
```c
#include <stdio.h>
#define SAMPLE_RATE 1000.0 // 采样率
#define CUTOFF_FREQ 50.0 // 截止频率
typedef struct {
double x[3]; // 输入信号历史样本
double y[3]; // 输出信号历史样本
} FilterState;
void initFilter(FilterState* filterState) {
for (int i = 0; i < 3; i++) {
filterState->x[i] = 0.0;
filterState->y[i] = 0.0;
}
}
double lowPassFilter(double input, FilterState* filterState) {
double RC = 1.0 / (2.0 * 3.141592 * CUTOFF_FREQ);
double dt = 1.0 / SAMPLE_RATE;
double alpha = dt / (dt + RC);
filterState->x[2] = filterState->x[1];
filterState->x[1] = filterState->x[0];
filterState->x[0] = input;
filterState->y[2] = filterState->y[1];
filterState->y[1] = filterState->y[0];
filterState->y[0] = (alpha * (filterState->x[0] + filterState->x[2])) + (2.0 * alpha * filterState->x[1]) - (alpha * filterState->y[2]);
return filterState->y[0];
}
int main() {
FilterState filterState;
initFilter(&filterState);
// 模拟输入信号
double inputSignal[] = {1.0, 2.0, 3.0, 4.0, 5.0};
int numSamples = sizeof(inputSignal) / sizeof(inputSignal[0]);
// 应用滤波器并输出结果
for (int i = 0; i < numSamples; i++) {
double filteredSignal = lowPassFilter(inputSignal[i], &filterState);
printf("Input: %lf, Output: %lf\n", inputSignal[i], filteredSignal);
}
return 0;
}
```
2. 卡尔曼滤波器代码:
```c
#include <stdio.h>
typedef struct {
double x; // 状态变量
double P; // 状态协方差矩阵
} KalmanState;
void initKalman(KalmanState* kalmanState) {
kalmanState->x = 0.0;
kalmanState->P = 1.0;
}
double kalmanFilter(double measurement, KalmanState* kalmanState) {
double Q = 0.01; // 过程噪声协方差
double R = 0.1; // 测量噪声协方差
// 预测步骤
double x_priori = kalmanState->x;
double P_priori = kalmanState->P + Q;
// 更新步骤
double K = P_priori / (P_priori + R);
kalmanState->x = x_priori + K * (measurement - x_priori);
kalmanState->P = (1 - K) * P_priori;
return kalmanState->x;
}
int main() {
KalmanState kalmanState;
initKalman(&kalmanState);
// 模拟测量数据
double measurements[] = {1.0, 1.1, 1.2, 1.3, 1.4};
int numMeasurements = sizeof(measurements) / sizeof(measurements[0]);
// 应用滤波器并输出结果
for (int i = 0; i < numMeasurements; i++) {
double filteredValue = kalmanFilter(measurements[i], &kalmanState);
printf("Measurement: %lf, Filtered Value: %lf\n", measurements[i], filteredValue);
}
return 0;
}
```
这些代码分别实现了二阶低通滤波器和卡尔曼滤波器。你可以根据自己的需求修改采样率、截止频率、过程噪声和测量噪声等参数,并将输入信号或测量数据替换为你自己的数据进行测试。希望对你有帮助!如果有任何问题,请随时提问。
阅读全文