什么是高通和低通滤波器?

Posted

技术标签:

【中文标题】什么是高通和低通滤波器?【英文标题】:What Are High-Pass and Low-Pass Filters? 【发布时间】:2010-09-07 07:46:51 【问题描述】:

图形和音频编辑和处理软件通常包含称为“高通滤波器”和“低通滤波器”的功能。这些到底是做什么的,实现它们的算法是什么?

【问题讨论】:

【参考方案1】:

这是一个超级简单的 C++ 低通滤波器示例,它一次处理一个样本的信号:

float lopass(float input, float cutoff) 
 lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output;
return(lo_pass_output);

这几乎是一样的,除了它是高通:

float hipass(float input, float cutoff) 
 hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0]));
 outputs[0]=hi_pass_output;
 return(hi_pass_output);

【讨论】:

我正在尝试您的代码,但我不明白“截止”的含义。不是以赫兹为单位的截止频率吗? 答案已经有将近十年的历史了,但是我仍然认为应该计算的不是“输出[0]”,而是之前过滤的样本值。 相关:dsp.stackexchange.com/questions/39063/…【参考方案2】:

以下是使用卷积实现低通滤波器的方法:

double[] signal = (some 1d signal);
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter
double[] result = new double[signal.Length + filter.Length + 1];

// Set result to zero:
for (int i=0; i < result.Length; i++) result[i] = 0;

// Do convolution:
for (int i=0; i < signal.Length; i++) 
  for (int j=0; j < filter.Length; j++)
    result[i+j] = result[i+j] + signal[i] * filter[j];

请注意,该示例非常简化。它不进行范围检查,也不正确处理边缘。使用的滤波器(box-car)是一个特别糟糕的低通滤波器,因为它会导致很多伪影(振铃)。阅读过滤器设计。

您还可以在频域中实现过滤器。以下是使用 FFT 实现高通滤波器的方法:

double[] signal = (some 1d signal);
// Do FFT:
double[] real;
double[] imag;
[real, imag] = fft(signal)

// Set the first quarter of the real part to zero to attenuate the low frequencies
for (int i=0; i < real.Length / 4; i++) 
  real[i] = 0;

// Do inverse FFT:
double[] highfrequencysignal = inversefft(real, imag);

同样,这是简化的,但你明白了。代码看起来不像数学那么复杂。

【讨论】:

拥有代码示例非常酷。为什么在一种情况下使用卷积而在另一种情况下使用 FFT? @dfrankow 没有特别的原因。只是为了展示它在不同域中的外观。更新了文本以反映这一点。谢谢。 你确定你的答案的第一部分是正确的,你使用矩形函数在时域中应用卷积吗?我认为时域中的低通滤波器需要 sinc 函数的卷积? boxcar 滤波器(矩形函数)确实是一个非常糟糕的低通滤波器。 sinc 滤波器更好。【参考方案3】:

过滤描述了以对数据中的不同频率应用不同程度的衰减的方式处理数据的行为。

高通滤波器将对高频应用最小衰减(即保持电平不变),但对低频应用最大衰减。

低通滤波器是相反的——它不会对低频应用衰减,而是对高频应用衰减。

使用了许多不同的过滤算法。最简单的两个可能是有限脉冲响应滤波器(又名 FIR 滤波器)和无限脉冲响应滤波器(又名 IIR 滤波器)。

FIR 滤波器的工作原理是保留一系列样本并将每个样本乘以一个固定系数(该系数基于序列中的位置)。这些乘法中的每一个的结果都会被累加,并且是该样本的输出。这被称为乘法累加 - 在专用 DSP 硬件中,有一个特定的 MAC 指令来执行此操作。

当采集下一个样本时,它会被添加到系列的开头,并删除系列中最旧的样本,并重复该过程。

滤波器的行为由滤波器系数的选择决定。

图像处理软件通常提供的最简单的过滤器之一是平均过滤器。这可以通过将所有滤波器系数设置为相同值的 FIR 滤波器来实现。

【讨论】:

【参考方案4】:

高通过滤器让高频(详细/本地信息)通过低通 过滤器让-频率(粗略/粗略/全局信息)通过

【讨论】:

【参考方案5】:

它们通常是倾向于传递部分模拟信号的电路。高通倾向于传递更多的高频部分,而低通倾向于传递更多的低频部分。

它们可以在软件中进行模拟。例如,行走平均值可以用作低通滤波器,行走平均值与其输入之间的差值可以用作高通滤波​​器。

【讨论】:

【参考方案6】:

***:

High-pass filter Low-pass filter Band-pass filter

这些“高”、“低”和“频带”术语指的是频率。在高通中,您尝试去除低频。在低通中,您尝试去除高。在带通中,您只允许保留一个连续的频率范围。

选择截止频率取决于您的应用。对这些滤波器进行编码既可以通过模拟 RC 电路来完成,也可以通过对基于时间的数据进行傅里叶变换来完成。有关代码示例,请参阅***文章。

【讨论】:

以上是关于什么是高通和低通滤波器?的主要内容,如果未能解决你的问题,请参考以下文章

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

图像的滤波与增强

一阶rc低通滤波器公式是啥?

Android 低通滤波器和高通滤波器

scipy.signal.firwin 低通滤波器的作用类似于高通滤波器

OpenCV 完整例程84. 由低通滤波器得到高通滤波器