写一段滤波的c语言算法
时间: 2023-05-25 14:03:53 浏览: 78
以下是一个简单的低通滤波器的 C 语言实现:
#define LEN 100 // 输入数据数组大小
#define FC 20 // 截止频率
float input[LEN]; // 输入数据数组
float output[LEN]; // 输出数据数组
void lowpass_filter(float *input, float *output, float fc, int len) {
float dt = 1.0 / SAMPLE_RATE; // 采样时间
float alpha = 1 / (2 * PI * fc * dt + 1); // 滤波器系数
output[0] = input[0]; // 初始化
for (int i = 1; i < len; i++) {
output[i] = alpha * input[i] + (1 - alpha) * output[i-1]; // 滤波器算法
}
}
// 调用函数
lowpass_filter(input, output, FC, LEN);
相关问题
写一段数字滤波算法 C语言
代码,可以实现平均滤波、中值滤波和高斯滤波。
以下是C语言实现平均滤波、中值滤波和高斯滤波的代码示例:
// 平均滤波
float avg_filter(float* data, int len)
{
float sum = 0.0;
for (int i = 0; i < len; i++)
{
sum += data[i];
}
return sum / len;
}
// 中值滤波
float median_filter(float* data, int len)
{
float tmp;
int i, j, k;
for (i = 0; i < len - 1; i++)
{
k = i;
for (j = i + 1; j < len; j++)
{
if (data[k] > data[j])
{
k = j;
}
}
if (k != i)
{
tmp = data[i];
data[i] = data[k];
data[k] = tmp;
}
}
return data[len / 2];
}
// 高斯滤波
float gaussian_filter(float* data, int len)
{
float sum = 0.0;
for (int i = 0; i < len; i++)
{
sum += data[i];
}
float avg = sum / len;
sum = 0.0;
for (int i = 0; i < len; i++)
{
sum += (data[i] - avg) * (data[i] - avg);
}
float std_dev = sqrt(sum / len);
sum = 0.0;
for (int i = 0; i < len; i++)
{
sum += data[i] * exp(-(data[i] - avg) * (data[i] - avg) / (2 * std_dev * std_dev));
}
return sum / len;
}
// 调用示例
void main()
{
float data[] = {1.2, 2.4, 5.6, 7.8, 5.5};
int len = sizeof(data) / sizeof(data[0]);
float result;
// 平均滤波
result = avg_filter(data, len);
printf("平均滤波结果:%.2f\n", result);
// 中值滤波
result = median_filter(data, len);
printf("中值滤波结果:%.2f\n", result);
// 高斯滤波
result = gaussian_filter(data, len);
printf("高斯滤波结果:%.2f\n", result);
}
用C语言写一段卡尔曼滤波算法
以下是一个简单的卡尔曼滤波算法的C语言实现:
```c
#include <stdio.h>
#define Q 0.1 // 过程噪声方差
#define R 0.1 // 测量噪声方差
float kalman_filter(float z, float *x, float *p)
{
// 预测
float x_predict = *x;
float p_predict = *p + Q;
// 更新
float k = p_predict / (p_predict + R);
*x = x_predict + k * (z - x_predict);
*p = (1 - k) * p_predict;
return *x;
}
int main()
{
float z = 2.0; // 测量值
float x = 1.0; // 初始状态估计
float p = 0.1; // 初始估计误差方差
printf("Kalman filter result: %f\n", kalman_filter(z, &x, &p));
return 0;
}
```
在该示例中,我们设置了过程噪声方差和测量噪声方差,然后定义了一个`kalman_filter`函数,该函数接收当前测量值、当前状态估计和估计误差方差,并返回更新后的状态估计。
在`main`函数中,我们设置了初始状态估计和估计误差方差,并调用`kalman_filter`函数进行状态估计。
阅读全文