Tim Goetze <[EMAIL PROTECTED]> writes: > [Hans Fugal] > >>I'm about to write a DSSI/LADSPA plugin that among other things, detunes >>the signal by up to 15 cents. My understanding is that detuning is >>accomplished by resampling. If that's the case, what do you do >>with the time difference? Do you pad/truncate to get the same number of >>samples you started out with? Wouldn't that introduce undesirables? > > It would. As far as I know, there are two common ways to do this: > > You can periodically window and granulate the signal, resample the > grains and resynthesize -- that's the faster way, doing it all in the > time domain. You'll get some comb filtering from the time-stretched > phase cancelling out during grain overlap, but if you're only doing 15 > cent, it might turn out just fine. There's a library out there that > does this, I can't seem to remember its name though. Anyone?
Probably libSoundTouch? > The other way I know of is to use a phase vocoder. Basically, you > periodically window and granulate and then FFT the signal, do a bit of > math on the frequency content and resynthesize. The phase vocoder > keeps track of signal phase so the comb filtering effect is no issue. > The downside is the FFT and the math required to compute phase and > amplitude; it's quite a bit heavier on the CPU. Some code that does it > this way is at quitte.de/dsp/pvoc.html but for your intended use I'd > first look at the simpler solution mentioned above. I'd like to suggest this article: http://www.dspdimension.com/data/html/pshiftstft.html It is wonderfully detailed, includes all the necessary C source code to take the basic idea and make it fly. I used this method to write my instrument tuner by ripping out the last phase of the algorithm (resynthesis) and only using the exact frequency peak info. Its pretty useful, and I learned a lot from this article. Actually, I think thats the single most useful DSP tutorial I've ever read. It made me really grok FFT, which is something by its own right :-) Oh, and it is pretty simple to make this stuff work with libfftw3, just read tuneit.c (http://delysid.org/tuneit.html). -- CYa, Mario
