private void PitchShiftTDv(short[] datain, out short[] dataout) { var length = datain.Length; var fratio = FormantShiftRate; var newlen = (int)Math.Round(length / fratio); var temp = new double[newlen]; for (var i = 0; i < Math.Min(newlen, length); i++) { temp[i] = datain[i]; } var tempout = Stretch(temp, fratio, length); if (overlap == null) { overlap = new Overlap(kOverlapCount, length / kOverlapCount); } SetPrePostWindow(length); for (var i = 0; i < length; i++) { tempout[i] *= window[i]; } overlap.AddOverlap(ref tempout); dataout = ToShort(tempout, length); }
public void Process(short[] datain, out short[] dataout) { var length = datain.Length; var mBitRev = FHTArrays.GetBitRevTable(length); var mPreWindow = FHTArrays.GetPreWindow(length); var mPostWindow = FHTArrays.GetPostWindow(length); var hopanal = length / kOverlapCount; var hopsyn = (int)(hopanal * ShiftRate); var overlapCount = (int)Math.Ceiling((double)length / hopsyn); var temp = new double[length]; if (shiftChanged || mLastPhase == null || mLastPhase.Length != length / 2) { mLastPhase = new double[length / 2]; mSumPhase = new double[length / 2]; overlap = new Overlap(overlapCount, hopsyn); shiftChanged = false; } for (var i = 0; i < length; ++i) { var j = mBitRev[i]; var k = (uint)(j & (length - 1)); temp[i] = datain[k] * mPreWindow[k]; } double[] re, im; fht.ComputeFHT(temp, out re, out im); var temp_shift = new double[length]; AnalysisAndSynthesis(ref re, ref im); ifht.ComputeFHT(re, im, out temp_shift, false); temp = temp_shift; var window = FHTArrays.GetPostWindow(length); if (overlapCount >= kOverlapCount) { for (var i = 0; i < length; i++) { temp_shift[i] *= window[i] * shiftRate / 2; } } overlap.AddOverlap(ref temp_shift); temp = new double[hopsyn]; Array.Copy(temp_shift, temp, hopsyn); temp = Stretch(temp, 1 / ShiftRate, length); dataout = ToShort(temp, length); }