view cpp/chourdakisreiss2016cpp/Parameter.h @ 2:c87a9505f294 tip

Added LICENSE for code, removed .wav files
author Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk>
date Sat, 30 Sep 2017 13:25:50 +0100
parents 144fbd1d29c3
children
line wrap: on
line source
/*
 * Parameter.h
 *
 *  Created on: Dec 14, 2016
 *      Author: Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk>
 *
 *  For using that code in research please cite:
 *
 *
@Article{dlib09,
  author = {Davis E. King},
  title = {Dlib-ml: A Machine Learning Toolkit},
  journal = {Journal of Machine Learning Research},
  year = {2009},
  volume = {10},
  pages = {1755-1758},
}
 *
 *
 */

#ifndef PARAMETER_H_
#define PARAMETER_H_

#include "limits.hpp"
#include <dlib/optimization.h>
#include <iostream>

/*
 * Normalization function
 */

#define _N(f, fmin, fmax) ((f-fmin) / (fmax-fmin))

using namespace dlib;
using namespace std;

typedef matrix<double,0,1> column_vector;

class Parameter {
private:

	/*
	 * D1: First Comb Filter Delay
	 * G1: First Comb Filter Gain
	 * DA: All-pass Filter Delay
	 * GA (in limits.hpp): All-pass Filter gain
	 * GC: Low-pass Filter Gain
	 * G:  Dry/Wet Mix
	 *
	 */

	double D1, DA, G1, GC, G;

	/*
	 * T60: Reverberation Time
	 * ED:  Echo Density
	 * C:   Clarity
	 * TC:  Central Time
	 * SC:  Spectral Centroid
	 * SC_MAX: Maximum Spectral Centroid (depends on sample rate)
	 *
	 */

	double T60, ED, C, TC, SC, SC_MAX;

	double SampleRate;

	friend std::ostream& operator<<(std::ostream &s, const Parameter &p);

	static double compute_T60(double _D1, double _G1, double _GC, double _G);
	static double compute_ED(double _D1, double _DA);
	static double compute_C(double _G1, double _GC, double _G);
	static double compute_TC(double _D1, double _G1, double _DA);
	static double compute_SC(double _GC, double _SR);

	/*
	 * Functions used in computing the inverse mapping/
	 */

	static double TC_G1_D1_ED(double _D1, double _G1, double _ED, double t=0.1);
	static double T60_D1_G1_C(double _D1, double _G1, double _GC, double _C);
	static double D1_G1_T60_C(double _G1, double _GC, double _T60, double _C);
	static double G_G1_C(double _G1, double _GC, double _C);
	static double DA_D1_ED(double _D1, double _ED, double t=0.1);

	/*
	 * Function to minimize.
	 */

	static double GC_SC(double _SC, double SR);
	static double errorfunc(double _G1, double _GC, const matrix<double, 4, 1> &Target);
	static matrix <double, 5, 1> inverse_mapping(double _T60, double _ED, double _C, double _TC, double _SC, double SampleRate, double _G1);


public:
	Parameter(double SR=44100.0,
			  double _D1 = 0.05,
			  double _DA = 0.006,
			  double _G1 = 0.5,
			  double _GC = 0.5,
			  double _G  = 0.5,
			  double _T60 = 0.423289,
			  double _ED  = 6927.08,
			  double _C   = -0.107798,
			  double _TC  = 0.0490677,
			  double _SC  = 6419.15
			  );
	virtual ~Parameter();
	double getC() const;
	void setC(double c);
	double getD1() const;
	void setD1(double d1);
	double getDa() const;
	void setDa(double da);
	double getEd() const;
	void setEd(double ed);
	double getG() const;
	void setG(double g);
	double getG1() const;
	void setG1(double g1);
	double getGc() const;
	void setGc(double gc);
	double getSampleRate() const;
	void setSampleRate(double sampleRate);
	double getSc() const;
	void setSc(double sc);
	double getT60() const;
	void setT60(double t60);
	double getTc() const;
	void setTc(double tc);

	/* compute functions */

	/*
	 *  Low level -> High level
	 */

	int set_low_and_compute(double D1, double DA, double G1, double GC, double G);
	int get_low_and_computer();

	/*
	 *  High level -> Low level
	 */

	int set_high_and_compute(double T60, double ED, double C, double TC, double SC);
	int get_high_and_compute();


};



#endif /* PARAMETER_H_ */