Revision 26:13568f1ccff0 CepstrumPitchTracker.cpp

View differences:

CepstrumPitchTracker.cpp
22 22

  
23 23
#include "CepstrumPitchTracker.h"
24 24

  
25
#include "vamp-sdk/FFT.h"
26

  
25 27
#include <vector>
26 28
#include <algorithm>
27 29

  
......
530 532
    magmean /= hs;
531 533
    double threshold = 0.1; // for magmean
532 534
    
533
    fft(bs, true, logmag, 0, rawcep, io);
535
    Vamp::FFT::inverse(bs, logmag, 0, rawcep, io);
534 536
    
535 537
    delete[] logmag;
536 538
    delete[] io;
......
649 651
    }
650 652
    return fs;
651 653
}
652

  
653
void
654
CepstrumPitchTracker::fft(unsigned int n, bool inverse,
655
                          double *ri, double *ii, double *ro, double *io)
656
{
657
    if (!ri || !ro || !io) return;
658

  
659
    unsigned int bits;
660
    unsigned int i, j, k, m;
661
    unsigned int blockSize, blockEnd;
662

  
663
    double tr, ti;
664

  
665
    if (n < 2) return;
666
    if (n & (n-1)) return;
667

  
668
    double angle = 2.0 * M_PI;
669
    if (inverse) angle = -angle;
670

  
671
    for (i = 0; ; ++i) {
672
	if (n & (1 << i)) {
673
	    bits = i;
674
	    break;
675
	}
676
    }
677

  
678
    int table[n];
679

  
680
    for (i = 0; i < n; ++i) {
681
        m = i;
682
        for (j = k = 0; j < bits; ++j) {
683
            k = (k << 1) | (m & 1);
684
            m >>= 1;
685
        }
686
        table[i] = k;
687
    }
688

  
689
    if (ii) {
690
	for (i = 0; i < n; ++i) {
691
	    ro[table[i]] = ri[i];
692
	    io[table[i]] = ii[i];
693
	}
694
    } else {
695
	for (i = 0; i < n; ++i) {
696
	    ro[table[i]] = ri[i];
697
	    io[table[i]] = 0.0;
698
	}
699
    }
700

  
701
    blockEnd = 1;
702

  
703
    for (blockSize = 2; blockSize <= n; blockSize <<= 1) {
704

  
705
	double delta = angle / (double)blockSize;
706
	double sm2 = -sin(-2 * delta);
707
	double sm1 = -sin(-delta);
708
	double cm2 = cos(-2 * delta);
709
	double cm1 = cos(-delta);
710
	double w = 2 * cm1;
711
	double ar[3], ai[3];
712

  
713
	for (i = 0; i < n; i += blockSize) {
714

  
715
	    ar[2] = cm2;
716
	    ar[1] = cm1;
717

  
718
	    ai[2] = sm2;
719
	    ai[1] = sm1;
720

  
721
	    for (j = i, m = 0; m < blockEnd; j++, m++) {
722

  
723
		ar[0] = w * ar[1] - ar[2];
724
		ar[2] = ar[1];
725
		ar[1] = ar[0];
726

  
727
		ai[0] = w * ai[1] - ai[2];
728
		ai[2] = ai[1];
729
		ai[1] = ai[0];
730

  
731
		k = j + blockEnd;
732
		tr = ar[0] * ro[k] - ai[0] * io[k];
733
		ti = ar[0] * io[k] + ai[0] * ro[k];
734

  
735
		ro[k] = ro[j] - tr;
736
		io[k] = io[j] - ti;
737

  
738
		ro[j] += tr;
739
		io[j] += ti;
740
	    }
741
	}
742

  
743
	blockEnd = blockSize;
744
    }
745
}
746

  
747

  

Also available in: Unified diff