Re: Gaussian blur kernels

Fabian Giesen <[email protected]>
Newsgroups gmane.games.devel.algorithms
Message-ID <[email protected]>
Fabian Giesen wrote:
>> Fabian also mentioned Multirate Filter Banks -- in the audio case, the 
>> equivalent is the polyphase filter AFAICR, and that's used quite heavily 
>> in real time, because it actually saves cycles compared to first 
>> filtering and then decimating. I think a properly implemented multirate 
>> filter in a pixel shader might actually give you very good bang for the 
>> cycle buck!
> 
> The basic idea behind polyphase filters is that you're doing 
> downsample(conv(a,b),2), where conv(a,b) is the convolution of a and b 
> and downsample is the "elementary" downsample operator (point sampling - 
> just throw away every second sample). So since you're ignoring every 
> second sample generated by your gaussian filter anyway, there's not much 
> point computing it in the first place. The math behind polyphase filters 
> are the specifics of how to do just that. [..]

And, after thinking about this some more on the way home: you shouldn't 
care :).

To elaborate: most of the math in signal processing deals with signals 
as a whole. This gives you a whole bunch of very powerful tools and 
notations (Convolutions, Fourier Transforms, z Transform) but makes some 
basic sample-by-sample operations such as downsampling (or decimating as 
it's usually called in DSP) a bit inconvenient in terms of notation. The 
whole polyphase filter stuff is mainly about writing the relevant index 
shuffling down in a concise and neat way so you can "bubble up" 
convolutions.

However, all of this is a non-issue in graphics. Pixel shaders give you 
cheap pointwise evaluations at no cost. If you want only every second 
pixel, then render a quad half the size in each direction.

In short, the optimal "polyphase" implementation of a 5x5 Gaussian 
followed by a 2:1 downsample in both directions is just to render to the 
smaller rendertarget directly with the 5x5 Gaussian Pixel shader and the 
correct texture coordinates.

So all you have to do is use that pixelshader instead of a cheap 
one-texture-sample pixelshader that uses the bilinear filtering HW to 
average groups of 2x2 pixels together.

It's more expensive though, and if you want a quarter of the size in 
each direction, you *do* have to do this twice - or, alternatively, use 
a larger gaussian during downsampling.

Cheers,
-Fabian "ryg" Giesen

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
GDAlgorithms-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.