Mercurial > hg > vamp-fanchirp
changeset 7:3b2fed77a6cf perf
Indent
author | Chris Cannam |
---|---|
date | Tue, 02 Oct 2018 13:14:21 +0100 |
parents | cd6169f7940a |
children | 7ec763dc767c |
files | FChTransformF0gram.cpp FChTransformF0gram.h |
diffstat | 2 files changed, 378 insertions(+), 376 deletions(-) [+] |
line wrap: on
line diff
--- a/FChTransformF0gram.cpp Tue Oct 02 13:13:36 2018 +0100 +++ b/FChTransformF0gram.cpp Tue Oct 02 13:14:21 2018 +0100 @@ -13,20 +13,21 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. - */ +*/ #include "FChTransformF0gram.h" #include "FChTransformUtils.h" #include <math.h> #include <float.h> //#define DEBUG + #define MAX(x, y) (((x) > (y)) ? (x) : (y)) FChTransformF0gram::FChTransformF0gram(float inputSampleRate) : -Plugin(inputSampleRate), -m_currentProgram("default"), -m_stepSize(0), // We are using 0 for step and block size to indicate "not yet set". -m_blockSize(0) { + Plugin(inputSampleRate), + m_currentProgram("default"), + m_stepSize(0), // We are using 0 for step and block size to indicate "not yet set". + m_blockSize(0) { m_fs = inputSampleRate; // max frequency of interest (Hz) @@ -50,8 +51,8 @@ // glogs parameters m_glogs_params.HP_logS = true; m_glogs_params.att_subharms = 1; - // display parameters - m_f0gram_mode = true; + // display parameters + m_f0gram_mode = true; m_glogs_params.median_poly_coefs[0] = -0.000000058551680; m_glogs_params.median_poly_coefs[1] = -0.000006945207775; @@ -368,7 +369,7 @@ return m_f0_params.prefer_mean; } else if (identifier == "f0_prefer_stdev") { return m_f0_params.prefer_stdev; - } else if (identifier == "f0gram_mode") { + } else if (identifier == "f0gram_mode") { return m_f0gram_mode; } else { return 0.f; @@ -462,7 +463,7 @@ m_num_f0s = 0; - m_f0gram_mode = 1; + m_f0gram_mode = 1; } } @@ -493,10 +494,10 @@ d.unit = "Hertz"; d.hasFixedBinCount = true; //d.binCount = m_num_f0s; - //d.binCount = m_blockSize/2+1; - //d.binCount = m_warp_params.nsamps_twarp/2+1; - //d.binCount = m_warpings.nsamps_torig; - d.binCount = m_f0_params.num_octs*m_f0_params.num_f0s_per_oct; + //d.binCount = m_blockSize/2+1; + //d.binCount = m_warp_params.nsamps_twarp/2+1; + //d.binCount = m_warpings.nsamps_torig; + d.binCount = m_f0_params.num_octs*m_f0_params.num_f0s_per_oct; d.binNames = f0values; d.hasKnownExtents = false; d.isQuantized = false; @@ -510,7 +511,7 @@ bool FChTransformF0gram::initialise(size_t channels, size_t stepSize, size_t blockSize) { if (channels < getMinChannelCount() || - channels > getMaxChannelCount()) return false; + channels > getMaxChannelCount()) return false; // set blockSize and stepSize (but changed below) m_blockSize = blockSize; @@ -527,22 +528,22 @@ /* initialise m_f0_params */ /* initialise m_glogs_params */ - design_GLogS(); + design_GLogS(); /* design of FChT */ // design_fcht(m_warps, m_accums, m_f0s) design_FChT(); - design_FFT(); + design_FFT(); - design_LPF(); + design_LPF(); - design_time_window(); + design_time_window(); - // Create Hanning window for warped signals - mp_HanningWindow = new double[m_warp_params.nsamps_twarp]; - bool normalize = false; - hanning_window(mp_HanningWindow, m_warp_params.nsamps_twarp, normalize); + // Create Hanning window for warped signals + mp_HanningWindow = new double[m_warp_params.nsamps_twarp]; + bool normalize = false; + hanning_window(mp_HanningWindow, m_warp_params.nsamps_twarp, normalize); return true; } @@ -550,102 +551,102 @@ void FChTransformF0gram::design_GLogS() { - // total number & initial quantity of f0s - m_glogs_init_f0s = (size_t)(((double)m_f0_params.num_f0s_per_oct)*log2(5.0))+1; - m_glogs_num_f0s = (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct + m_glogs_init_f0s; + // total number & initial quantity of f0s + m_glogs_init_f0s = (size_t)(((double)m_f0_params.num_f0s_per_oct)*log2(5.0))+1; + m_glogs_num_f0s = (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct + m_glogs_init_f0s; - // Initialize arrays - m_glogs_f0 = new double[m_glogs_num_f0s]; - m_glogs = new double[m_glogs_num_f0s*m_warp_params.num_warps]; - m_glogs_n = new size_t[m_glogs_num_f0s]; - m_glogs_index = new size_t[m_glogs_num_f0s]; + // Initialize arrays + m_glogs_f0 = new double[m_glogs_num_f0s]; + m_glogs = new double[m_glogs_num_f0s*m_warp_params.num_warps]; + m_glogs_n = new size_t[m_glogs_num_f0s]; + m_glogs_index = new size_t[m_glogs_num_f0s]; - // Compute f0 values - m_glogs_harmonic_count = 0; - double factor = (double)(m_warp_params.nsamps_twarp/2)/(double)(m_warp_params.nsamps_twarp/2+1); - for (size_t i = 0; i < m_glogs_num_f0s; i++) { - m_glogs_f0[i] = (m_f0_params.f0min/5.0)*pow(2.0,(double)i/(double)m_f0_params.num_f0s_per_oct); - // for every f0 compute number of partials less or equal than m_fmax. - m_glogs_n[i] = m_fmax*factor/m_glogs_f0[i]; - m_glogs_index[i] = m_glogs_harmonic_count; - m_glogs_harmonic_count += m_glogs_n[i]; - } + // Compute f0 values + m_glogs_harmonic_count = 0; + double factor = (double)(m_warp_params.nsamps_twarp/2)/(double)(m_warp_params.nsamps_twarp/2+1); + for (size_t i = 0; i < m_glogs_num_f0s; i++) { + m_glogs_f0[i] = (m_f0_params.f0min/5.0)*pow(2.0,(double)i/(double)m_f0_params.num_f0s_per_oct); + // for every f0 compute number of partials less or equal than m_fmax. + m_glogs_n[i] = m_fmax*factor/m_glogs_f0[i]; + m_glogs_index[i] = m_glogs_harmonic_count; + m_glogs_harmonic_count += m_glogs_n[i]; + } - // Initialize arrays for interpolation - m_glogs_posint = new size_t[m_glogs_harmonic_count]; - m_glogs_posfrac = new double[m_glogs_harmonic_count]; - m_glogs_interp = new double[m_glogs_harmonic_count]; + // Initialize arrays for interpolation + m_glogs_posint = new size_t[m_glogs_harmonic_count]; + m_glogs_posfrac = new double[m_glogs_harmonic_count]; + m_glogs_interp = new double[m_glogs_harmonic_count]; - // Compute int & frac of interpolation positions - size_t aux_index = 0; - double aux_pos; - for (size_t i = 0; i < m_glogs_num_f0s; i++) { - for (size_t j = 1; j <= m_glogs_n[i]; j++) { - // indice en el vector de largo t_warp/2+1 donde el ultimo valor corresponde a f=m_fmax - aux_pos = ((double)j*m_glogs_f0[i])*((double)(m_warp_params.nsamps_twarp/2+1))/m_fmax; - m_glogs_posint[aux_index] = (size_t)aux_pos; - m_glogs_posfrac[aux_index] = aux_pos - (double)m_glogs_posint[aux_index]; - aux_index++; - } - } + // Compute int & frac of interpolation positions + size_t aux_index = 0; + double aux_pos; + for (size_t i = 0; i < m_glogs_num_f0s; i++) { + for (size_t j = 1; j <= m_glogs_n[i]; j++) { + // indice en el vector de largo t_warp/2+1 donde el ultimo valor corresponde a f=m_fmax + aux_pos = ((double)j*m_glogs_f0[i])*((double)(m_warp_params.nsamps_twarp/2+1))/m_fmax; + m_glogs_posint[aux_index] = (size_t)aux_pos; + m_glogs_posfrac[aux_index] = aux_pos - (double)m_glogs_posint[aux_index]; + aux_index++; + } + } - // Third harmonic attenuation - double aux_third_harmonic; - m_glogs_third_harmonic_posint = new size_t[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - m_glogs_third_harmonic_posfrac = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - for (size_t i = 0; i < (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct; i++) { - aux_third_harmonic = (double)i + (double)m_glogs_init_f0s - ((double)m_f0_params.num_f0s_per_oct)*log2(3.0); - m_glogs_third_harmonic_posint[i] = (size_t)aux_third_harmonic; - m_glogs_third_harmonic_posfrac[i] = aux_third_harmonic - (double)(m_glogs_third_harmonic_posint[i]); - } - m_glogs_third_harmonic = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + // Third harmonic attenuation + double aux_third_harmonic; + m_glogs_third_harmonic_posint = new size_t[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + m_glogs_third_harmonic_posfrac = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + for (size_t i = 0; i < (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct; i++) { + aux_third_harmonic = (double)i + (double)m_glogs_init_f0s - ((double)m_f0_params.num_f0s_per_oct)*log2(3.0); + m_glogs_third_harmonic_posint[i] = (size_t)aux_third_harmonic; + m_glogs_third_harmonic_posfrac[i] = aux_third_harmonic - (double)(m_glogs_third_harmonic_posint[i]); + } + m_glogs_third_harmonic = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - // Fifth harmonic attenuation - double aux_fifth_harmonic; - m_glogs_fifth_harmonic_posint = new size_t[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - m_glogs_fifth_harmonic_posfrac = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - for (size_t i = 0; i < (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct; i++) { - aux_fifth_harmonic = (double)i + (double)m_glogs_init_f0s - ((double)m_f0_params.num_f0s_per_oct)*log2(5.0); - m_glogs_fifth_harmonic_posint[i] = (size_t)aux_fifth_harmonic; - m_glogs_fifth_harmonic_posfrac[i] = aux_fifth_harmonic - (double)(m_glogs_fifth_harmonic_posint[i]); - } - m_glogs_fifth_harmonic = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + // Fifth harmonic attenuation + double aux_fifth_harmonic; + m_glogs_fifth_harmonic_posint = new size_t[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + m_glogs_fifth_harmonic_posfrac = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; + for (size_t i = 0; i < (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct; i++) { + aux_fifth_harmonic = (double)i + (double)m_glogs_init_f0s - ((double)m_f0_params.num_f0s_per_oct)*log2(5.0); + m_glogs_fifth_harmonic_posint[i] = (size_t)aux_fifth_harmonic; + m_glogs_fifth_harmonic_posfrac[i] = aux_fifth_harmonic - (double)(m_glogs_fifth_harmonic_posint[i]); + } + m_glogs_fifth_harmonic = new double[(m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct]; - // Normalization & attenuation windows - m_glogs_f0_preference_weights = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; - m_glogs_median_correction = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; - m_glogs_sigma_correction = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; - m_glogs_hf_smoothing_window = new double[m_warp_params.nsamps_twarp/2+1]; - double MIDI_value; - for (size_t i = 0; i < m_f0_params.num_octs*m_f0_params.num_f0s_per_oct; i++) { - MIDI_value = 69.0 + 12.0 * log2(m_glogs_f0[i + m_glogs_init_f0s]/440.0); - m_glogs_f0_preference_weights[i] = 1.0/sqrt(2.0*M_PI*m_f0_params.prefer_stdev*m_f0_params.prefer_stdev)*exp(-(MIDI_value-m_f0_params.prefer_mean)*(MIDI_value-m_f0_params.prefer_mean)/(2.0*m_f0_params.prefer_stdev*m_f0_params.prefer_stdev)); - m_glogs_f0_preference_weights[i] = (0.01 + m_glogs_f0_preference_weights[i]) / (1.01); + // Normalization & attenuation windows + m_glogs_f0_preference_weights = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; + m_glogs_median_correction = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; + m_glogs_sigma_correction = new double[m_f0_params.num_octs*m_f0_params.num_f0s_per_oct]; + m_glogs_hf_smoothing_window = new double[m_warp_params.nsamps_twarp/2+1]; + double MIDI_value; + for (size_t i = 0; i < m_f0_params.num_octs*m_f0_params.num_f0s_per_oct; i++) { + MIDI_value = 69.0 + 12.0 * log2(m_glogs_f0[i + m_glogs_init_f0s]/440.0); + m_glogs_f0_preference_weights[i] = 1.0/sqrt(2.0*M_PI*m_f0_params.prefer_stdev*m_f0_params.prefer_stdev)*exp(-(MIDI_value-m_f0_params.prefer_mean)*(MIDI_value-m_f0_params.prefer_mean)/(2.0*m_f0_params.prefer_stdev*m_f0_params.prefer_stdev)); + m_glogs_f0_preference_weights[i] = (0.01 + m_glogs_f0_preference_weights[i]) / (1.01); - m_glogs_median_correction[i] = m_glogs_params.median_poly_coefs[0]*(i+1.0)*(i+1.0) + m_glogs_params.median_poly_coefs[1]*(i+1.0) + m_glogs_params.median_poly_coefs[2]; - m_glogs_sigma_correction[i] = 1.0 / (m_glogs_params.sigma_poly_coefs[0]*(i+1.0)*(i+1.0) + m_glogs_params.sigma_poly_coefs[1]*(i+1.0) + m_glogs_params.sigma_poly_coefs[2]); - } + m_glogs_median_correction[i] = m_glogs_params.median_poly_coefs[0]*(i+1.0)*(i+1.0) + m_glogs_params.median_poly_coefs[1]*(i+1.0) + m_glogs_params.median_poly_coefs[2]; + m_glogs_sigma_correction[i] = 1.0 / (m_glogs_params.sigma_poly_coefs[0]*(i+1.0)*(i+1.0) + m_glogs_params.sigma_poly_coefs[1]*(i+1.0) + m_glogs_params.sigma_poly_coefs[2]); + } - double smooth_width = 1000.0; // hertz. - double smooth_aux = (double)(m_warp_params.nsamps_twarp/2+1)*(m_fmax-smooth_width)/m_fmax; - for (size_t i = 0; i < m_warp_params.nsamps_twarp/2+1; i++) { - if (i < smooth_aux) { - m_glogs_hf_smoothing_window[i] = 1.0; - } else { - m_glogs_hf_smoothing_window[i] = ((double)i - (double)m_warp_params.nsamps_twarp/2.0)*(-1.0/((double)(m_warp_params.nsamps_twarp/2+1)-smooth_aux)); - } - } + double smooth_width = 1000.0; // hertz. + double smooth_aux = (double)(m_warp_params.nsamps_twarp/2+1)*(m_fmax-smooth_width)/m_fmax; + for (size_t i = 0; i < m_warp_params.nsamps_twarp/2+1; i++) { + if (i < smooth_aux) { + m_glogs_hf_smoothing_window[i] = 1.0; + } else { + m_glogs_hf_smoothing_window[i] = ((double)i - (double)m_warp_params.nsamps_twarp/2.0)*(-1.0/((double)(m_warp_params.nsamps_twarp/2+1)-smooth_aux)); + } + } } void FChTransformF0gram::design_FFT() { in = (fftw_complex*) fftw_malloc(sizeof (fftw_complex) * m_nfft); out = (fftw_complex*) fftw_malloc(sizeof (fftw_complex) * m_nfft); - //TODO verificar que el tipo de datos de in_window es del tipo double, era float. + //TODO verificar que el tipo de datos de in_window es del tipo double, era float. in_window = (double*) fftw_malloc(sizeof (double) * m_nfft); planFFT = fftw_plan_dft_1d(m_nfft, in, out, FFTW_FORWARD, FFTW_ESTIMATE); - //TODO hacer diseño del FFT para el filtrado pasabajos. + //TODO hacer diseño del FFT para el filtrado pasabajos. } @@ -677,8 +678,8 @@ // linear chirps warping definition as relative frequency deviation //double * freq_relative = new double [m_warpings.nsamps_torig * m_warp_params.num_warps]; - //TODO - double *freq_relative = new double [m_warpings.nsamps_torig * m_warp_params.num_warps]; + //TODO + double *freq_relative = new double [m_warpings.nsamps_torig * m_warp_params.num_warps]; define_warps_linear_chirps(freq_relative, t_orig); // maximum relative frequency deviation @@ -706,37 +707,37 @@ */ /* - output << "chirp_rates" << endl; - for (size_t j = 0; j < m_warp_params.num_warps; j++){ - output << m_warpings.chirp_rates[j]; - output << " "; - } - output << endl << "freq_relative" << endl; + output << "chirp_rates" << endl; + for (size_t j = 0; j < m_warp_params.num_warps; j++){ + output << m_warpings.chirp_rates[j]; + output << " "; + } + output << endl << "freq_relative" << endl; - for (size_t i = 0; i < m_warpings.nsamps_torig; i++){ - for (size_t j = 0; j < m_warp_params.num_warps; j++){ - output << freq_relative[j * m_warpings.nsamps_torig + i]; - output << " "; - } - output << endl; - } + for (size_t i = 0; i < m_warpings.nsamps_torig; i++){ + for (size_t j = 0; j < m_warp_params.num_warps; j++){ + output << freq_relative[j * m_warpings.nsamps_torig + i]; + output << " "; + } + output << endl; + } - output << endl << "t_orig" << endl; + output << endl << "t_orig" << endl; - for (size_t i = 0; i < m_warpings.nsamps_torig; i++){ - output << t_orig[i] << endl ; - } - */ + for (size_t i = 0; i < m_warpings.nsamps_torig; i++){ + output << t_orig[i] << endl ; + } + */ - delete [] freq_relative; + delete [] freq_relative; //output.close(); /* ============= FFTW PLAN DESIGN ============= */ - // Initialize 2-d array for warped signals - x_warping = new double[m_warp_params.nsamps_twarp]; - m_absFanChirpTransform = (double*)fftw_malloc(sizeof (double) * m_warp_params.num_warps * (m_warp_params.nsamps_twarp/2 + 1)); - m_auxFanChirpTransform = (fftw_complex*)fftw_malloc(sizeof ( fftw_complex) * (m_warp_params.nsamps_twarp/2 + 1)); - plan_forward_xwarping = fftw_plan_dft_r2c_1d(m_warp_params.nsamps_twarp, x_warping, m_auxFanChirpTransform, FFTW_ESTIMATE); + // Initialize 2-d array for warped signals + x_warping = new double[m_warp_params.nsamps_twarp]; + m_absFanChirpTransform = (double*)fftw_malloc(sizeof (double) * m_warp_params.num_warps * (m_warp_params.nsamps_twarp/2 + 1)); + m_auxFanChirpTransform = (fftw_complex*)fftw_malloc(sizeof ( fftw_complex) * (m_warp_params.nsamps_twarp/2 + 1)); + plan_forward_xwarping = fftw_plan_dft_r2c_1d(m_warp_params.nsamps_twarp, x_warping, m_auxFanChirpTransform, FFTW_ESTIMATE); } @@ -746,17 +747,17 @@ given by the desired frequency deviation, to do this, the interpolation instants are stored in a structure as an integer index and a fractional value hypothesis: sampling frequency at the central point equals the original - */ + */ m_warpings.pos_int = new size_t[m_warp_params.num_warps * m_warp_params.nsamps_twarp]; - m_warpings.pos_frac = new double[m_warp_params.num_warps * m_warp_params.nsamps_twarp]; + m_warpings.pos_frac = new double[m_warp_params.num_warps * m_warp_params.nsamps_twarp]; - // vector of phase values - double *phi = new double[m_warpings.nsamps_torig]; - double aux; + // vector of phase values + double *phi = new double[m_warpings.nsamps_torig]; + double aux; - // warped positions - double *pos1 = new double[m_warp_params.nsamps_twarp*m_warp_params.num_warps]; + // warped positions + double *pos1 = new double[m_warp_params.nsamps_twarp*m_warp_params.num_warps]; for (size_t i = 0; i < m_warp_params.num_warps; i++) { // vector of phase values @@ -768,17 +769,17 @@ // interpolation of phase values to obtain warped positions //pos1(i,:) = interp1(phi,t_orig,t_warp)*fs_orig + length(t_orig)/2; - // integration of relative frequency to obtain phase values - cumtrapz(t_orig, freq_relative + i*(m_warpings.nsamps_torig), m_warpings.nsamps_torig, phi); + // integration of relative frequency to obtain phase values + cumtrapz(t_orig, freq_relative + i*(m_warpings.nsamps_torig), m_warpings.nsamps_torig, phi); - // centering of phase values to force original frequency in the middle - aux = phi[m_warpings.nsamps_torig/2]; - for (size_t j = 0; j < m_warpings.nsamps_torig; j++) { - phi[j] -= aux; - } //for + // centering of phase values to force original frequency in the middle + aux = phi[m_warpings.nsamps_torig/2]; + for (size_t j = 0; j < m_warpings.nsamps_torig; j++) { + phi[j] -= aux; + } //for - // interpolation of phase values to obtain warped positions - interp1(phi, t_orig, m_warpings.nsamps_torig, t_warp, pos1 + i*m_warp_params.nsamps_twarp, m_warp_params.nsamps_twarp); + // interpolation of phase values to obtain warped positions + interp1(phi, t_orig, m_warpings.nsamps_torig, t_warp, pos1 + i*m_warp_params.nsamps_twarp, m_warp_params.nsamps_twarp); } @@ -789,24 +790,24 @@ // % fractional value that defines the warped position // warps.pos1_frac = (double(pos1)' - double(pos1_int)); - // m_warpings.pos_int = new size_t[m_warp_params.num_warps * m_warp_params.nsamps_twarp]; - for (size_t j = 0; j < m_warp_params.nsamps_twarp*m_warp_params.num_warps; j++) { - // previous sample index - pos1[j] = pos1[j]*m_warpings.fs_orig + m_warpings.nsamps_torig/2 + 1; - m_warpings.pos_int[j] = (size_t) pos1[j]; - m_warpings.pos_frac[j] = pos1[j] - (double)(m_warpings.pos_int[j]); - } //for + // m_warpings.pos_int = new size_t[m_warp_params.num_warps * m_warp_params.nsamps_twarp]; + for (size_t j = 0; j < m_warp_params.nsamps_twarp*m_warp_params.num_warps; j++) { + // previous sample index + pos1[j] = pos1[j]*m_warpings.fs_orig + m_warpings.nsamps_torig/2 + 1; + m_warpings.pos_int[j] = (size_t) pos1[j]; + m_warpings.pos_frac[j] = pos1[j] - (double)(m_warpings.pos_int[j]); + } //for - delete [] phi; - delete [] pos1; + delete [] phi; + delete [] pos1; } void FChTransformF0gram::define_warps_linear_chirps(double * freq_relative, double * t_orig) { /** define warps as relative frequency deviation from original frequency - t_orig : time vector - freq_relative : relative frequency deviations - */ + t_orig : time vector + freq_relative : relative frequency deviations + */ if (m_warp_params.alpha_dist == 0) { // linear alpha values spacing @@ -873,28 +874,28 @@ } } LPF_time = (double*)fftw_malloc(sizeof ( double) * m_warpings.nsamps_torig); - //memset((char*)LPF_time, 0, m_warpings.nsamps_torig * sizeof(double)); - // sustituyo el memset por un for: - for (size_t i = 0; i < m_warpings.nsamps_torig; i++) { - LPF_time[i] = 0.0; - } - #ifdef DEBUG - printf(" Corrio primer memset...\n"); - #endif + //memset((char*)LPF_time, 0, m_warpings.nsamps_torig * sizeof(double)); + // sustituyo el memset por un for: + for (size_t i = 0; i < m_warpings.nsamps_torig; i++) { + LPF_time[i] = 0.0; + } +#ifdef DEBUG + printf(" Corrio primer memset...\n"); +#endif LPF_frequency = (fftw_complex*)fftw_malloc(sizeof ( fftw_complex) * (m_warpings.nsamps_torig/2 + 1)); //tamaño de la fft cuando la entrada es real - //memset((char*)LPF_frequency, 0, sizeof(fftw_complex) * (m_warpings.nsamps_torig/2 + 1)); - // sustituyo el memset por un for: - for (size_t i = 0; i < (m_warpings.nsamps_torig/2 + 1); i++) { - LPF_frequency[i][0] = 0.0; - LPF_frequency[i][1] = 0.0; - } + //memset((char*)LPF_frequency, 0, sizeof(fftw_complex) * (m_warpings.nsamps_torig/2 + 1)); + // sustituyo el memset por un for: + for (size_t i = 0; i < (m_warpings.nsamps_torig/2 + 1); i++) { + LPF_frequency[i][0] = 0.0; + LPF_frequency[i][1] = 0.0; + } // for (int i=0; i<(m_blockSize/2+1); i++) { // LPF_frequency[i] = new fftw_complex; // } plan_forward_LPF = fftw_plan_dft_r2c_1d(m_blockSize, LPF_time, LPF_frequency, FFTW_ESTIMATE); plan_backward_LPF = fftw_plan_dft_c2r_1d(m_warpings.nsamps_torig, LPF_frequency, LPF_time, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT); - size_t winWidth = 11; + size_t winWidth = 11; double *lp_hanningWindow = new double[winWidth]; double accum=0; for (size_t i = 0; i < winWidth; i++) { @@ -907,13 +908,13 @@ } for (size_t i = 0; i < m_blockSize/2+1; i++) { //if (((i-(winWidth-1)/2)<0)||(i+(winWidth-1))/2>m_blockSize/2-1) {//consideramos winWidth impar, si la ventana sale del arreglo se rellena con el valor origianl - if ( (i > (i_max + (winWidth-1)/2)) || (i <= (i_max - (winWidth-1)/2)) ) { + if ( (i > (i_max + (winWidth-1)/2)) || (i <= (i_max - (winWidth-1)/2)) ) { mp_LPFWindow[i]=lp_LPFWindow_aux[i]; } else { accum=0; - for (size_t j = -((winWidth-1)/2); j <= (winWidth-1)/2; j++) { + for (size_t j = -((winWidth-1)/2); j <= (winWidth-1)/2; j++) { accum+=lp_LPFWindow_aux[i-j]*lp_hanningWindow[j+(winWidth-1)/2]; - } + } mp_LPFWindow[i]=accum; } } @@ -930,59 +931,59 @@ } fftw_execute(plan_backward_LPF); - // TODO ver si hay que hacer fftshift para corregir la fase respecto al centro del frame. - // nota: además de aplicar el LPF, esta función resamplea la señal original. + // TODO ver si hay que hacer fftshift para corregir la fase respecto al centro del frame. + // nota: además de aplicar el LPF, esta función resamplea la señal original. } void FChTransformF0gram::clean_LPF() { delete[] mp_LPFWindow; - fftw_destroy_plan(plan_forward_LPF); - fftw_destroy_plan(plan_backward_LPF); - fftw_free(LPF_time); - fftw_free(LPF_frequency); + fftw_destroy_plan(plan_forward_LPF); + fftw_destroy_plan(plan_backward_LPF); + fftw_free(LPF_time); + fftw_free(LPF_frequency); } void FChTransformF0gram::reset() { // Clear buffers, reset stored values, etc - delete [] m_warpings.pos_int; - delete [] m_warpings.pos_frac; + delete [] m_warpings.pos_int; + delete [] m_warpings.pos_frac; fftw_destroy_plan(planFFT); - fftw_free(in); - fftw_free(out); + fftw_free(in); + fftw_free(out); - clean_LPF(); + clean_LPF(); - delete [] m_timeWindow; + delete [] m_timeWindow; - delete [] mp_HanningWindow; + delete [] mp_HanningWindow; - // Warping - delete [] x_warping; - fftw_destroy_plan(plan_forward_xwarping); - fftw_free(m_absFanChirpTransform); - fftw_free(m_auxFanChirpTransform); + // Warping + delete [] x_warping; + fftw_destroy_plan(plan_forward_xwarping); + fftw_free(m_absFanChirpTransform); + fftw_free(m_auxFanChirpTransform); - // design_GLogS - delete [] m_glogs_f0; - delete [] m_glogs; - delete [] m_glogs_n; - delete [] m_glogs_index; - delete [] m_glogs_posint; - delete [] m_glogs_posfrac; - delete [] m_glogs_third_harmonic_posint; - delete [] m_glogs_third_harmonic_posfrac; - delete [] m_glogs_third_harmonic; - delete [] m_glogs_fifth_harmonic_posint; - delete [] m_glogs_fifth_harmonic_posfrac; - delete [] m_glogs_fifth_harmonic; - delete [] m_glogs_f0_preference_weights; - delete [] m_glogs_median_correction; - delete [] m_glogs_sigma_correction; - delete [] m_glogs_hf_smoothing_window; + // design_GLogS + delete [] m_glogs_f0; + delete [] m_glogs; + delete [] m_glogs_n; + delete [] m_glogs_index; + delete [] m_glogs_posint; + delete [] m_glogs_posfrac; + delete [] m_glogs_third_harmonic_posint; + delete [] m_glogs_third_harmonic_posfrac; + delete [] m_glogs_third_harmonic; + delete [] m_glogs_fifth_harmonic_posint; + delete [] m_glogs_fifth_harmonic_posfrac; + delete [] m_glogs_fifth_harmonic; + delete [] m_glogs_f0_preference_weights; + delete [] m_glogs_median_correction; + delete [] m_glogs_sigma_correction; + delete [] m_glogs_hf_smoothing_window; } @@ -992,38 +993,38 @@ // // Do actual work! // - /* PSEUDOCÓDIGO: - - Aplicar FFT al frame entero. - - Filtro pasabajos en frecuencia. - - FFT inversa al frame entero. ------------------------------------------------------------------------------ - - Para cada warp: *Si es un espectrograma direccional (un solo warp - => no es para cada warp sino para el elegido) - - Hacer la interpolación con interp1q. - - Aplicar la FFT al frame warpeado. - - (Opcional) GLogS. - - ... - */ + /* PSEUDOCÓDIGO: + - Aplicar FFT al frame entero. + - Filtro pasabajos en frecuencia. + - FFT inversa al frame entero. + ----------------------------------------------------------------------------- + - Para cada warp: *Si es un espectrograma direccional (un solo warp + => no es para cada warp sino para el elegido) + - Hacer la interpolación con interp1q. + - Aplicar la FFT al frame warpeado. + - (Opcional) GLogS. + - ... + */ //--------------------------------------------------------------------------- - FeatureSet fs; + FeatureSet fs; - #ifdef DEBUG - printf("\n ----- DEBUG INFORMATION ----- \n"); - printf(" m_fs = %f Hz.\n",m_fs); - printf(" fs_orig = %f Hz.\n",m_warpings.fs_orig); - printf(" fs_warp = %f Hz.\n",m_warpings.fs_warp); - printf(" m_nfft = %d.\n",m_nfft); - printf(" m_blockSize = %d.\n",m_blockSize); - printf(" m_warpings.nsamps_torig = %d.\n",m_warpings.nsamps_torig); - printf(" m_warp_params.num_warps = %d.\n",m_warp_params.num_warps); - printf(" m_glogs_harmonic_count = %d.\n",m_glogs_harmonic_count); - #endif +#ifdef DEBUG + printf("\n ----- DEBUG INFORMATION ----- \n"); + printf(" m_fs = %f Hz.\n",m_fs); + printf(" fs_orig = %f Hz.\n",m_warpings.fs_orig); + printf(" fs_warp = %f Hz.\n",m_warpings.fs_warp); + printf(" m_nfft = %d.\n",m_nfft); + printf(" m_blockSize = %d.\n",m_blockSize); + printf(" m_warpings.nsamps_torig = %d.\n",m_warpings.nsamps_torig); + printf(" m_warp_params.num_warps = %d.\n",m_warp_params.num_warps); + printf(" m_glogs_harmonic_count = %d.\n",m_glogs_harmonic_count); +#endif // size_t n = m_nfft/2 + 1; - // double *tbuf = in_window; + // double *tbuf = in_window; - for (size_t i = 0; i < m_blockSize; i++) { + for (size_t i = 0; i < m_blockSize; i++) { LPF_time[i] = (double)(inputBuffers[0][i]) * m_timeWindow[i]; } @@ -1032,15 +1033,15 @@ // cout << flush; // #endif - apply_LPF(); - // Señal filtrada queda en LPF_time + apply_LPF(); + // Señal filtrada queda en LPF_time - Feature feature; + Feature feature; feature.hasTimestamp = false; - /* Solo a modo de prueba, voy a poner la salida del filtrado en «in» y - voy a mostrar la FFT de eso, para ver el efecto del filtrado. */ + /* Solo a modo de prueba, voy a poner la salida del filtrado en «in» y + voy a mostrar la FFT de eso, para ver el efecto del filtrado. */ // for (size_t i = 0; i < m_nfft; i++) { // in[i][0] = tbuf[i]; // in[i][1] = 0; @@ -1066,102 +1067,102 @@ // ---------------------------------------------------------------------------------------------- // Hanning window & FFT for all warp directions - double max_glogs = -DBL_MAX; - size_t ind_max_glogs = 0; + double max_glogs = -DBL_MAX; + size_t ind_max_glogs = 0; - for (size_t i_warp = 0; i_warp < m_warp_params.num_warps; i_warp++) { - // Interpolate - interp1q(LPF_time, (m_warpings.pos_int) + i_warp*m_warp_params.nsamps_twarp, m_warpings.pos_frac + i_warp*m_warp_params.nsamps_twarp, x_warping, m_warp_params.nsamps_twarp); + for (size_t i_warp = 0; i_warp < m_warp_params.num_warps; i_warp++) { + // Interpolate + interp1q(LPF_time, (m_warpings.pos_int) + i_warp*m_warp_params.nsamps_twarp, m_warpings.pos_frac + i_warp*m_warp_params.nsamps_twarp, x_warping, m_warp_params.nsamps_twarp); - // Apply window - for (size_t i = 0; i < m_warp_params.nsamps_twarp; i++) { - x_warping[i] *= mp_HanningWindow[i]; - } + // Apply window + for (size_t i = 0; i < m_warp_params.nsamps_twarp; i++) { + x_warping[i] *= mp_HanningWindow[i]; + } - // Transform - fftw_execute(plan_forward_xwarping); + // Transform + fftw_execute(plan_forward_xwarping); - // Copy result - //memcpy(m_absFanChirpTransform + i_warp*(m_warp_params.nsamps_twarp/2+1), m_auxFanChirpTransform, (m_warp_params.nsamps_twarp/2+1)*sizeof(fftw_complex)); asi como esta no funciona - double *aux_abs_fcht = m_absFanChirpTransform + i_warp*(m_warp_params.nsamps_twarp/2+1); - for (size_t i = 0; i < (m_warp_params.nsamps_twarp/2+1); i++) { - aux_abs_fcht[i] = log10(1.0 + 10.0*sqrt(m_auxFanChirpTransform[i][0]*m_auxFanChirpTransform[i][0]+m_auxFanChirpTransform[i][1]*m_auxFanChirpTransform[i][1])); - // smoothing high frequency values - //aux_abs_fcht[i] *= m_glogs_hf_smoothing_window[i]; - } + // Copy result + //memcpy(m_absFanChirpTransform + i_warp*(m_warp_params.nsamps_twarp/2+1), m_auxFanChirpTransform, (m_warp_params.nsamps_twarp/2+1)*sizeof(fftw_complex)); asi como esta no funciona + double *aux_abs_fcht = m_absFanChirpTransform + i_warp*(m_warp_params.nsamps_twarp/2+1); + for (size_t i = 0; i < (m_warp_params.nsamps_twarp/2+1); i++) { + aux_abs_fcht[i] = log10(1.0 + 10.0*sqrt(m_auxFanChirpTransform[i][0]*m_auxFanChirpTransform[i][0]+m_auxFanChirpTransform[i][1]*m_auxFanChirpTransform[i][1])); + // smoothing high frequency values + //aux_abs_fcht[i] *= m_glogs_hf_smoothing_window[i]; + } // ----------------------------------------------------------------------------------------- // GLogS - interp1q(aux_abs_fcht, m_glogs_posint, m_glogs_posfrac, m_glogs_interp, m_glogs_harmonic_count); - size_t glogs_ind = 0; - for (size_t i = 0; i < m_glogs_num_f0s; i++) { - double glogs_accum = 0; - for (size_t j = 1; j <= m_glogs_n[i]; j++) { - glogs_accum += m_glogs_interp[glogs_ind++]; - } - m_glogs[i + i_warp*m_glogs_num_f0s] = glogs_accum/(double)m_glogs_n[i]; - } + interp1q(aux_abs_fcht, m_glogs_posint, m_glogs_posfrac, m_glogs_interp, m_glogs_harmonic_count); + size_t glogs_ind = 0; + for (size_t i = 0; i < m_glogs_num_f0s; i++) { + double glogs_accum = 0; + for (size_t j = 1; j <= m_glogs_n[i]; j++) { + glogs_accum += m_glogs_interp[glogs_ind++]; + } + m_glogs[i + i_warp*m_glogs_num_f0s] = glogs_accum/(double)m_glogs_n[i]; + } // Sub/super harmonic correction - interp1q(m_glogs + i_warp*m_glogs_num_f0s, m_glogs_third_harmonic_posint, m_glogs_third_harmonic_posfrac, m_glogs_third_harmonic, (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct); - interp1q(m_glogs + i_warp*m_glogs_num_f0s, m_glogs_fifth_harmonic_posint, m_glogs_fifth_harmonic_posfrac, m_glogs_fifth_harmonic, (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct); - for (size_t i = m_glogs_num_f0s-1; i >= m_glogs_init_f0s; i--) { - m_glogs[i + i_warp*m_glogs_num_f0s] -= MAX(MAX(m_glogs[i-m_f0_params.num_f0s_per_oct + i_warp*m_glogs_num_f0s],m_glogs_third_harmonic[i-m_glogs_init_f0s]),m_glogs_fifth_harmonic[i-m_glogs_init_f0s]); - //m_glogs[i] -= MAX(m_glogs[i-m_f0_params.num_f0s_per_oct],m_glogs_third_harmonic[i-m_glogs_init_f0s]); - } - for (size_t i = m_glogs_init_f0s; i < m_glogs_num_f0s-m_f0_params.num_f0s_per_oct; i++) { - m_glogs[i + i_warp*m_glogs_num_f0s] -= 0.3*m_glogs[i+m_f0_params.num_f0s_per_oct + i_warp*m_glogs_num_f0s]; - // Median, sigma $ weights correction - m_glogs[i + i_warp*m_glogs_num_f0s] = (m_glogs[i + i_warp*m_glogs_num_f0s]-m_glogs_median_correction[i-m_glogs_init_f0s])*m_glogs_sigma_correction[i-m_glogs_init_f0s]*m_glogs_f0_preference_weights[i-m_glogs_init_f0s]; - } + interp1q(m_glogs + i_warp*m_glogs_num_f0s, m_glogs_third_harmonic_posint, m_glogs_third_harmonic_posfrac, m_glogs_third_harmonic, (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct); + interp1q(m_glogs + i_warp*m_glogs_num_f0s, m_glogs_fifth_harmonic_posint, m_glogs_fifth_harmonic_posfrac, m_glogs_fifth_harmonic, (m_f0_params.num_octs+1)*m_f0_params.num_f0s_per_oct); + for (size_t i = m_glogs_num_f0s-1; i >= m_glogs_init_f0s; i--) { + m_glogs[i + i_warp*m_glogs_num_f0s] -= MAX(MAX(m_glogs[i-m_f0_params.num_f0s_per_oct + i_warp*m_glogs_num_f0s],m_glogs_third_harmonic[i-m_glogs_init_f0s]),m_glogs_fifth_harmonic[i-m_glogs_init_f0s]); + //m_glogs[i] -= MAX(m_glogs[i-m_f0_params.num_f0s_per_oct],m_glogs_third_harmonic[i-m_glogs_init_f0s]); + } + for (size_t i = m_glogs_init_f0s; i < m_glogs_num_f0s-m_f0_params.num_f0s_per_oct; i++) { + m_glogs[i + i_warp*m_glogs_num_f0s] -= 0.3*m_glogs[i+m_f0_params.num_f0s_per_oct + i_warp*m_glogs_num_f0s]; + // Median, sigma $ weights correction + m_glogs[i + i_warp*m_glogs_num_f0s] = (m_glogs[i + i_warp*m_glogs_num_f0s]-m_glogs_median_correction[i-m_glogs_init_f0s])*m_glogs_sigma_correction[i-m_glogs_init_f0s]*m_glogs_f0_preference_weights[i-m_glogs_init_f0s]; + } - // Look for maximum value to determine best direction - for (size_t i = m_glogs_init_f0s; i < m_glogs_num_f0s-m_f0_params.num_f0s_per_oct; i++) { - if (m_glogs[i + i_warp*m_glogs_num_f0s] > max_glogs) { - max_glogs = m_glogs[i + i_warp*m_glogs_num_f0s]; - ind_max_glogs = i_warp; - } - } - } + // Look for maximum value to determine best direction + for (size_t i = m_glogs_init_f0s; i < m_glogs_num_f0s-m_f0_params.num_f0s_per_oct; i++) { + if (m_glogs[i + i_warp*m_glogs_num_f0s] > max_glogs) { + max_glogs = m_glogs[i + i_warp*m_glogs_num_f0s]; + ind_max_glogs = i_warp; + } + } + } // ---------------------------------------------------------------------------------------------- - for (size_t i=m_glogs_init_f0s; i< m_glogs_num_f0s - m_f0_params.num_f0s_per_oct; i++) { + for (size_t i=m_glogs_init_f0s; i< m_glogs_num_f0s - m_f0_params.num_f0s_per_oct; i++) { //for (size_t i=0; i<(m_warp_params.nsamps_twarp/2+1); i++) { - //feature.values.push_back((float)(m_warpings.pos_int[i])+ (float)(m_warpings.pos_frac[i])); - //feature.values.push_back((float)(phi[i]*100000.0)); - //feature.values.push_back((float)(t_orig[i])); - //feature.values.push_back((float)(pos1[i])); - //feature.values.push_back((float)x_warping[i]); - //feature.values.push_back(m_absFanChirpTransform[i + ind_max_glogs*(m_warp_params.nsamps_twarp/2+1)]); - //feature.values.push_back((float)m_glogs[i+(long)ind_max_glogs*(long)m_glogs_num_f0s]); - switch (m_f0gram_mode) { - case 1: - max_glogs = -DBL_MAX; - for (size_t i_warp = 0; i_warp < m_warp_params.num_warps; i_warp++) { - if (m_glogs[i + i_warp*m_glogs_num_f0s] > max_glogs) { - max_glogs = m_glogs[i + i_warp*m_glogs_num_f0s]; - ind_max_glogs = i_warp; - } - } - feature.values.push_back((float)max_glogs); - break; - case 0: - feature.values.push_back((float)m_glogs[i+(size_t)ind_max_glogs*(size_t)m_glogs_num_f0s]); - break; - } - //feature.values.push_back((float)m_glogs_hf_smoothing_window[i]); - } + //feature.values.push_back((float)(m_warpings.pos_int[i])+ (float)(m_warpings.pos_frac[i])); + //feature.values.push_back((float)(phi[i]*100000.0)); + //feature.values.push_back((float)(t_orig[i])); + //feature.values.push_back((float)(pos1[i])); + //feature.values.push_back((float)x_warping[i]); + //feature.values.push_back(m_absFanChirpTransform[i + ind_max_glogs*(m_warp_params.nsamps_twarp/2+1)]); + //feature.values.push_back((float)m_glogs[i+(long)ind_max_glogs*(long)m_glogs_num_f0s]); + switch (m_f0gram_mode) { + case 1: + max_glogs = -DBL_MAX; + for (size_t i_warp = 0; i_warp < m_warp_params.num_warps; i_warp++) { + if (m_glogs[i + i_warp*m_glogs_num_f0s] > max_glogs) { + max_glogs = m_glogs[i + i_warp*m_glogs_num_f0s]; + ind_max_glogs = i_warp; + } + } + feature.values.push_back((float)max_glogs); + break; + case 0: + feature.values.push_back((float)m_glogs[i+(size_t)ind_max_glogs*(size_t)m_glogs_num_f0s]); + break; + } + //feature.values.push_back((float)m_glogs_hf_smoothing_window[i]); + } // ---------------------------------------------------------------------------------------------- - fs[0].push_back(feature); + fs[0].push_back(feature); - #ifdef DEBUG - printf(" ----------------------------- \n"); - #endif +#ifdef DEBUG + printf(" ----------------------------- \n"); +#endif - return fs; + return fs; //--------------------------------------------------------------------------- //return FeatureSet(); @@ -1175,32 +1176,32 @@ void FChTransformF0gram::design_time_window() { - size_t transitionWidth = (size_t)m_blockSize/128 + 1;; + size_t transitionWidth = (size_t)m_blockSize/128 + 1;; m_timeWindow = new double[m_blockSize]; - double *lp_transitionWindow = new double[transitionWidth]; + double *lp_transitionWindow = new double[transitionWidth]; - //memset(m_timeWindow, 1.0, m_blockSize); - for (size_t i = 0; i < m_blockSize; i++) { - m_timeWindow[i] = 1.0; - } + //memset(m_timeWindow, 1.0, m_blockSize); + for (size_t i = 0; i < m_blockSize; i++) { + m_timeWindow[i] = 1.0; + } - for (size_t i = 0; i < transitionWidth; i++) { + for (size_t i = 0; i < transitionWidth; i++) { lp_transitionWindow[i]=0.5*(1.0-cos(2*M_PI*(double)(i+1)/((double)transitionWidth+1.0))); } - for (size_t i = 0; i < transitionWidth/2; i++) { - m_timeWindow[i] = lp_transitionWindow[i]; - m_timeWindow[m_blockSize-1-i] = lp_transitionWindow[transitionWidth-1-i]; - } + for (size_t i = 0; i < transitionWidth/2; i++) { + m_timeWindow[i] = lp_transitionWindow[i]; + m_timeWindow[m_blockSize-1-i] = lp_transitionWindow[transitionWidth-1-i]; + } - #ifdef DEBUG - for (int i = 0; i < m_blockSize; i++) { - if ((i<transitionWidth)) { - printf(" m_timeWindow[%d] = %f.\n",i,m_timeWindow[i]); - } - } - #endif +#ifdef DEBUG + for (int i = 0; i < m_blockSize; i++) { + if ((i<transitionWidth)) { + printf(" m_timeWindow[%d] = %f.\n",i,m_timeWindow[i]); + } + } +#endif - delete [] lp_transitionWindow; + delete [] lp_transitionWindow; }
--- a/FChTransformF0gram.h Tue Oct 02 13:13:36 2018 +0100 +++ b/FChTransformF0gram.h Tue Oct 02 13:14:21 2018 +0100 @@ -13,11 +13,12 @@ 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> @@ -62,7 +63,7 @@ void reset(); FeatureSet process(const float *const *inputBuffers, - Vamp::RealTime timestamp); + Vamp::RealTime timestamp); FeatureSet getRemainingFeatures(); @@ -107,7 +108,7 @@ } f0_parameters; f0_parameters m_f0_params; - bool m_f0gram_mode; + bool m_f0gram_mode; // ======== GATHERED LOG SPECTRUM PARAMETERS ======= @@ -140,53 +141,53 @@ 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; + // 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_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(); + 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; + // 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; };