单片机信号处理技术:滤波、降噪

紫色迷情 2020-08-21 ⋅ 25 阅读

信号处理是单片机应用中的一个重要环节,通过对输入信号的处理,可以提取和分析有用的信息,从而实现各种功能。其中,滤波和降噪是信号处理中常用的技术,本文将介绍单片机中常用的滤波和降噪方法。

1. 信号滤波

信号滤波用于去除输入信号中的噪声或不需要的频率。常见的信号滤波方法包括低通滤波、高通滤波、带通滤波和带阻滤波。

1.1 低通滤波

低通滤波器将高于一定频率的信号组分滤除,只保留低于该频率的信号。它常用于去除高频噪声。

单片机中实现低通滤波的方法有多种,例如:

// 一阶低通滤波
#define ALPHA 0.1
float lastValue = 0.0;
float lowPassFilter(float inputValue)
{
    float filteredValue = lastValue + ALPHA * (inputValue - lastValue);
    lastValue = filteredValue;
    return filteredValue;
}

1.2 高通滤波

高通滤波器将低于一定频率的信号组分滤除,只保留高于该频率的信号。它常用于去除低频噪声。

单片机中实现高通滤波的方法也有多种,下面演示一个简单的一阶高通滤波器:

// 一阶高通滤波
#define ALPHA 0.1
float lastValue = 0.0;
float highPassFilter(float inputValue)
{
    float filteredValue = ALPHA * (lastValue + inputValue - lastValue);
    lastValue = filteredValue;
    return inputValue - filteredValue;
}

1.3 带通滤波

带通滤波器可以选择保留某一频率范围内的信号,而滤除其他频率的信号。它通常用于只关注某一个特定频率范围内的信号。

带通滤波器的实现比较复杂,常用的方法是将一个低通滤波器和一个高通滤波器级联使用。下面演示一个二阶带通滤波器的实现:

// 二阶带通滤波
#define ALPHA 0.1
float lastValue[2] = {0.0, 0.0};
float bandPassFilter(float inputValue)
{
    float filteredValue = ALPHA * (inputValue - lastValue[1]) + lastValue[0];
    lastValue[0] = filteredValue;
    lastValue[1] = inputValue;
    return filteredValue;
}

1.4 带阻滤波

带阻滤波器可以选择滤除某一频率范围内的信号,而保留其他频率的信号。它通常用于去除某一个特定频率范围内的噪声。

带阻滤波器的实现也较为复杂,常用的方法是将一个低通滤波器和一个高通滤波器级联使用。下面演示一个二阶带阻滤波器的实现:

// 二阶带阻滤波
#define ALPHA 0.1
float lastValue[2] = {0.0, 0.0};
float notchFilter(float inputValue, float notchFrequency)
{
    float omega = 2 * M_PI * notchFrequency;
    float alpha = sin(omega) / 2;
    float b0 = 1 - alpha;
    
    float filteredValue = ALPHA * (b0 * inputValue - lastValue[1]) - ALPHA * b0 * lastValue[0];
    lastValue[0] = filteredValue;
    lastValue[1] = inputValue;
    return filteredValue;
}

2. 降噪

单片机中的降噪技术主要是通过滤波来实现的,不同于上面介绍的信号滤波技术,降噪主要是针对噪声信号的消除。

2.1 均值滤波

均值滤波器是一种简单的降噪方法,它将输入信号的一段时间内的采样值求平均,从而平滑信号并消除噪声。

// 均值滤波
#define BUFFER_SIZE 8
float buffer[BUFFER_SIZE] = {0.0};
float meanFilter(float inputValue)
{
    float sum = 0.0;
    for (int i = BUFFER_SIZE-1; i > 0; i--)
    {
        buffer[i] = buffer[i-1];
        sum += buffer[i];
    }
    buffer[0] = inputValue;
    sum += buffer[0];
    
    return sum / BUFFER_SIZE;
}

2.2 中值滤波

中值滤波器将输入信号的一段时间内的采样值排序,然后取中间值作为输出,从而消除噪声。

// 中值滤波
#define BUFFER_SIZE 8
float buffer[BUFFER_SIZE] = {0.0};
float medianFilter(float inputValue)
{
    for (int i = BUFFER_SIZE-1; i > 0; i--)
    {
        buffer[i] = buffer[i-1];
    }
    buffer[0] = inputValue;
    
    // 冒泡排序
    for (int i = 0; i < BUFFER_SIZE-1; i++)
    {
        for (int j = 0; j < BUFFER_SIZE-i-1; j++)
        {
            if (buffer[j] > buffer[j+1])
            {
                float temp = buffer[j];
                buffer[j] = buffer[j+1];
                buffer[j+1] = temp;
            }
        }
    }
    
    return buffer[BUFFER_SIZE/2];
}

2.3 加权滑动平均

加权滑动平均是一种将最新的采样值更多地纳入计算的滤波方法,从而更加灵敏地响应信号变化。

// 加权滑动平均
#define ALPHA 0.1
float lastValue = 0.0;
float weightedMovingAverage(float inputValue)
{
    float filteredValue = (1 - ALPHA) * lastValue + ALPHA * inputValue;
    lastValue = filteredValue;
    return filteredValue;
}

总结

滤波和降噪是单片机信号处理中常用的技术,可以提高信号处理的准确性和可靠性。本文介绍了单片机中常用的滤波和降噪方法,包括低通滤波、高通滤波、带通滤波、带阻滤波、均值滤波、中值滤波和加权滑动平均。根据实际应用需求,可以选择合适的滤波和降噪方法来处理输入信号,从而提高系统性能。


全部评论: 0

    我有话说: