Chris@0: /*
Chris@0: copyright (C) 2011 I. Irigaray, M. Rocamora
Chris@0:
Chris@0: This program is free software: you can redistribute it and/or modify
Chris@0: it under the terms of the GNU General Public License as published by
Chris@0: the Free Software Foundation, either version 3 of the License, or
Chris@0: (at your option) any later version.
Chris@0:
Chris@0: This program is distributed in the hope that it will be useful,
Chris@0: but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0: GNU General Public License for more details.
Chris@0:
Chris@0: You should have received a copy of the GNU General Public License
Chris@0: along with this program. If not, see .
Chris@0: */
Chris@0:
Chris@0: // Remember to use a different guard symbol in each header!
Chris@0: #ifndef _FCHTRANSFORMF0GRAM_H_
Chris@0: #define _FCHTRANSFORMF0GRAM_H_
Chris@0: #define _USE_MATH_DEFINES
Chris@0: #include
Chris@0: #include
Chris@0: #include
Chris@0: #include
Chris@0: #include
Chris@0: #include
Chris@0: #include
Chris@0:
Chris@0: using namespace std;
Chris@0: using std::string;
Chris@0:
Chris@0: class FChTransformF0gram : public Vamp::Plugin {
Chris@0: public:
Chris@0: FChTransformF0gram(float inputSampleRate);
Chris@0: virtual ~FChTransformF0gram();
Chris@0:
Chris@0: string getIdentifier() const;
Chris@0: string getName() const;
Chris@0: string getDescription() const;
Chris@0: string getMaker() const;
Chris@0: string getCopyright() const;
Chris@0: int getPluginVersion() const;
Chris@0:
Chris@0: InputDomain getInputDomain() const;
Chris@0: size_t getMinChannelCount() const;
Chris@0: size_t getMaxChannelCount() const;
Chris@0: size_t getPreferredStepSize() const;
Chris@0: size_t getPreferredBlockSize() const;
Chris@0:
Chris@0: ParameterList getParameterDescriptors() const;
Chris@0: float getParameter(string identifier) const;
Chris@0: void setParameter(string identifier, float value);
Chris@0:
Chris@0: ProgramList getPrograms() const;
Chris@0: string getCurrentProgram() const;
Chris@0: void selectProgram(string name);
Chris@0:
Chris@0: OutputList getOutputDescriptors() const;
Chris@0:
Chris@0: bool initialise(size_t channels, size_t stepSize, size_t blockSize);
Chris@0: void reset();
Chris@0:
Chris@0: FeatureSet process(const float *const *inputBuffers,
Chris@0: Vamp::RealTime timestamp);
Chris@0:
Chris@0: FeatureSet getRemainingFeatures();
Chris@0:
Chris@0: protected:
Chris@0:
Chris@0: string m_currentProgram;
Chris@0: size_t m_stepSize;
Chris@0: size_t m_blockSize;
Chris@0: float m_fs; // input sampling rate (inputSampleRate)
Chris@0:
Chris@0: // plugin-specific data and methods go here
Chris@0:
Chris@0: // ============= WARPING PARAMETERS =============
Chris@0:
Chris@0: double m_fmax; // maximum frequency of interest (Hz)
Chris@0: size_t m_nfft; // number of fft points (controls zero-padding)
Chris@0: size_t m_hop; // hop in samples in the upsampled signal
Chris@0: size_t m_num_f0s; // number of f0 values in F0gram grid
Chris@0: //vector m_f0s; // vector of f0 values
Chris@0: double *m_f0s; // vector of f0 values
Chris@0:
Chris@0: typedef struct {
Chris@0: size_t nsamps_twarp; // number of samples of the warped signal frame
Chris@0: double alpha_max; // maximum value of normalized frequency deviation (alpha)
Chris@0: size_t num_warps; // number of warpings
Chris@0: size_t fact_over_samp; // oversampling factor
Chris@0: size_t alpha_dist; // distribution of alpha values, 'lin' or 'log' (0 - 1)
Chris@0: } warping_parameters;
Chris@0:
Chris@0: warping_parameters m_warp_params;
Chris@0:
Chris@0: // ============= F0-GRAM PARAMETERS =============
Chris@0:
Chris@0: typedef struct {
Chris@0: double f0min; // minimun fundamental frequency
Chris@0: size_t num_octs; // number of octaves
Chris@0: size_t num_f0s_per_oct; // number of f0s per octave
Chris@0: size_t num_f0_hyps; // number of f0 hypotesis to extract
Chris@0: bool prefer; // whether to use a f0 preference guassian function
Chris@0: size_t prefer_mean; // mean of f0 preference function (MIDI number for C4)
Chris@0: size_t prefer_stdev; // stdev of f0 preference function (stdev in MIDI numbers)
Chris@0: } f0_parameters;
Chris@0:
Chris@0: f0_parameters m_f0_params;
Chris@0: bool m_f0gram_mode;
Chris@0:
Chris@0: // ======== GATHERED LOG SPECTRUM PARAMETERS =======
Chris@0:
Chris@0: typedef struct {
Chris@0: bool HP_logS; //high-pass logS
Chris@0: int att_subharms; // whether to attenuate subharmonics
Chris@0: // model parameter variables (default values)
Chris@0: double median_poly_coefs[3];
Chris@0: double sigma_poly_coefs[3];
Chris@0: } glogs_parameters;
Chris@0:
Chris@0: glogs_parameters m_glogs_params;
Chris@0:
Chris@0: // ============= WARPING DESIGN =============
Chris@0:
Chris@0: typedef struct {
Chris@0: double fs_orig; // sampling frequency after oversampling
Chris@0: double fs_warp; // sampling frequency of warped signal
Chris@0: double *chirp_rates; // chirp rates
Chris@0: size_t nsamps_torig; // number of samples of the original signal frame
Chris@0: size_t fact_over_samp; // oversampling factor (use instead warp_params.fact_over_samp)
Chris@0: size_t *pos_int; // index of previous sample to do the warping by interpolation efficiently
Chris@0: double *pos_frac; // fractional value to do the warping by interpolation efficiently
Chris@0: } warping_design;
Chris@0:
Chris@0: warping_design m_warpings;
Chris@0: // LPFWindow
Chris@0: double *mp_LPFWindow;
Chris@0: double *LPF_time;
Chris@0: fftw_complex *LPF_frequency;
Chris@0: fftw_plan plan_backward_LPF;
Chris@0: fftw_plan plan_forward_LPF;
Chris@0: // timeWindow
Chris@0: double *m_timeWindow;
Chris@0: // Warpings
Chris@0: double *x_warping;
Chris@0: // Hanning window
Chris@0: double *mp_HanningWindow;
Chris@0: // FChT plan & transformed data structs
Chris@0: double *m_absFanChirpTransform;
Chris@0: fftw_complex *m_auxFanChirpTransform;
Chris@0: fftw_plan plan_forward_xwarping;
Chris@0: // GLogS
Chris@0: double *m_glogs_f0;
Chris@0: double *m_glogs;
Chris@0: size_t *m_glogs_n;
Chris@0: size_t *m_glogs_index;
Chris@0: size_t *m_glogs_posint;
Chris@0: double *m_glogs_posfrac;
Chris@0: double *m_glogs_interp;
Chris@0: size_t m_glogs_harmonic_count;
Chris@0: size_t m_glogs_num_f0s;
Chris@0: size_t m_glogs_init_f0s;
Chris@0: size_t *m_glogs_third_harmonic_posint;
Chris@0: double *m_glogs_third_harmonic_posfrac;
Chris@0: double *m_glogs_third_harmonic;
Chris@0: size_t *m_glogs_fifth_harmonic_posint;
Chris@0: double *m_glogs_fifth_harmonic_posfrac;
Chris@0: double *m_glogs_fifth_harmonic;
Chris@0: double *m_glogs_f0_preference_weights;
Chris@0: double *m_glogs_median_correction;
Chris@0: double *m_glogs_sigma_correction;
Chris@0: double *m_glogs_hf_smoothing_window;
Chris@0: // auxiliar methods
Chris@0: void design_GLogS();
Chris@0: void design_FChT();
Chris@0: void define_warps_linear_chirps(double *, double *);
Chris@0: void design_warps(double *, double *, double *);
Chris@0: void design_LPF();
Chris@0: void clean_LPF();
Chris@0: void apply_LPF();
Chris@0: void design_FFT();
Chris@0: void design_time_window();
Chris@0:
Chris@0: // FFT variables
Chris@0: fftw_complex *in, *out;
Chris@0: //TODO verificar que el tipo de datos de in_window es del tipo double, era del tipo float.
Chris@0: double *in_window;
Chris@0: fftw_plan planFFT;
Chris@0: };
Chris@0:
Chris@0:
Chris@0: #endif