Example #1
0
        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);
        }
Example #2
0
        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);
        }