Hi,
I'm developing an embedded project using some of the code in
FluidSynth.
The target is an ARM Cortex M4 and am using integer math. Most of
the coefficients are in Q15 format.
So far, I'm able to generate different notes with sound font files
and use some of the CMSIS DSP libraries to generate high order IIR
filters.
But I am having no luck with any interpolation routines. I ran some
tests using the command line version of FluidSynth on a laptop
running Ubuntu 14.
I created a sine wave sound font (using Swami) with a sample rate of
20050 Hz, root note is 86. It's looping over several cycles. The
image Midi_60_no_interpolation.jpg picture shows the result
with no interpolation (I get the exact same results on my embedded
platform). This is using "interp 0". (Note that the ringing is due
to the sinc function in the Codec filter/decimator.)
If I then set "interp 1", I get the image as shown in Midi_60_linear_interpolation.jpg
which is a major improvement.
I have reviewed the code inside fluid_voice_dsp.c and have
set up my program to emulate the equations. I converted the
floating point coefficients to Q15 format. It seems to do exactly
what it's supposed to do. Yet I see no improvement what-so-ever
except at higher note values.
However...I don't see how linear interpolation can work. If you
have straight lines (i.e. the "steps" in the first waveform), a
linear interpolation won't change anything since the current sample
and the next sample are the same over several samples.
Are you up-sampling before you to do the linear interpolation? I
didn't see any evidence in the code. Or do you simply take the loop
sample as is and step through it using dsp_phase_index? I don't
think the bi-quad post filter has an effect since it has a very high
cut-off. Nor should the reverb or chorus blocks have any effect
(since they're disabled anyway in my test).
What am I missing?
Thanks for your time and consideration. Any advice or insight is
appreciated. I really like FluidSynth.
Brad Stewart
P.S. I also implemented the 4th order interpolation but it didn't
change anything--I still get the "stepped" waveform. (At 50MHz
clock, the M4 can process 128 samples in <1uS with sound fonts
stored in internal Flash memory. Pretty impressive.)