图形和音频编辑和处理软件通常包含称为“高通滤波器”和“低通滤波器”的功能。这些到底是做什么的,实现它们的算法是什么?
发布于 2008-08-30 00:58:00
维基百科:
这些“高”、“低”和“频带”术语指的是频率。在高通模式下,你要试着去除低频。在低传球中,你试着去掉高。在带通中,您只允许保留一个连续的频率范围。
选择截止频率取决于您的应用程序。编码这些滤波器可以通过模拟RC电路或玩弄基于时间的数据的傅立叶变换来完成。有关代码示例,请参阅wikipedia文章。
发布于 2008-09-17 12:07:00
下面是如何使用卷积实现低通滤波器:
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);
同样,这是简化的,但您可以理解其中的含义。代码看起来并不像数学那样复杂。
发布于 2008-08-30 00:59:58
它们通常是倾向于传递部分模拟信号的电路。高通倾向于传输更多的高频部分,而低通倾向于传递更多的低频部分。
它们可以在软件中模拟。例如,步进平均值可以用作低通滤波器,而步进平均值与其输入之间的差可以用作高通滤波器。
https://stackoverflow.com/questions/35530
复制相似问题