本帖最后由 jerry尧 于 2025-8-10 18:36 编辑
高通滤波器(High-Pass Filter, HPF)是一种允许高频信号通过,同时衰减或阻断低频信号的电子电路或数字信号处理算法。 1. 基本原理高通滤波器的核心思想是抑制低频分量,保留高频分量。其频率响应特性如下: 2. 类型(1) 模拟高通滤波器由电阻(R)、电容(C)、电感(L)等模拟元件构成,常见类型: 一阶RC高通滤波器:
最简单的形式,由电阻和电容组成,传递函数为: H(s)=sRC1+sRCH(s)=1+sRCsRC 二阶/高阶滤波器:
如巴特沃斯(Butterworth)、切比雪夫(Chebyshev)等,提供更陡峭的滚降特性。
(2) 数字高通滤波器通过数字算法实现,常见方法: 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. 应用场景
|