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

有帮助吗?

解决方案

维基百科:

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

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

其他提示

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

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

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

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

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

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

过滤描述了对数据中不同频率应用不同级别的衰减的处理数据的行为。

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

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

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

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

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

滤波器的行为通过滤波器系数的选择来确定。

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

下面是一个超级简单的 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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top