Krotos Modules 3
Loading...
Searching...
No Matches
Autocorrelation.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 SpectralAutocorrelation.cpp
5 Created: 9 Nov 2016 2:48:10pm
6 Author: KrotosMacMini
7
8 ==============================================================================
9*/
10#include "Autocorrelation.h"
11
13
14krotos::Autocorrelation::Autocorrelation(double newSampleRate, int newBufferSize)
15{
16 initialise(newSampleRate, newBufferSize);
17}
18
20
21void krotos::Autocorrelation::initialise(double newSampleRate, int newBufferSize)
22{
23 sampleRate = newSampleRate;
24 bufferSize = newBufferSize;
25
26 // set up the buffers
27 autocorrelationBuffer.resize(bufferSize);
28 smoothedAutocorrelation.resize(bufferSize);
29 audioFrame.resize(newBufferSize);
30 // create the hanningz window
31 window.resize(bufferSize);
32
33 for (int i = 0; i < bufferSize; ++i)
34 {
35 window[i] = static_cast<float>(0.5 * (1.0 - std::cos(TWO_PI * double(i) / double(bufferSize))));
36 autocorrelationBuffer[i] = 0.0f;
37 smoothedAutocorrelation[i] = 0.0f;
38 }
39}
40
41float krotos::Autocorrelation::getPitch(AudioSampleBuffer buffer)
42{
43 // window the input
44 for (int i = 0; i < buffer.getNumSamples(); ++i)
45 {
46 audioFrame[i] = buffer.getSample(0, i) * window[i];
47 }
48
49 // Simple Autocorrelation
50 getAutocorrelation(audioFrame);
51
52 // Smooth it out (w/ coeff. alpha = 0.9)
53 smoothingFilter(autocorrelationBuffer, 0.9f);
54
55 // and find the minimum
56 float tmp = smoothedAutocorrelation[0];
57 position = -1;
58
59 for (int i = 0; i < bufferSize; ++i)
60 {
61 if (smoothedAutocorrelation[i] < tmp)
62 {
63 tmp = smoothedAutocorrelation[i];
64 position = i;
65 }
66 }
67
68 pitchEstimate = -1.0f;
69 tauEstimate = -1.0f;
70
71 if (position < 1)
72 {
73 pitchEstimate = -1;
74 // std::cout << "F0 = " << pitchEstimate << "Hz" <<std::endl;
75 return pitchEstimate;
76 }
77 else if (position == bufferSize - 1)
78 {
79 tauEstimate = 2.f * float(position);
80 pitchEstimate = float(sampleRate) / tauEstimate;
81 // std::cout << "F0 = " << pitchEstimate << "Hz" <<std::endl;
82 return pitchEstimate;
83 }
84 else
85 {
86 tauEstimate = 2 * getParabolicInterpolation(position);
87 pitchEstimate = float(sampleRate) / tauEstimate;
88 // std::cout << "F0 = " << pitchEstimate << "Hz" <<std::endl;
89 return pitchEstimate;
90 }
91}
92
94{
95
96 for (int tau = 0; tau < 0.5 * bufferSize; ++tau)
97 {
98 float sum = 0.0f;
99 for (int index = 0; index < 0.5 * bufferSize; ++index)
100 {
101 sum += data[index] * data[index + tau];
102 }
103 autocorrelationBuffer[tau] = sum / bufferSize;
104 }
105}
106
107void krotos::Autocorrelation::smoothingFilter(std::vector<float> in, float coefficient)
108{
109 smoothedAutocorrelation[0] = in[0];
110 for (int i = 1; i < bufferSize; ++i)
111 {
112 smoothedAutocorrelation[i] =
113 smoothedAutocorrelation[i - 1] + coefficient * (in[i] - smoothedAutocorrelation[i - 1]);
114 }
115}
116
118{
119 float previous = autocorrelationBuffer[tauEstimation - 1];
120 float current = autocorrelationBuffer[tauEstimation];
121 float next = autocorrelationBuffer[tauEstimation + 1];
122
123 float divisor = next + previous - 2 * current;
124 float newEstimation;
125 if (divisor == 0.0f)
126 {
127 newEstimation = float(tauEstimation);
128 }
129 else
130 {
131 newEstimation = float(tauEstimation) + (previous - next) / (2 * divisor);
132 }
133 return newEstimation;
134}
~Autocorrelation()
Definition Autocorrelation.cpp:19
const double DEFAULT_SAMPLE_RATE
Definition Autocorrelation.h:32
void getAutocorrelation(std::vector< float > data)
Definition Autocorrelation.cpp:93
float getParabolicInterpolation(int estimation)
Definition Autocorrelation.cpp:117
void initialise(double newSampleRate, int newBufferSize)
Definition Autocorrelation.cpp:21
const int MAX_BUFFER_SIZE
Definition Autocorrelation.h:26
void smoothingFilter(std::vector< float > input, float coefficient)
Definition Autocorrelation.cpp:107
float getPitch(AudioSampleBuffer buffer)
Definition Autocorrelation.cpp:41
Autocorrelation()
Definition Autocorrelation.cpp:12