信号处理是单片机应用中的一个重要环节,通过对输入信号的处理,可以提取和分析有用的信息,从而实现各种功能。其中,滤波和降噪是信号处理中常用的技术,本文将介绍单片机中常用的滤波和降噪方法。
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;
}
总结
滤波和降噪是单片机信号处理中常用的技术,可以提高信号处理的准确性和可靠性。本文介绍了单片机中常用的滤波和降噪方法,包括低通滤波、高通滤波、带通滤波、带阻滤波、均值滤波、中值滤波和加权滑动平均。根据实际应用需求,可以选择合适的滤波和降噪方法来处理输入信号,从而提高系统性能。
本文来自极简博客,作者:紫色迷情,转载请注明原文链接:单片机信号处理技术:滤波、降噪