Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!rpi!image.soe.clarkson.edu!dean From: dean@image.soe.clarkson.edu (Dean Swan) Newsgroups: comp.dsp Subject: Re: Pitch Shifting Message-ID: <1989Oct3.170307.9734@sun.soe.clarkson.edu> Date: 3 Oct 89 17:03:07 GMT References: <4521@internal.Apple.COM> Sender: dean@sun.soe.clarkson.edu (Dean Swan) Organization: Clarkson University, Potsdam, NY Lines: 54 Well, I have been having a miserable time trying to get this file to post, so if anyone gets this, let me know. -Dean > In article <1989Sep25.172140.27543@sun.soe.clarkson.edu> dean@image.soe.clarkson.edu (Dean Swan) writes: >> Assume that your input is of the form: >> Y=Sin( F*A ) > >> Then F = ArcSin(Y)/A >> Next do F=F+pitch shift amount > ^^^ > That should be a * ! a * ! a * ! > >> and reconstruct with Y=Sin(F*A). Forget I ever said this. I did the math, and it only works right for sine waves. I use the angular frequency analysis (the F=arcSin(y)/A) iteratively to decompose an input wave into parameters for an F.M. based synthesis system. I also remove the amplitude envelope and adjust the (instantaneous) DC offset to 0 at each step of the way. Also, since the arcSin is NOT a function, the actual number that makes sense is usually at Y + n*2*pi where n is an arbitrary integer. Anyway, I don't think this is useful for real time pitch shifting. The rate conversion filter is probably the "best" way I can think of, and in fact, the table with two pointers is a simplification of that filter anyway. One thing that might be worth thinking about though, if you've got the bandwidth to do it is taking the inverse FFT of a high pass filtered cepstrum, pitch shifting it, and pumping it through a transversal filter with an impulse response that is the inverse FFT of the same cepstrum , but low pass filter the cepstrum first. Ok, so I'm running on here... My point is to separate the excitation function from the system function before pitch shifting, and re-applying the system function after pitch shifting. This would preserve the formants of the input, and avoid (or at least lessen the severity of) the MM/DV (Mickey Mouse/Darth Vader) effect. Also, removing the amplitude envelope after separating the system function and re-applying it before re-applying the system function would be a good idea. This should give just about the best pitch shifter possible, although it would be a bit cpu intensive. The sound generation model that I'm assuming here is: excitation function -> system function -> output (oscillator) (filter) Any takers? -Dean Swan dean@sun.soe.clarkson.edu