void AmbisonicsMeter::setNumberOfLoudspeakers(long aNumberOfChannels) { Planewaves::setNumberOfLoudspeakers(aNumberOfChannels); m_vectors->setNumberOfLoudspeakers(aNumberOfChannels); m_number_of_outputs = 0; if(m_loudspeakers_amplitudes) cicm_free(m_loudspeakers_amplitudes); if(m_loudspeakers_peaks) cicm_free(m_loudspeakers_peaks); if(m_loudspeakers_energies) cicm_free(m_loudspeakers_energies); if(m_loudspeakers_angles_mapped) cicm_free(m_loudspeakers_angles_mapped); if(m_loudspeakers_angles_width) cicm_free(m_loudspeakers_angles_width); cicm_malloc_vec_d(m_loudspeakers_amplitudes, m_number_of_loudspeakers); cicm_malloc_vec_d(m_loudspeakers_peaks, m_number_of_loudspeakers); cicm_malloc_vec_d(m_loudspeakers_energies, m_number_of_loudspeakers); cicm_malloc_vec_d(m_loudspeakers_angles_mapped, m_number_of_loudspeakers); cicm_malloc_vec_d(m_loudspeakers_angles_width, m_number_of_loudspeakers); for(int i = 0; i < m_number_of_loudspeakers; i++) { m_loudspeakers_amplitudes[i] = 0.; m_loudspeakers_peaks[i] = 0.; m_loudspeakers_energies[i] = -90; } double curAngle, prevAngle, nextAngle, prevPortion, nextPortion; for(int i = 0; i < m_number_of_loudspeakers; i++) { curAngle = m_angles_of_loudspeakers_double[i]; if (i != 0) prevAngle = m_angles_of_loudspeakers_double[i-1]; else prevAngle = m_angles_of_loudspeakers_double[m_number_of_loudspeakers-1]; if (i != m_number_of_loudspeakers-1) nextAngle = m_angles_of_loudspeakers_double[i+1]; else nextAngle = m_angles_of_loudspeakers_double[0]; prevPortion = (curAngle - prevAngle); nextPortion = (nextAngle - curAngle); if (nextPortion < 0.) nextPortion += CICM_2PI; if (prevPortion < 0.) prevPortion += CICM_2PI; m_loudspeakers_angles_width[i] = (prevPortion + nextPortion)*0.5; m_loudspeakers_angles_mapped[i] = (curAngle - prevPortion*0.5) + m_loudspeakers_angles_width[i]*0.5; } }
void AmbisonicWider::setVectorSize(long aVectorSize) { Ambisonic::setVectorSize(aVectorSize); if(m_index_vector) free(m_index_vector); if(m_vector_double) cicm_free(m_vector_double); if(m_vector_float) cicm_free(m_vector_float); m_index_vector = new int[m_vector_size]; cicm_malloc_vec_f(m_vector_float, m_vector_size); cicm_malloc_vec_d(m_vector_double, m_vector_size); }
AmbisonicsMeter::~AmbisonicsMeter() { delete m_vectors; if(m_loudspeakers_amplitudes) cicm_free(m_loudspeakers_amplitudes); if(m_loudspeakers_peaks) cicm_free(m_loudspeakers_peaks); if(m_loudspeakers_energies) cicm_free(m_loudspeakers_energies); if(m_loudspeakers_angles_mapped) cicm_free(m_loudspeakers_angles_mapped); if(m_loudspeakers_angles_width) cicm_free(m_loudspeakers_angles_width); }
FilterConvolution::~FilterConvolution() { cicm_free(m_buffer); cicm_free(m_input_complexes); cicm_free(m_output_complexes); for(int i = 0; i < m_number_of_instances; i++) { cicm_free(m_real_vector[i]); cicm_free(m_impul_complexes[i]); } free(m_real_vector); free(m_impul_complexes); delete m_fft_instance; delete m_fft_response; }
void AmbisonicsDecoder::setNumberOfLoudspeakers(long aNumberOfLoudspeakers) { m_number_of_outputs = Tools::clip_min(aNumberOfLoudspeakers, m_number_of_harmonics); if(m_number_of_loudspeakers != m_number_of_outputs) { if(m_decoder_matrix_float) cicm_free(m_decoder_matrix_float); if(m_decoder_matrix_double) cicm_free(m_decoder_matrix_double); if(m_vector_float_output) cicm_free(m_vector_float_output); if(m_vector_double_output) cicm_free(m_vector_double_output); m_number_of_loudspeakers = m_number_of_outputs; cicm_malloc_mat_f(m_decoder_matrix_float, m_number_of_outputs, m_number_of_harmonics); cicm_malloc_mat_d(m_decoder_matrix_double, m_number_of_outputs, m_number_of_harmonics); cicm_malloc_vec_f(m_vector_float_output, m_number_of_outputs); cicm_malloc_vec_d(m_vector_double_output, m_number_of_outputs); computeMatrix(); } }
AmbisonicsDecoder::~AmbisonicsDecoder() { cicm_free(m_vector_float_input); cicm_free(m_vector_double_input); cicm_free(m_decoder_matrix_float); cicm_free(m_decoder_matrix_double); cicm_free(m_vector_float_output); cicm_free(m_vector_double_output); }
void FilterConvolution::loadImpulseResponse(cicm_vector_float anImpulseResponse) { cicm_vector_float real; cicm_malloc_vec_f(real, m_window_size); for(int i = 0; i < m_number_of_instances; i++) { for(int j = 0; j < m_window_size; j++) { if(j < m_array_size) real[j] = anImpulseResponse[j + m_array_size * i] * m_fft_instance->getScale(); else real[j] = 0.; } m_fft_response->forward(real, m_impul_complexes[i]); } cicm_free(real); }
AmbisonicWider::~AmbisonicWider() { for(int i = 0; i < m_number_of_harmonics; i++) { cicm_free(m_wider_matrix[i]); } cicm_free(m_wider_matrix); cicm_free(m_harmonics_vector_double); cicm_free(m_harmonics_vector_float); if(m_index_vector) free(m_index_vector); if(m_vector_double) cicm_free(m_vector_double); if(m_vector_float) cicm_free(m_vector_float); }