MCPcopy Create free account
hub / github.com/BespokeSynth/BespokeSynth / PitchDetector

Method PitchDetector

Source/PitchDetector.cpp:32–103  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

30#define L2SC (float)3.32192809488736218171
31
32PitchDetector::PitchDetector()
33{
34 mfs = gSampleRate;
35
36 mcbsize = 2048;
37 mcorrsize = mcbsize / 2 + 1;
38
39 mpmax = 1 / (float)70; // max and min periods (ms)
40 mpmin = 1 / (float)700; // eventually may want to bring these out as sliders
41
42 mnmax = (unsigned long)(gSampleRate * mpmax);
43 if (mnmax > mcorrsize)
44 {
45 mnmax = mcorrsize;
46 }
47 mnmin = (unsigned long)(gSampleRate * mpmin);
48
49 mcbi = (float*)calloc(mcbsize, sizeof(float));
50
51 mcbiwr = 0;
52
53 // Generate a window with a single raised cosine from N/4 to 3N/4
54 mcbwindow = (float*)calloc(mcbsize, sizeof(float));
55 for (int ti = 0; ti < (mcbsize / 2); ti++)
56 {
57 mcbwindow[ti + mcbsize / 4] = -0.5 * cos(4 * PI * ti / (mcbsize - 1)) + 0.5;
58 }
59
60 mnoverlap = 4;
61
62 mFFT = new ::FFT((int)mcbsize);
63
64 mffttime = (float*)calloc(mcbsize, sizeof(float));
65 mfftfreqre = (float*)calloc(mcorrsize, sizeof(float));
66 mfftfreqim = (float*)calloc(mcorrsize, sizeof(float));
67
68
69 // ---- Calculate autocorrelation of window ----
70 macwinv = (float*)calloc(mcbsize, sizeof(float));
71 for (int ti = 0; ti < mcbsize; ti++)
72 {
73 mffttime[ti] = mcbwindow[ti];
74 }
75 mFFT->Forward(mcbwindow, mfftfreqre, mfftfreqim);
76 for (int ti = 0; ti < mcorrsize; ti++)
77 {
78 mfftfreqre[ti] = (mfftfreqre[ti]) * (mfftfreqre[ti]) + (mfftfreqim[ti]) * (mfftfreqim[ti]);
79 mfftfreqim[ti] = 0;
80 }
81 mFFT->Inverse(mfftfreqre, mfftfreqim, mffttime);
82 for (long ti = 1; ti < mcbsize; ti++)
83 {
84 macwinv[ti] = mffttime[ti] / mffttime[0];
85 if (macwinv[ti] > 0.000001)
86 {
87 macwinv[ti] = (float)1 / macwinv[ti];
88 }
89 else

Callers

nothing calls this directly

Calls 2

ForwardMethod · 0.80
InverseMethod · 0.80

Tested by

no test coverage detected