Exemple #1
0
	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;
	}
Exemple #2
0
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;
}