[嵌入式C编程与固件开发] 软件高通滤波器

[复制链接]
jerry尧 发表于 2025-8-10 18:33 | 显示全部楼层 |阅读模式
本帖最后由 jerry尧 于 2025-8-10 18:36 编辑

高通滤波器(High-Pass Filter, HPF)是一种允许高频信号通过,同时衰减或阻断低频信号的电子电路或数字信号处理算法。
1. 基本原理
高通滤波器的核心思想是抑制低频分量,保留高频分量。其频率响应特性如下:
  • 低频段:增益接近0(信号被衰减)。
  • 高频段:增益接近1(信号通过)。
  • 截止频率(fcfc​):定义滤波器开始显著衰减低频信号的频率点(通常为-3dB点)。


2. 类型(1) 模拟高通滤波器
由电阻(R)、电容(C)、电感(L)等模拟元件构成,常见类型:
  • 一阶RC高通滤波器:
    最简单的形式,由电阻和电容组成,传递函数为:
    H(s)=sRC1+sRCH(s)=1+sRCsRC​
  • 二阶/高阶滤波器:
    如巴特沃斯(Butterworth)、切比雪夫(Chebyshev)等,提供更陡峭的滚降特性。

(2) 数字高通滤波器
通过数字算法实现,常见方法:
  • IIR(无限脉冲响应)滤波器:
    利用递归差分方程,如用双线性变换将模拟滤波器转换为数字形式。
  • FIR(有限脉冲响应)滤波器:
    通过卷积实现,线性相位特性,但计算量较大。


3. 设计方法(1) 模拟设计
  • 截止频率公式:
    fc=12πRCfc​=2πRC1​
    选择R和C的值即可确定fc。

(2) 数字设计

1. 一阶RC高通滤波器(数字实现)
#define ALPHA 0.1f  // 滤波系数(0 < ALPHA < 1),值越小滤波效果越强
float highPassFilter(float input, float prev_input, float prev_output)
{
    return ALPHA * prev_output + ALPHA * (input - prev_input);
}

// 使用示例
float filtered_value = 0;
float last_input = 0;
float last_output = 0;

void processSample(float new_sample)
{
    filtered_value = highPassFilter(new_sample, last_input, last_output);
    last_input = new_sample;
    last_output = filtered_value;
}
2. IIR高通滤波器实现
// 二阶IIR高通滤波器
typedef struct
{
    float b0, b1, b2;  // 分子系数
    float a1, a2;       // 分母系数
    float x1, x2;       // 输入延迟
    float y1, y2;       // 输出延迟
} IIRHighPassFilter;

void initHighPassFilter(IIRHighPassFilter* filter, float cutoffFreq, float sampleRate)
{
    float omega = 2.0f * M_PI * cutoffFreq / sampleRate;
    float sin_omega = sinf(omega);
    float cos_omega = cosf(omega);
    float alpha = sin_omega / (2.0f * 0.707f);  // 0.707为Q因子
   
    float b0 = (1.0f + cos_omega) / 2.0f;
    float b1 = -(1.0f + cos_omega);
    float b2 = b0;
    float a0 = 1.0f + alpha;
    float a1 = -2.0f * cos_omega;
    float a2 = 1.0f - alpha;
   
    // 归一化系数
    filter->b0 = b0 / a0;
    filter->b1 = b1 / a0;
    filter->b2 = b2 / a0;
    filter->a1 = a1 / a0;
    filter->a2 = a2 / a0;
   
    // 初始化延迟
    filter->x1 = 0;
    filter->x2 = 0;
    filter->y1 = 0;
    filter->y2 = 0;
}

float processHighPass(IIRHighPassFilter* filter, float input)
{
    float output = filter->b0 * input + filter->b1 * filter->x1 + filter->b2 * filter->x2
                   - filter->a1 * filter->y1 - filter->a2 * filter->y2;
   
    // 更新延迟
    filter->x2 = filter->x1;
    filter->x1 = input;
    filter->y2 = filter->y1;
    filter->y1 = output;
   
    return output;
}
3. FIR高通滤波器实现
#define FIR_TAP_NUM 32  // 滤波器阶数
typedef struct
{
    float taps[FIR_TAP_NUM];
    float buffer[FIR_TAP_NUM];
    int index;
} FIRHighPassFilter;

void initFIRHighPass(FIRHighPassFilter* filter, float cutoffFreq, float sampleRate)
{
    // 简单的FIR高通滤波器系数计算(Hamming窗)
    float fc = cutoffFreq / sampleRate;
    for(int n = 0; n < FIR_TAP_NUM; n++) {
        int m = n - (FIR_TAP_NUM - 1)/2;
        if(m == 0) {
            filter->taps[n] = 1.0f - 2.0f * fc;
        } else {
            filter->taps[n] = -sinf(2.0f * M_PI * fc * m) / (M_PI * m)
                             * (0.54f - 0.46f * cosf(2.0f * M_PI * n / (FIR_TAP_NUM - 1)));
        }
    }   
    // 初始化缓冲区
    for(int i = 0; i < FIR_TAP_NUM; i++) {
        filter->buffer = 0;
    }
    filter->index = 0;
}

float processFIRHighPass(FIRHighPassFilter* filter, float input)
{
    filter->buffer[filter->index] = input;
   
    float output = 0;
    int sum_index = filter->index;
   
    for(int i = 0; i < FIR_TAP_NUM; i++) {
        output += filter->taps * filter->buffer[sum_index];
        sum_index--;
        if(sum_index < 0) sum_index = FIR_TAP_NUM - 1;
    }
   
    filter->index++;
    if(filter->index >= FIR_TAP_NUM) filter->index = 0;
   
    return output;
}


4. 应用场景
  • 音频处理:去除低频噪声(如嗡嗡声)。
  • 图像处理:边缘检测(如使用Sobel、Laplacian算子本质上是高通滤波)。
  • 生物信号处理:ECG信号中去除基线漂移。
  • 通信系统:抑制低频干扰。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部