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

27

图形和音频编辑处理软件通常包含名为“高通滤波器”和“低通滤波器”的功能。它们具体是做什么的,以及实现它们的算法是什么?

6个回答

31

这里是使用卷积实现低通滤波的方法:

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);

再次强调,这只是简化的描述,但你可以理解。代码看起来并不像数学那么复杂。


2
有代码示例非常酷。为什么一个情况下使用卷积,另一个情况下使用FFT? - dfrankow
2
@dfrankow 没有特别的原因。只是为了展示在不同领域中它的外观。已更新文本以反映这一点。谢谢。 - Hallgrim
你确定你的回答第一部分正确吗?在时间域中使用矩形函数进行卷积是正确的吗?我认为时间域中的低通滤波需要卷积一个sinc函数。 - stackoverflowuser2010
2
盒车滤波器(矩形函数)确实是一个非常糟糕的低通滤波器。Sinc滤波器更好。 - Hallgrim

22

维基百科:

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

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


7

这是一个超级简单的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);
}

4
我正在尝试您的代码,但我不理解 "cutoff" 代表什么意思。它是否代表赫兹的截止频率?请帮我澄清一下。 - fredrik.hjarner
1
答案已经有将近十年的历史了,但我仍然相信在计算时应该考虑到之前过滤的样本值,而不是"output[0]"。 - Mike
相关链接:https://dsp.stackexchange.com/questions/39063/simple-software-low-pass-filter - try-catch-finally

5
过滤(Filtering)是指以不同的衰减程度处理数据中的不同频率。高通滤波器会对高频信号施加最小的衰减(即不改变电平),但会对低频信号施加最大的衰减;低通滤波器则相反,它会对低频信号施加最小的衰减,但会对高频信号施加衰减。
有许多不同的过滤算法被使用。其中最简单的两种可能是有限脉冲响应滤波器(FIR滤波器)和无限脉冲响应滤波器(IIR滤波器)。
FIR滤波器通过保留一系列样本并将每个样本乘以一个固定系数(该系数基于序列中的位置)来工作。每个乘积的结果被累加,并成为该样本的输出。这被称为乘-累加操作,在专用的DSP硬件中,有一个特定的MAC指令可以执行此操作。
当取下一个样本时,它被添加到序列的开头,序列中最旧的样本被移除,然后重复该过程。
滤波器的行为由滤波器系数的选择确定。
图像处理软件通常提供的最简单的滤波器之一是平均滤波器。这可以通过将所有滤波器系数设置为相同的值来实现FIR滤波器。

5

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

它们可以在软件中模拟。例如,移动平均可以作为低通滤波器,而移动平均与其输入之间的差异可以作为高通滤波器。


5

高通滤波器可以让高频(详细/局部信息)通过
低通滤波器可以让低频(粗糙/全局信息)通过


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接