view vibrato.h @ 2:fc19d45615d1

* Make all file names lower-case to avoid case ambiguity (some includes differed in case from the filenames they were trying to include). Also replace MinGW-specific mem.h with string.h
author Chris Cannam
date Tue, 05 Oct 2010 11:04:40 +0100
parents 6422640a802f
children 5f3c32dc6e17
line wrap: on
line source
#ifndef vibratoH
#define vibratoH


/*
  vibrato.cpp - vibrato analysis and synthesis using harmonic sinusoids

  Further reading: Wen X. and M. Sandler, "Analysis and synthesis of audio vibrato using harmonic sinusoids,"
  in Proc. AES 124th Convention, Amsterdam, 2008.
*/

#include <stdio.h>
#include "hs.h"
//---------------------------------------------------------------------------

/*
  TVo is the data structure hosting descriptors of a vibrato representation of a harmonic sinusoid. Its
  basic framework is shared by the TSF object which hosts a more elaborate source-filter model than TVo,
  but does not look into vibrato-specific features such as modulator shape.

  An analysis/sythesis cycle converts THS to TVo and back.
*/
struct TVo
{
  //basic characteristics
  int M;            //number of partials
  int L;            //number of frames
  int P;            //number of F0 peaks
  double h;         //hop size
  double* F0C;      //[0:L-1] pitch carrier
  double* A0C;      //[0:L-1] amplitude carreir
  int afres;        //filter model bins
  double LogAF[4096]; //[0:afres-1] filter model

  int* peakfr;      //[0:P-1] peak positions, in frames
  double* lp;       //[0:P-1] peak positions, refined to floating-point values in frames
  double* Dp;       //[1:P-1] single-cycle rms of F0D
  int* Kp;          //[1:P-1] order of single-cycle modulator shape descriptor
  double** fxr;     //[1:P-1][0:2K] single-cycle modulator shape coefficients - cosine, sine, cosine, ...
  double** LogASp;  //[1:P-1][0:M-1] single-cycle source model
  int K;

  //other properties
  double rate;      //vibrato rate
  double regularity;//vibrato regularity
  double F0max;     //maximal fundamental frequency
  double F0min;     //minimal fundamental frequency
  double F0Cmax;    //maximal fundamental carrier frequency
  double F0Cmin;    //minimal fundamental carrier frequency
  double F0Overall; //overall average fundamental frequency
  double F0Dmax;    //maximal fundamental modulator frequency
  double F0Dmin;    //minimal fundamental modulator frequency
  double* F0;       //[0:L-1] pitch
  double* F0D;      //[0:L-1] pitch modulator
  double D;         //rms of F0D,
  double LogAS[100];//[0:M-1] source model
  double FXR[100];  //average cycle modulator shape coefficients
  double FRes[50];  //average modulator residues
  double** fres;    //[1:P-1][0:K-1] single-cycle modulator residues

  TVo();
  ~TVo();
  void AllocateL(int AnL);
  void ReAllocateL(int newL);
  void AllocateP();
  void AllocatePK();
  void SaveToFile(char* filename);
  void SaveToFileHandle(FILE* file);
  void LoadFromFileHandle(FILE* file);
	double GetOldP();
};

//--tool procedures----------------------------------------------------------
double QIE(double* y);
double QIE(double* y, double& x);

//--demodulation routines----------------------------------------------------
void DeFM(double* f2, double* f1, double* AA, int npfr, int* peakfr, int Fr, double& fct, int& fcount, double* &frs, double* &f, bool furthersmoothing=false);
void DeFM(double* f2, double* f1, double* AA, int npfr, double* lp, int Fr, double& fct, int& fcount, double* &frs, double* &f, bool furthersmoothing=false);
void DeAM(double* A2, double* A1, int npfr, int* peakfr, int Fr);
void DeAM(double* A2, double* A1, int npfr, double* lp, int Fr);

//--source-filter analysis routine-------------------------------------------
double S_F(int afres, double* LogAF, double* LogAS, int Fr, int M, atom** Partials, double* A0C, double* lp, int P, double F0Overall);
double S_F_SV(int afres, double* LogAF, double* LogAS, int Fr, int M, atom** Partials, double* A0C, double* lp, int P, double F=0.005, int FScaleMode=0, double theta=0.5, double sps=44100);

//--vibrato analysis and synthesis routines----------------------------------
void AnalyzeV(THS& HS, TVo& V, double*& peaky, double*& cyclefrs, double*& cyclefs, double sps, double h, int* cyclefrcount=0,
      int SFMode=0, double SFF=0.01, int SFFScale=0, double SFtheta=0);
void RegularizeV(THS& HS, TVo& V, double sps, double h);
void SynthesizeV(THS* HS, TVo* V, double sps, int UseK=0);
TVo* InterpolateV(double newP, double rate, TVo& V);

//--other functions----------------------------------------------------------
void FindPeaks(int* peakfr, int& npfr, double* F0, int Fr, double periodinframe, double*& peaky);
void FS_QR(int& K, double* FXR, double* data, int Fr, double period, double shift, double* FRES);
void RateAndReg(double& rate, double& regularity, double* data, int frst, int fren, int padrate, double sps, double offst);

#endif