Thanks for the response. I'm using LabVIEW 7.1, so I'm pretty sure that the default behavior for convolution.vi is to do frequency-domain convolution. Is that incorrect? Is the frequency-domain convolution VI you just sent me more efficient than the default version?
I'm already performing the overlap-and-add step which is the basis of the continuous-convolution VI included in your last message, so I'm basically already using your first suggestion. I imagine I could improve the efficiency slightly if I performed the Fourier transform on the kernel only once rather than each time a chunk of data is filtered, but I don't think that would yield substantial savings, since FFT is O(n log n) in the size of the input, and the kernel I'm using (about 1000 taps) is an order of magnitude shorter than the data signal I'm using(about 16000 samples for each application of the filter).
The real issue is that IIR filtering seems to run about 5-10 times faster than FIR filtering. While your second suggestion would certainly work, my intuition is that it would be little faster than your first suggestion since it depends on FIR filtering for the second step. Notably (but not surprisingly), the speed of frequency-domain convolution is not substantially affected by changing the number of taps in the kernel. I've included a simple little VI which does both FIR (Parks-McClellan) and IIR (Chebyshev) filter. By profiling the operation of this VI, you can see the disparity in running time between FIR and IIR filtering.
At the point, double-IIR filtering seems like the best option. I haven't tested it yet, but I would think that the transients would moslty die out after a number of samples beyond the end of a data chunk comparable to the order of the filter. Given that I only need a 7th-order Chebyshev filter to get a good frequency response curve, I think I should be able to do some black magic to smooth over the transitions between data blocks in real time.
However, I'm concerned that actually time-reversing a signal after filtering will require me to copy the signal from one location to another, and thus will take a long time in LabVIEW. Does Reverse 1D Array work in some clever way that doesn't require actually moving the data? To avoid this problem, I figure I can just reimplement IIR Cascade Filter.vi and modify it to read the array backwards rather than forwards. Does this sound reasonable?
Jason Rolfe