Kri*_*son 26 photoshop algorithm audio graphics signal-processing
图形和音频编辑和处理软件通常包含称为"高通滤波器"和"低通滤波器"的功能.究竟是做什么的,以及实现它们的算法是什么?
Hal*_*rim 29
以下是使用卷积实现低通滤波器的方法:
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];
Run Code Online (Sandbox Code Playgroud)
请注意,该示例非常简化.它不进行范围检查,也不能正确处理边缘.使用的滤波器(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);
Run Code Online (Sandbox Code Playgroud)
同样,这是简化的,但你明白了.代码看起来并不像数学那么复杂.
下面是一个超级简单的 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);
}
Run Code Online (Sandbox Code Playgroud)
这几乎是同样的事情,除了它是高通的:
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);
}
Run Code Online (Sandbox Code Playgroud)
它们通常是电路,倾向于传递部分模拟信号.高通倾向于传输更多的高频部分,低通趋向于传递更多的低频部分.
它们可以用软件模拟.例如,步行平均可以充当低通滤波器,并且步行平均值与其输入之间的差异可以用作高通滤波器.
过滤描述了以对数据内的不同频率应用不同级别的衰减的方式处理数据的行为.
高通滤波器将对高频应用最小的衰减(即保持电平不变),但对低频应用最大衰减.
低通滤波器是相反的 - 它通过对高频应用衰减而不对低频应用衰减.
使用了许多不同的过滤算法.两个最简单的可能是有限脉冲响应滤波器(又称FIR滤波器)和无限脉冲响应滤波器(又称IIR滤波器).
FIR滤波器通过保持一系列采样并将每个采样乘以固定系数(基于系列中的位置)来工作.累加每个乘法的结果,并且是该样本的输出.这被称为乘法累加 - 在专用DSP硬件中有一个特定的MAC指令用于这样做.
当下一个样本被添加到系列的开头时,系列中最旧的样本被删除,并重复该过程.
通过选择滤波器系数来固定滤波器的行为.
图像处理软件通常提供的最简单的滤波器之一是平均滤波器.这可以通过FIR滤波器通过将所有滤波器系数设置为相同值来实现.
归档时间: |
|
查看次数: |
82761 次 |
最近记录: |