changeset 89:5ef334c782f3

Moved some parts of the algorithm from arrays needing lots of data moved around to lighted circular buffers
author Adam Stark <adamstark.uk@gmail.com>
date Fri, 04 Mar 2016 18:10:23 +0000
parents 995ddf0eadd4
children b6fc77f471bb
files src/BTrack.cpp src/BTrack.h src/CircularBuffer.cpp src/CircularBuffer.h unit-tests/BTrack Tests.xcodeproj/project.pbxproj unit-tests/BTrack Tests/main.cpp
diffstat 6 files changed, 129 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/src/BTrack.cpp	Sat Jan 30 23:55:13 2016 +0000
+++ b/src/BTrack.cpp	Fri Mar 04 18:10:23 2016 +0000
@@ -23,6 +23,7 @@
 #include <algorithm>
 #include "BTrack.h"
 #include "samplerate.h"
+#include <iostream>
 
 //=======================================================================
 BTrack::BTrack() : odf(512,1024,ComplexSpectralDifferenceHWR,HanningWindow)
@@ -229,14 +230,15 @@
 	beatCounter--;
 	beatDueInFrame = false;
 	
-	// move all samples back one step
-	for (int i=0;i < (onsetDFBufferSize-1);i++)
-	{
-		onsetDF[i] = onsetDF[i+1];
-	}
+//	// move all samples back one step
+//	for (int i=0;i < (onsetDFBufferSize-1);i++)
+//	{
+//		onsetDF[i] = onsetDF[i+1];
+//	}
 	
 	// add new sample at the end
-	onsetDF[onsetDFBufferSize-1] = newSample;
+	//onsetDF[onsetDFBufferSize-1] = newSample;
+    onsetDF.addSampleToEnd(newSample);
 	
 	// update cumulative score
 	updateCumulativeScore(newSample);
@@ -366,35 +368,37 @@
 void BTrack::resampleOnsetDetectionFunction()
 {
 	float output[512];
+    
+
     float input[onsetDFBufferSize];
     
     for (int i = 0;i < onsetDFBufferSize;i++)
     {
         input[i] = (float) onsetDF[i];
     }
-		
-	double src_ratio = 512.0/((double) onsetDFBufferSize);
-	int BUFFER_LEN = onsetDFBufferSize;
-	int output_len;
-	SRC_DATA	src_data ;
-	
-	//output_len = (int) floor (((double) BUFFER_LEN) * src_ratio) ;
-	output_len = 512;
-	
-	src_data.data_in = input;
-	src_data.input_frames = BUFFER_LEN;
-	
-	src_data.src_ratio = src_ratio;
-	
-	src_data.data_out = output;
-	src_data.output_frames = output_len;
-	
-	src_simple (&src_data, SRC_SINC_BEST_QUALITY, 1);
-			
-	for (int i = 0;i < output_len;i++)
-	{
-		resampledOnsetDF[i] = (double) src_data.data_out[i];
-	}
+        
+    double src_ratio = 512.0/((double) onsetDFBufferSize);
+    int BUFFER_LEN = onsetDFBufferSize;
+    int output_len;
+    SRC_DATA	src_data ;
+    
+    //output_len = (int) floor (((double) BUFFER_LEN) * src_ratio) ;
+    output_len = 512;
+    
+    src_data.data_in = input;
+    src_data.input_frames = BUFFER_LEN;
+    
+    src_data.src_ratio = src_ratio;
+    
+    src_data.data_out = output;
+    src_data.output_frames = output_len;
+    
+    src_simple (&src_data, SRC_SINC_BEST_QUALITY, 1);
+            
+    for (int i = 0;i < output_len;i++)
+    {
+        resampledOnsetDF[i] = (double) src_data.data_out[i];
+    }
 }
 
 //=======================================================================
@@ -682,16 +686,20 @@
 	}
 	
 	
-	// shift cumulative score back one
-	for (int i = 0;i < (onsetDFBufferSize-1);i++)
-	{
-		cumulativeScore[i] = cumulativeScore[i+1];
-	}
+//	// shift cumulative score back one
+//	for (int i = 0;i < (onsetDFBufferSize-1);i++)
+//	{
+//		cumulativeScore[i] = cumulativeScore[i+1];
+//	}
 	
+    latestCumulativeScoreValue = ((1-alpha)*odfSample) + (alpha*max);
+    
+    cumulativeScore.addSampleToEnd(latestCumulativeScoreValue);
+    
 	// add new value to cumulative score
-	cumulativeScore[onsetDFBufferSize-1] = ((1-alpha)*odfSample) + (alpha*max);
+	//cumulativeScore[onsetDFBufferSize-1] = ((1-alpha)*odfSample) + (alpha*max);
 	
-	latestCumulativeScoreValue = cumulativeScore[onsetDFBufferSize-1];
+	//latestCumulativeScoreValue = cumulativeScore[onsetDFBufferSize-1];
 			
 }
 
--- a/src/BTrack.h	Sat Jan 30 23:55:13 2016 +0000
+++ b/src/BTrack.h	Fri Mar 04 18:10:23 2016 +0000
@@ -23,6 +23,7 @@
 #define __BTRACK_H
 
 #include "OnsetDetectionFunction.h"
+#include "CircularBuffer.h"
 #include <vector>
 
 //=======================================================================
@@ -184,8 +185,8 @@
     //=======================================================================
 	// buffers
     
-    std::vector<double> onsetDF;            /**< to hold onset detection function */
-    std::vector<double> cumulativeScore;    /**< to hold cumulative score */
+    CircularBuffer onsetDF;                 /**< to hold onset detection function */
+    CircularBuffer cumulativeScore;         /**< to hold cumulative score */
     
     double resampledOnsetDF[512];           /**< to hold resampled detection function */
 	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/CircularBuffer.cpp	Fri Mar 04 18:10:23 2016 +0000
@@ -0,0 +1,9 @@
+//
+//  CircularBuffer.cpp
+//  BTrack Tests
+//
+//  Created by Adam Stark on 04/02/2016.
+//  Copyright © 2016 Adam Stark. All rights reserved.
+//
+
+#include "CircularBuffer.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/CircularBuffer.h	Fri Mar 04 18:10:23 2016 +0000
@@ -0,0 +1,46 @@
+//
+//  CircularBuffer.hpp
+//  BTrack Tests
+//
+//  Created by Adam Stark on 04/02/2016.
+//  Copyright © 2016 Adam Stark. All rights reserved.
+//
+
+#ifndef CircularBuffer_h
+#define CircularBuffer_h
+
+#include <vector>
+
+class CircularBuffer
+{
+public:
+    CircularBuffer() : writeIndex(0)
+    {
+        
+    }
+    
+    double &operator[](int i)
+    {
+        int index = (i + writeIndex) % buffer.size();
+        return buffer[index];
+    }
+        
+    void addSampleToEnd (double v)
+    {
+        buffer[writeIndex] = v;
+        writeIndex = (writeIndex + 1) % buffer.size();
+    }
+    
+    void resize(int size)
+    {
+        buffer.resize(size);
+        writeIndex = 0;
+    }
+    
+private:
+    
+    std::vector<double> buffer;
+    int writeIndex;
+};
+
+#endif /* CircularBuffer_hpp */
--- a/unit-tests/BTrack Tests.xcodeproj/project.pbxproj	Sat Jan 30 23:55:13 2016 +0000
+++ b/unit-tests/BTrack Tests.xcodeproj/project.pbxproj	Fri Mar 04 18:10:23 2016 +0000
@@ -12,6 +12,7 @@
 		E38214F2188E7AED00DDD7C8 /* BTrack_Tests.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = E38214F1188E7AED00DDD7C8 /* BTrack_Tests.1 */; };
 		E3A45DB9188E7BCD00B48CE4 /* BTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3A45DB5188E7BCD00B48CE4 /* BTrack.cpp */; };
 		E3A45DBA188E7BCD00B48CE4 /* OnsetDetectionFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3A45DB7188E7BCD00B48CE4 /* OnsetDetectionFunction.cpp */; };
+		E3A5E1DA1C63CE83007A17B0 /* CircularBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3A5E1D81C63CE83007A17B0 /* CircularBuffer.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -36,6 +37,8 @@
 		E3A45DB6188E7BCD00B48CE4 /* BTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BTrack.h; sourceTree = "<group>"; };
 		E3A45DB7188E7BCD00B48CE4 /* OnsetDetectionFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OnsetDetectionFunction.cpp; sourceTree = "<group>"; };
 		E3A45DB8188E7BCD00B48CE4 /* OnsetDetectionFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnsetDetectionFunction.h; sourceTree = "<group>"; };
+		E3A5E1D81C63CE83007A17B0 /* CircularBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CircularBuffer.cpp; sourceTree = "<group>"; };
+		E3A5E1D91C63CE83007A17B0 /* CircularBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircularBuffer.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -92,6 +95,8 @@
 				E3A45DB6188E7BCD00B48CE4 /* BTrack.h */,
 				E3A45DB7188E7BCD00B48CE4 /* OnsetDetectionFunction.cpp */,
 				E3A45DB8188E7BCD00B48CE4 /* OnsetDetectionFunction.h */,
+				E3A5E1D81C63CE83007A17B0 /* CircularBuffer.cpp */,
+				E3A5E1D91C63CE83007A17B0 /* CircularBuffer.h */,
 			);
 			name = src;
 			path = ../../src;
@@ -149,6 +154,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				E31C50041891302D006530ED /* Test_BTrack.cpp in Sources */,
+				E3A5E1DA1C63CE83007A17B0 /* CircularBuffer.cpp in Sources */,
 				E3A45DBA188E7BCD00B48CE4 /* OnsetDetectionFunction.cpp in Sources */,
 				E3A45DB9188E7BCD00B48CE4 /* BTrack.cpp in Sources */,
 				E38214F0188E7AED00DDD7C8 /* main.cpp in Sources */,
--- a/unit-tests/BTrack Tests/main.cpp	Sat Jan 30 23:55:13 2016 +0000
+++ b/unit-tests/BTrack Tests/main.cpp	Fri Mar 04 18:10:23 2016 +0000
@@ -1,3 +1,23 @@
 #define BOOST_TEST_DYN_LINK
 #define BOOST_TEST_MODULE BTrackTests
-#include <boost/test/unit_test.hpp>
\ No newline at end of file
+#include <boost/test/unit_test.hpp>
+
+//#include "CircularBuffer.h"
+//#include <iostream>
+//
+//int main()
+//{
+//    CircularBuffer buffer;
+//    
+//    buffer.resize(10);
+//    
+//    buffer.addSampleToEnd(10);
+//    buffer.addSampleToEnd(8);
+//    
+//    for (int i = 0;i < 10;i++)
+//    {
+//        std::cout << buffer[i] << std::endl;
+//    }
+//    
+//    return 0;
+//}
\ No newline at end of file