+ case GST_PITCH_ALGORITHM_FFT:
+ {
+ gint module = 0;
+
+ for (i = min_i; i < max_i; i++) {
+ module = (filter->spectrum[i].r * filter->spectrum[i].r);
+ module += (filter->spectrum[i].i * filter->spectrum[i].i);
+
+ if (module > 0)
+ GST_LOG_OBJECT (filter, "module[%d] = %d", i, module);
+
+ /* find strongest peak */
+ if (module > frequency_module) {
+ frequency_module = module;
+ frequency = i;
+ }
+ }
+ }
+ break;
+
+ case GST_PITCH_ALGORITHM_HPS:
+ {
+ gint prev_frequency = 0;
+ gint j, t;
+
+ for (i = min_i; i < RATE; i++) {
+ filter->module[i] = (filter->spectrum[i].r * filter->spectrum[i].r);
+ filter->module[i] += (filter->spectrum[i].i * filter->spectrum[i].i);
+
+ if (filter->module[i] > 0)
+ GST_LOG_OBJECT (filter, "module[%d] = %d", i, filter->module[i]);
+
+ }
+ /* Harmonic Product Spectrum algorithm */
+#define MAX_DS_FACTOR (6)
+ for (i = min_i; (i <= max_i) && (i < RATE); i++) {
+ for (j = 2; j <= MAX_DS_FACTOR; j++) {
+ t = i * j;
+ if (t > RATE)
+ break;
+
+ /* this is not part of the HPS but it seems
+ * there are lots of zeroes in the spectrum ...
+ */
+ if (filter->module[t] != 0)
+ filter->module[i] *= filter->module[t];
+ }
+
+ /* find strongest peak */
+ if (filter->module[i] > frequency_module) {
+ prev_frequency = frequency;
+ frequency_module = filter->module[i];
+ frequency = i;
+ }
+ }
+
+ /* try to correct octave error */
+ if (frequency != 0 && prev_frequency != 0) {
+ float ratio = (float) frequency / (float) prev_frequency;
+ if (ratio >= 1.9 && ratio < 2.1 && (float) filter->module[prev_frequency] >= 0.2 * (float) frequency_module ) {
+ g_debug("Chose freq %d[%d] over %d[%d]\n", prev_frequency, filter->module[prev_frequency], frequency, filter->module[frequency]);
+ frequency = prev_frequency;
+ frequency_module = filter->module[prev_frequency];
+ }
+ }
+ }
+ break;
+ default:
+ break;