[sdiy] Digital interpolation filtering
Tom Wiltshire
tom at electricdruid.net
Sat May 30 16:29:48 CEST 2009
Hi All,
Following on from my query about getting two dsPICs talking to each
other, it looks like I'm going to use the codec interface to send six
channels of modulation data from one chip to the other. I'll probably
use the audio uP as the master running at 62.5KHz, and request one
modulation channel's data per sample.
Eg:
1st audio sample, mod ch1 sample 1
2nd audio sample, mod ch2 sample 1
3rd audio sample, mod ch3 sample 1
4th audio sample, mod ch4 sample 1
5th audio sample, mod ch5 sample 1
6th audio sample, mod ch6 sample 1
7th audio sample, mod ch1 sample 2
8th audio sample, mod ch2 sample 2
9th audio sample, mod ch3 sample 2
etc etc
Now, I'm wondering if I can't use a simple digital interpolation
filter to fill in the missing samples for each modulation channel -
upsample the modulation to 62.5KHz.
I'm having a go at getting my head around this on my computer before
I go anywhere near any assembly language. Upsampling isn't that
processor intensive, since most of the samples are zeros (all the
ones inbetween) and can therefore be ignored. A filter of 31 taps
only actually gets 6 genuine samples (max), so only 6 MACs are
required to calculate the whole filter. This kind of efficiency seems
too good to miss.
I've never done digital filtering before though, and I've got some
questions;
Am I better off with an odd or even number of taps? Odd seems more
logical somehow, since there is a "middle" sample, but I'm really
just going on a gut feeling.
What's the value of the sinc function at zero? sin(x)/x is a division
by zero so doesn't give a sensible value, and I never saw a filter
that could handle a coefficient of infinity. How do people cope with
this?
Are there are any good tools or tutorials for this stuff? I'm looking
for something really practical and implementation based. Equations
with complex numbers in are no use to me yet, even if they are the
underlying theory.
How do I work out what the hell the cutoff of the filter is from the
coefficients? I've got two variables in the code that builds the
coefficients. One controls the frequency (width) of the raised cosine
window, and the other controls the frequency of the sinc function (eg
sin(fx)/fx).
Any clues, pointers or ideas appreciated. I'm well out of my depth here!
Thanks,
Tom (not waving, but drowning!)
More information about the Synth-diy
mailing list