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@7: */ Chris@0: Chris@0: // Remember to use a different guard symbol in each header! Chris@12: #ifndef FCHTRANSFORMF0GRAM_H Chris@12: #define FCHTRANSFORMF0GRAM_H Chris@7: Chris@0: #define _USE_MATH_DEFINES Chris@0: #include Chris@0: #include Chris@14: #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@14: using _VampPlugin::Vamp::FFTReal; Chris@14: Chris@15: class FChTransformF0gram : public Vamp::Plugin Chris@15: { Chris@0: public: Chris@15: enum ProcessingMode { Chris@15: ModeF0Gram, Chris@15: ModeSpectrogram, Chris@15: ModeRoughSpectrogram Chris@15: }; Chris@15: Chris@15: FChTransformF0gram(ProcessingMode mode, 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: 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@7: Vamp::RealTime timestamp); Chris@0: Chris@0: FeatureSet getRemainingFeatures(); Chris@0: Chris@0: protected: Chris@15: ProcessingMode m_processingMode; Chris@20: bool m_initialised; Chris@10: int m_stepSize; Chris@10: int m_blockSize; Chris@0: float m_fs; // input sampling rate (inputSampleRate) Chris@20: float *m_inputBuffer; 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@10: int m_num_f0s; // number of f0 values in F0gram grid Chris@0: double *m_f0s; // vector of f0 values Chris@0: Chris@24: vector nsamp_options; Chris@24: Chris@0: typedef struct { Chris@10: int nsamps_twarp; // number of samples of the warped signal frame Chris@0: double alpha_max; // maximum value of normalized frequency deviation (alpha) Chris@10: int num_warps; // number of warpings Chris@10: int fact_over_samp; // oversampling factor Chris@10: int 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@10: int num_octs; // number of octaves Chris@10: int num_f0s_per_oct; // number of f0s per octave Chris@0: bool prefer; // whether to use a f0 preference guassian function Chris@10: int prefer_mean; // mean of f0 preference function (MIDI number for C4) Chris@10: int 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@15: Chris@15: enum F0GramMode { Chris@15: AllBinsOfBestDirection, Chris@15: BestBinOfAllDirections Chris@15: }; Chris@15: F0GramMode 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@10: int nsamps_torig; // number of samples of the original signal frame Chris@10: int *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@14: double *LPF_frequency; Chris@14: FFTReal *fft_forward_LPF; // two of these as they have different sizes Chris@14: FFTReal *fft_inverse_LPF; Chris@7: // timeWindow Chris@7: double *m_timeWindow; Chris@7: // Warpings Chris@7: double *x_warping; Chris@7: // Hanning window Chris@7: double *mp_HanningWindow; Chris@7: // FChT plan & transformed data structs Chris@7: double *m_absFanChirpTransform; Chris@14: double *m_auxFanChirpTransform; Chris@14: FFTReal *fft_xwarping; Chris@7: // GLogS Chris@7: double *m_glogs_f0; Chris@7: double *m_glogs; Chris@10: int *m_glogs_n; Chris@10: int *m_glogs_index; Chris@10: int *m_glogs_posint; Chris@7: double *m_glogs_posfrac; Chris@7: double *m_glogs_interp; Chris@10: int m_glogs_harmonic_count; Chris@10: int m_glogs_num_f0s; Chris@10: int m_glogs_init_f0s; Chris@10: int *m_glogs_third_harmonic_posint; Chris@7: double *m_glogs_third_harmonic_posfrac; Chris@7: double *m_glogs_third_harmonic; Chris@10: int *m_glogs_fifth_harmonic_posint; Chris@7: double *m_glogs_fifth_harmonic_posfrac; Chris@7: double *m_glogs_fifth_harmonic; Chris@7: double *m_glogs_f0_preference_weights; Chris@7: double *m_glogs_median_correction; Chris@7: double *m_glogs_sigma_correction; Chris@0: // auxiliar methods Chris@7: 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@7: void design_time_window(); Chris@0: }; Chris@0: Chris@0: Chris@0: #endif