当前位置:   article > 正文

嵌入式常用滤波算法_chebyshev filter c

chebyshev filter c

嵌入式系统中,信号处理是一个关键的方面,特别是在处理来自各种传感器的数据时。滤波算法在这方面发挥着重要作用,用于去除噪声、平滑数据或提取有用的信号。以下是一些在嵌入式系统中常用的滤波算法:

1 低通滤波器(Low-Pass Filter)

用途:去除高频噪声,只允许低频信号通过。
示例:简单的RC低通滤波器、数字低通滤波器。

double lowPassFilter(double input, double prevOutput, double alpha) {
    // alpha: 过滤系数,越小过滤越强
    return alpha * input + (1 - alpha) * prevOutput;
}

  • 1
  • 2
  • 3
  • 4
  • 5

这个简单的数字低通滤波器使用一个过滤系数 alpha 来平衡新输入值和上一个输出值的权重。alpha 值越小,滤波作用越强。

2 高通滤波器(High-Pass Filter)

用途:去除低频噪声,只允许高频信号通过。
示例:RC高通滤波器、数字高通滤波器。

double highPassFilter(double input, double prevInput, double prevOutput, double alpha) {
    // alpha: 过滤系数,与低通相反
    return alpha * (prevOutput + input - prevInput);
}

  • 1
  • 2
  • 3
  • 4
  • 5

这个高通滤波器的实现与低通类似,但它更注重于高频信号,通过减去前一个输入来实现。

3 带通滤波器(Band-Pass Filter)

用途:只允许特定频率范围的信号通过,去除其他频率的信号。
示例:结合低通和高通滤波器。

// 先定义低通和高通滤波器
// ...

double bandPassFilter(double input, double *highPassState, double *lowPassState, double alpha) {
    double highPassOutput = highPassFilter(input, highPassState[0], highPassState[1], alpha);
    highPassState[0] = input; // 更新高通状态
    highPassState[1] = highPassOutput;

    double lowPassOutput = lowPassFilter(highPassOutput, lowPassState[0], alpha);
    lowPassState[0] = lowPassOutput; // 更新低通状态

    return lowPassOutput;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

带通滤波器允许特定频率范围的信号通过。在这个例子中,信号首先经过高通滤波器,然后经过低通滤波器。

4 带阻滤波器(Band-Stop Filter)

用途:阻止特定频率范围的信号,允许其他频率的信号通过。
示例:通常用于消除特定频率的干扰,如50/60 Hz的电源噪声。
实现带阻滤波器比较复杂,通常需要结合带通滤波器和其他逻辑,或使用更高级的滤波技术,如IIR或FIR滤波器设计。

5 均值滤波器(Mean Filter)

用途:通过计算数据窗口的平均值来平滑数据。
示例:简单移动平均、累积移动平均。

double meanFilter(double *inputArray, int arrayLength) {
    double sum = 0.0;
    for (int i = 0; i < arrayLength; i++) {
        sum += inputArray[i];
    }
    return sum / arrayLength;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

均值滤波器通过计算数据窗口的平均值来平滑数据。这里的 inputArray 包含了一系列的输入值,arrayLength 是数组的长度。

6 中值滤波器(Median Filter)

用途:通过取数据窗口的中值来平滑数据,对于消除脉冲噪声特别有效。
示例:特别适用于处理具有随机噪声的信号。

#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

double medianFilter(int *inputArray, int arrayLength) {
    qsort(inputArray, arrayLength, sizeof(int), compare);
    if (arrayLength % 2 == 0) {
        return (inputArray[arrayLength / 2 - 1] + inputArray[arrayLength / 2]) / 2.0;
    } else {
        return inputArray[arrayLength / 2];
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

中值滤波器通过取一组数值的中位数来去除噪声。这个例子中使用了 qsort 函数对数组进行排序,然后取中位数。

7 卡尔曼滤波器(Kalman Filter)

用途:一种高效的递推滤波器,用于估计线性动态系统的状态。
示例:广泛应用于机器人导航、自动驾驶车辆、航天器轨道估计等。

typedef struct {
    double q; // 过程噪声协方差
    double r; // 测量噪声协方差
    double x; // 估计值
    double p; // 估计误差协方差
    double k; // 卡尔曼增益
} KalmanState;

void kalmanUpdate(KalmanState *state, double measurement) {
    // 预测
    state->p = state->p + state->q;

    // 更新
    state->k = state->p / (state->p + state->r);
    state->x = state->x + state->k * (measurement - state->x);
    state->p = (1 - state->k) * state->p;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这个简化的卡尔曼滤波器用于单变量数据。它包括一个预测步骤和一个更新步骤。

8 巴特沃斯滤波器(Butterworth Filter)

用途:提供最大平坦度的频率响应,没有纹波。
示例:用于需要平滑频率响应的应用。
巴特沃斯滤波器的设计通常涉及复杂的数字信号处理技术,如IIR滤波器设计。在C语言中实现这一点通常需要使用专门的DSP库。

9 切比雪夫滤波器(Chebyshev Filter)

用途:在通带或阻带中有一个可调的纹波。
示例:当需要更陡的截止斜率时使用。
与巴特沃斯滤波器类似,切比雪夫滤波器的设计也是相当复杂的,通常需要使用专门的数字信号处理库。

10 傅立叶变换(Fourier Transform)

用途:将时间域信号转换为频域信号,用于频率分析和滤波设计。
示例:快速傅立叶变换(FFT)在数字信号处理中非常常见。

#include <fftw3.h>

void applyFFT(double *in, double *out, int n) {
    fftw_plan plan = fftw_plan_r2r_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_execute(plan);
    fftw_destroy_plan(plan);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个例子展示了如何使用FFTW库进行一维FFT变换。需要安装FFTW库并包含适当的头文件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/236775
推荐阅读
相关标签
  

闽ICP备14008679号