void TransientIndex::initialize() { dctMatrix = new double[filters * mels]; filterBank = new double[filters * spectrumSize]; filterTemp = new double[filters]; mfccNew = new double[mels]; mfccOld = new double[mels]; // Initialisation double min_mel = hz_to_mel(50.0); double max_mel = hz_to_mel(sampleRate / 2); double* filter_values = new double[spectrumSize]; double* filter_centers = new double[filters + 2]; for (int i = 0; i < spectrumSize; i++) filter_values[i] = double(sampleRate * i) / double(2 * (spectrumSize - 1)); for (int i = 0; i < mels; i++) { for (int j = 0; j < filters; j++) dctMatrix[i * filters + j] = cos((i + 1) * (PI / filters * (j + 0.5))); } for (int i = 0; i < filters + 2; i++) filter_centers[i] = mel_to_hz(min_mel + ((max_mel - min_mel) / (filters + 1)) * i); for (int i = 0; i < filters; i++) { for (int j = 0; j < spectrumSize; j++) { if (filter_values[j] >= filter_centers[i] && filter_values[j] < filter_centers[i + 1]) filterBank[(i * spectrumSize) + j] = (filter_values[j] - filter_centers[i]) / (filter_centers[i + 1] - filter_centers[i]); else if (filter_values[j] >= filter_centers[i + 1] && filter_values[j] < filter_centers[i + 2]) filterBank[(i * spectrumSize) + j] = (filter_values[j] - filter_centers[i + 2]) / (filter_centers[i + 1] - filter_centers[i + 2]); else filterBank[(i * spectrumSize) + j] = 0; } } for (int i = 0; i < mels; i++) { mfccNew[i] = 0; mfccOld[i] = 0; } for (int i = 0; i < filters; i++) filterTemp[i] = 0; delete[] filter_values; delete[] filter_centers; }
recur_bin_slopes_new(const int n_bins, const int fft_len, const float fmin, const float fmax, const float fknee, const float ffocus, const float audio_rate){ const int n_slopes = n_bins + 1; RecurAudioBinSlope * slopes = malloc_aligned_or_die(n_slopes * sizeof(RecurAudioBinSlope)); int i; const float mmin = hz_to_mel(fmin, fknee, ffocus); const float mmax = hz_to_mel(fmax, fknee, ffocus); const float step = (mmax - mmin) / n_slopes; float hz_to_samples = fft_len * 2 / audio_rate; float hz = fmin; float mel = mmin; float right = hz * hz_to_samples; MAYBE_DEBUG("mmin %f mmax %f, fmin %f, fmax %f fknee %f ffocus %f", mmin, mmax, fmin, fmax, fknee, ffocus); for (i = 0; i < n_slopes; i++){ RecurAudioBinSlope *s = &slopes[i]; float left = right; s->left = (int)left; s->left_fraction = 1.0 - (left - s->left); mel += step; hz = mel_to_hz(mel, fknee, ffocus); right = hz * hz_to_samples; s->right = (int)right; s->right_fraction = right - s->right; s->slope = 1.0 / (right - left); if (s->left == s->right){ /*triangle is too little! */ s->left_fraction = (right - left); s->right_fraction = 0; } s->log_scale = logf(1.0f + right - left); MAYBE_DEBUG("slope %d: left %d+%.2f right %d+%.2f log_scale %f hz %f" " mel %f mmin %f mmax %f", i, s->left, s->left_fraction, s->right, s->right_fraction, s->log_scale, hz, mel, mmin, mmax); } return slopes; }