[Haskell-cafe] Convolution
Andrew Coppin
andrewcoppin at btinternet.com
Fri Nov 7 17:11:10 EST 2008
A simple and straight-forward way to define the DSP operations of
correlation and convolution is as follows:
correlate1 :: [Double] -> [Double] -> Double
correlate1 ks = sum . zipWith (*) ks
correlate :: [Double] -> [Double] -> [Double]
correlate ks [] = []
correlate ks xs = correlate1 ks xs : correlate ks (tail xs)
convolute :: [Double] -> [Double] -> [Double]
convolute ks = correlate (reverse ks)
This very simple code work - and actually works quite well. It has the
nice property of generating output from input lazily, as it is demanded.
If the correlate function could be altered to use Prelude list functions
only, I would think the above code works quite well with stream fusion
too. (Presumably you could do this using "inits" or something?)
Assuming DPH ever becomes a reality, how would you implement the above
with it?
(My intuition tells me that unless you have a really *big* filter
kernel, breaking correlate1 into parallel chunks is too granular.
However, each call to correlate1 could be run independently, presumably
confering a more or less linear speedup. Unless having two cores writing
to the same memory page is going to upset the cache system...)
Presumably if you want to use parallel arrays, then the data must all
exist in memory at once, and any chunking must be implemented manually
and tediously?
More information about the Haskell-Cafe
mailing list