我想在我的iOS应用程序中实现这个公式。有没有办法用GLSL来加速这个公式。或者我能用脑力什么的来加速这个公式吗?
for (k = 0; k < imageSize; k++) {
imageOut[k] = imageOut[k-1] * a + imageIn[k] * b;
}
OpenCL不可用。
发布于 2015-01-10 12:48:52
正如Dietrich Epp已经指出的那样,你所拥有的是IIR过滤器。在一台计算机上,没有“不有限”这样的东西,你总是受到数字精度、内存、可用计算时间等的限制--即使你无限地执行这个循环,由于你典型的数字表示的精度有限,你会在很早就失去任何对舍入错误有意义的东西。
因此,让我们诚实地说,并调用一个FIR滤波器具有非常长的响应时间。这些可以并行化吗?是的,他们可以,但为此,我们必须离开时间域,并从频域来看它。
假设您可以对系统的响应(=filter)对所有可能的信号进行建模,然后“回放”基于信号的响应给出所需的输出。在频域中,这将是对覆盖所有频率的宽带信号的响应系统的“记录”。但这个信号只是一个简单的冲动。这就是FIR和IIR这两个词的中间位置。
任何应用系统对任意信号的脉冲响应的卷积方法,都会给出系统对信号本身的响应。然而,计算时域卷积与将信号的傅里叶变换与脉冲响应的傅里叶变换相乘,并将结果转化回来是一样的。
s * r = F^-1(F(s) · F(r))
傅立叶变换是可以很好地并行化的事情之一,GPU非常擅长于并行处理。
现在有基于GLSL的傅里叶变换代码,但通常这些代码是用OpenCL或CUDA编写的,以在GPU上运行。
不管怎么说,这是你的食谱:
确定IIR与FIR无法区分的截止k
。确定脉冲响应的傅里叶变换(=复谱响应,CSR)。傅里叶变换:信号(=图像)与CSR相乘,然后再进行变换。
发布于 2015-01-10 06:27:48
这是一个典型的IIR过滤器,当将其转换为SIMD代码时,数据依赖会造成问题。这意味着您不能将操作作为简单的转换反馈或呈现到纹理操作。换句话说,GPU被设计为并行处理一堆数据,但是您的公式强制按顺序计算输出(如果不首先计算out[k]
,就无法计算out[k-1]
)。
我看到了两种优化的方法:
不幸的是,没有很容易的翻译到GLSL。也许你可以用金属代替霓虹灯,我不确定。
https://stackoverflow.com/questions/27872530
复制相似问题