Krotos Modules 3
Loading...
Searching...
No Matches
TimeDomainAnalysisFramework.cpp
Go to the documentation of this file.
1//=====================================================================================
7//=====================================================================================
8
10// #include "Utilities.h"
11
12//=====================================================================================
14 : m_rmsCalculated(false), m_rmsValue(0), m_energyDifferenceCalculated(false), m_previousEnergyDifferenceValue(0),
15 m_signalFrameSize(analysisFrameSize)
16{
17 jassert(sampleRate > 0);
18 setSamplingFrequency(sampleRate);
20}
21
22//=====================================================================================
23void krotos::TimeDomainAnalysisFramework::setSamplingFrequency(int fs) { m_samplingFrequency = fs; }
24
25//=====================================================================================
27{
28 m_pitchTrackerMcLeod.initialise(static_cast<double>(m_samplingFrequency), m_signalFrameSize);
29 m_pitchTrackerAutocorrelation.initialise(static_cast<double>(m_samplingFrequency), m_signalFrameSize);
30}
31
32//=====================================================================================
34{
35 jassert(m_samplingFrequency > -1); // Sampling frequency has not been set to a valid value
36 return m_samplingFrequency;
37}
38
39//=====================================================================================
41{
42 m_signalFrame = timeFrame;
43
44 // You need to instantiate the class with the same analysisFrameSize as the
45 // input signalFrame jassert(m_signalFrame.size() == m_signalFrameSize);
46
47 // Set flags indicating whether features have been calculated to false
48 m_energyDifferenceCalculated = false;
49 m_rmsCalculated = false;
50
51 m_rmsValue = getRMS();
52
53 // m_pitchMcLeod = m_pitchTrackerMcLeod.getPitch(m_signalFrame);
54
55 // AudioSampleBuffer tempBuf(1, m_signalFrameSize);
56 // tempBuf.copyFrom(0, 0, m_signalFrame.data(), m_signalFrameSize);
57 // m_pitchAutocorrelation = m_pitchTrackerAutocorrelation.getPitch(tempBuf);
58}
59
60//=====================================================================================
62{
63 float maxVal = 0.0;
64
65 for (int i = 0; i < m_signalFrame.size(); i++)
66 {
67 float value = fabsf(m_signalFrame[i]);
68
69 if (value > maxVal)
70 {
71 maxVal = value;
72 }
73 }
74
75 return maxVal;
76}
77
78//=====================================================================================
80
81//=====================================================================================
82float krotos::TimeDomainAnalysisFramework::getPitchAutocorrelation() { return m_pitchAutocorrelation; }
83
84//=====================================================================================
86{
87 if (m_rmsCalculated)
88 {
89 return m_rmsValue;
90 }
91 else
92 {
93 float sumOfSquares = 0;
94
95 for (int i = 0; i < m_signalFrame.size(); i++)
96 {
97 sumOfSquares += m_signalFrame[i] * m_signalFrame[i];
98 }
99
100 float meanValue = sumOfSquares / (float)m_signalFrameSize;
101
102 m_rmsValue = sqrtf(meanValue);
103
104 m_rmsCalculated = true;
105
106 return m_rmsValue;
107 }
108}
109
110//=====================================================================================
112{
113 // !
114 // The smoothing factor should be between 0.0 and 1.0
115 assert(smoothingFactor < 1.f);
116 assert(smoothingFactor >= 0.f);
117
118 float cutoff = 0.5f - (smoothingFactor / 2.f);
119
120 m_lowpassFilter.configure(cutoff);
121}
122
123//=====================================================================================
125{
126 float rmsValue = getRMS();
127
128 return fmaxf(0, m_lowpassFilter.processSample(rmsValue));
129}
130
131//=====================================================================================
133{
134 if (m_energyDifferenceCalculated)
135 {
136 return m_energyDifferenceValue;
137 }
138 else
139 {
140 float energyValue = getRMS();
141
142 m_energyDifferenceValue = fabsf(energyValue - m_previousEnergyDifferenceValue);
143
144 m_previousEnergyDifferenceValue = energyValue;
145
146 m_energyDifferenceCalculated = true;
147
148 return m_energyDifferenceValue;
149 }
150}
void setSignalEnvelopeSmoothingFactor(float smoothingFactor)
Definition TimeDomainAnalysisFramework.cpp:111
float getPeakEnergy()
Definition TimeDomainAnalysisFramework.cpp:61
float getSignalEnvelope()
Definition TimeDomainAnalysisFramework.cpp:124
float getRMS()
Definition TimeDomainAnalysisFramework.cpp:85
TimeDomainAnalysisFramework(int analysisFrameSize, int sampleRate)
Definition TimeDomainAnalysisFramework.cpp:13
float getPitchMcLeod()
Definition TimeDomainAnalysisFramework.cpp:79
float getEnergyDifference()
Definition TimeDomainAnalysisFramework.cpp:132
int getSamplingFrequency()
Definition TimeDomainAnalysisFramework.cpp:33
void setSamplingFrequency(int fs)
Definition TimeDomainAnalysisFramework.cpp:23
void setSignalFrame(std::vector< float > spectralFrame)
Definition TimeDomainAnalysisFramework.cpp:40
void initialisePitchTrackingAlgorithms()
Definition TimeDomainAnalysisFramework.cpp:26
float getPitchAutocorrelation()
Definition TimeDomainAnalysisFramework.cpp:82