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