view projects/d-box/spear_parser.h @ 39:638bc1ae2500 staging

Improved readibility of the DIGITAL code in the PRU, using register names instead of aliases and expanding some of the macros, removing unused macros. Binaries were not modified
author Giulio Moro <giuliomoro@yahoo.it>
date Wed, 13 May 2015 12:18:10 +0100
parents 8a575ba3ab52
children
line wrap: on
line source
/*
 * spear_parser.h v1.2
 *
 *  Created on: May 6, 2014
 *      Author: Victor Zappi
 */

#ifndef SPEAR_PARSER_H_
#define SPEAR_PARSER_H_

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <stdlib.h>		// atoi, atof
#include <math.h>
#include <algorithm>	// std::fill

#include <sys/time.h>

using namespace std;


//------------------------------------------------------------------------------------------------
// partials
//------------------------------------------------------------------------------------------------

class Spear_parser; // for class friendship

class Partials
{
	friend class Spear_parser;
	friend class Dbox_parser;

public:
	int **partialSamples;				// sample at which each frame is
	float **partialFrequencies;			// frequencies at each frame
	float **partialAmplitudes;			// amplitudes at each frame
	unsigned int *partialNumFrames;		// Length of each partial in frames
	unsigned int *partialStartFrame;	// frame at which each partial begins
	float **partialFreqDelta;			// constant frequency slope for each partial in each frame interval
	float **partialAmpDelta;			// constant amplitude slope for each partial in each frame interval
	float *partialFreqMean;				// frequency mean for each partial, over all its frames

	unsigned short *activePartialNum;	// num of each active partial at each frame
	unsigned int **activePartials;		// indices of all active partials at each frame


	int getPartialNum();
	int getHopNum();
	int getMaxActivePartialNum();

private:
	Partials();
	~Partials();

	unsigned int *partialStartSample;	// sample at which each partial begins
	unsigned int *partialEndSample;		// sample at which each partial ends [sample gap between 2 consecutive frames can be an integer multiple of hopSize]
	unsigned int parNum;
	unsigned int currentSample;
	unsigned int hopSize;
	unsigned int hopNum;
	unsigned int maxActiveParNum;

	void init(int parNum, int hopSize, bool isDBX=false);
	void update(int parIndex, int frameNum);
	void setFreqDelta(int parIndex, int frameNum, double delta);
	void setAmpDelta(int parIndex, int frameNum, double delta);
	void setHopNum(int hopNum);
};

inline int Partials::getPartialNum()
{
	return parNum;
}

inline void Partials::setHopNum(int hopN)
{
	hopNum = hopN;

	// prepare data structures
	activePartialNum 	= new unsigned short[hopNum+1];	// +1 cos total num of frames = num of hops+1
	activePartials	 	= new unsigned int *[hopNum+1];
}

// useful to increase current sample using a modulo on the total number of samples [easy to be deduced from the total num or hops]
inline int Partials::getHopNum()
{
	return hopNum;
}

inline void Partials::setFreqDelta(int parIndex, int frameNum, double delta)
{
	partialFreqDelta[parIndex][frameNum] = delta;
}

inline void Partials::setAmpDelta(int parIndex, int frameNum, double delta)
{
	partialAmpDelta[parIndex][frameNum] = delta;
}

inline int Partials::getMaxActivePartialNum()
{
	return maxActiveParNum;
}







//------------------------------------------------------------------------------------------------
// spear parser
//------------------------------------------------------------------------------------------------

class Spear_parser
{
public:
	Spear_parser();
	~Spear_parser();

	Partials partials;

	bool parseFile(string filename, int hopsize=-1, int samplerate = 44100);
	bool parseFile(char *filename, int hopsize=-1, int samplerate = 44100);
	int getHopSize();
	int getFileSampleRate();
	double getDeltaTime();

private:

	int hopSize;
	int fileSampleRate;
	double deltaTime;	// min time gap between consecutive frames

	timeval start, stop;
	unsigned long hopSizeT, parserT, staticT;

	void calculateDeltaTime();
	void calculateHopSize(char *filename);
	bool parser(char *filename, int hopsize=-1, int samplerate=44100);
	bool DBXparser(char *filename, int samplerate=44100);
	bool TXTparser(char *filename, int hopsize=-1, int samplerate=44100);
	int fromTimeToSamples(float time);
	int interpolateSamples(int parIndex, int *frameIndex, int missCnt, int nextSample,
							double nextFreq, double nextAmp, double *prevFreq, double *prevAmp);
	void staticCalculations();

};

inline bool Spear_parser::parseFile(string filename, int hopsize, int samplerate)
{
	return parser((char *)filename.c_str(), hopsize, samplerate);
}

inline bool Spear_parser::parseFile(char *filename, int hopsize, int samplerate)
{
	return parser(filename, hopsize, samplerate);
}

inline void Spear_parser::calculateDeltaTime()
{
	deltaTime = (double)hopSize/ (double)fileSampleRate;
}

// each time value in the file is rounded, and 2 consecutive frames can differ of a time gap = i*deltaTime, where i is a positive integer
inline int Spear_parser::fromTimeToSamples(float time)
{
	return round(time/deltaTime)*hopSize;	// round is necessary since in the file log time values are rounded, so they do not apparently look like integer multiples of deltaTime
}

inline int Spear_parser::getHopSize()
{
	return hopSize;
}

inline int Spear_parser::getFileSampleRate()
{
	return fileSampleRate;
}

inline double Spear_parser::getDeltaTime()
{
	return deltaTime;
}

#endif /* SPEAR_PARSER_H_ */