[comp.dsp] Pitch Shifting

dean@image.soe.clarkson.edu (Dean Swan) (10/04/89)

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