#define RATE 32000
#define RATESTR "32000"
#define WANTED RATE * 2
#define RATE 32000
#define RATESTR "32000"
#define WANTED RATE * 2
+#define ZERO_PADDING_FACTOR 2
+#define FFT_LEN (RATE * ZERO_PADDING_FACTOR)
/* Filter signals and args */
enum
/* Filter signals and args */
enum
g_mutex_lock (filter->mutex);
if (algorithm == GST_PITCH_ALGORITHM_HPS) {
if (NULL == filter->module)
g_mutex_lock (filter->mutex);
if (algorithm == GST_PITCH_ALGORITHM_HPS) {
if (NULL == filter->module)
- filter->module = (gint *) g_malloc (RATE * sizeof (gint));
+ filter->module = (gint *) g_malloc (FFT_LEN * sizeof (gint));
}
else {
if (filter->module)
}
else {
if (filter->module)
{
GstPitch *filter = GST_PITCH (trans);
{
GstPitch *filter = GST_PITCH (trans);
- filter->fft_cfg = kiss_fft_alloc (RATE, 0, NULL, NULL);
+ filter->fft_cfg = kiss_fft_alloc (FFT_LEN, 0, NULL, NULL);
- (kiss_fft_cpx *) g_malloc (RATE * sizeof (kiss_fft_cpx));
+ (kiss_fft_cpx *) g_malloc0 (FFT_LEN * sizeof (kiss_fft_cpx));
- (kiss_fft_cpx *) g_malloc (RATE * sizeof (kiss_fft_cpx));
+ (kiss_fft_cpx *) g_malloc (FFT_LEN * sizeof (kiss_fft_cpx));
{
GstStructure *s;
gint i, min_i, max_i;
{
GstStructure *s;
gint i, min_i, max_i;
- gint frequency, frequency_module;
+ gint freq_index, frequency_module;
+ gfloat frequency;
/* Extract fundamental frequency */
/* Extract fundamental frequency */
- min_i = filter->minfreq;
- max_i = filter->maxfreq;
+ frequency = 0.0;
+ min_i = filter->minfreq * ZERO_PADDING_FACTOR;
+ max_i = filter->maxfreq * ZERO_PADDING_FACTOR;
GST_DEBUG_OBJECT (filter, "min_freq = %d, max_freq = %d", filter->minfreq,
filter->maxfreq);
GST_DEBUG_OBJECT (filter, "min_freq = %d, max_freq = %d", filter->minfreq,
filter->maxfreq);
/* find strongest peak */
if (module > frequency_module) {
frequency_module = module;
/* find strongest peak */
if (module > frequency_module) {
frequency_module = module;
gint prev_frequency = 0;
gint j, t;
gint prev_frequency = 0;
gint j, t;
- for (i = min_i; i < RATE; i++) {
+ for (i = min_i; i < FFT_LEN; i++) {
filter->module[i] = (filter->spectrum[i].r * filter->spectrum[i].r);
filter->module[i] += (filter->spectrum[i].i * filter->spectrum[i].i);
filter->module[i] = (filter->spectrum[i].r * filter->spectrum[i].r);
filter->module[i] += (filter->spectrum[i].i * filter->spectrum[i].i);
}
/* Harmonic Product Spectrum algorithm */
#define MAX_DS_FACTOR (6)
}
/* Harmonic Product Spectrum algorithm */
#define MAX_DS_FACTOR (6)
- for (i = min_i; (i <= max_i) && (i < RATE); i++) {
+ for (i = min_i; (i <= max_i) && (i < FFT_LEN); i++) {
for (j = 2; j <= MAX_DS_FACTOR; j++) {
for (j = 2; j <= MAX_DS_FACTOR; j++) {
- t = i * j;
- if (t > RATE)
+ t = i * j * ZERO_PADDING_FACTOR;
+ if (t > FFT_LEN)
break;
/* this is not part of the HPS but it seems
break;
/* this is not part of the HPS but it seems
/* find strongest peak */
if (filter->module[i] > frequency_module) {
/* find strongest peak */
if (filter->module[i] > frequency_module) {
- prev_frequency = frequency;
+ prev_frequency = freq_index;
frequency_module = filter->module[i];
frequency_module = filter->module[i];
}
}
/* try to correct octave error */
}
}
/* try to correct octave error */
- if (frequency != 0 && prev_frequency != 0) {
+#if 0
+ if (freq_index != 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]);
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_module = filter->module[prev_frequency];
}
}
frequency_module = filter->module[prev_frequency];
}
}
}
g_mutex_unlock (filter->mutex);
}
g_mutex_unlock (filter->mutex);
+ frequency = (gfloat) freq_index / ZERO_PADDING_FACTOR;
/*
g_debug("freq %d[%d]\n", frequency, frequency_module);
*/
GST_DEBUG_OBJECT (filter, "preparing message, frequency = %d ", frequency);
/*
g_debug("freq %d[%d]\n", frequency, frequency_module);
*/
GST_DEBUG_OBJECT (filter, "preparing message, frequency = %d ", frequency);
- s = gst_structure_new ("pitch", "frequency", G_TYPE_INT, frequency, NULL);
+ s = gst_structure_new ("pitch", "frequency", G_TYPE_FLOAT, frequency, NULL);
return gst_message_new_element (GST_OBJECT (filter), s);
}
return gst_message_new_element (GST_OBJECT (filter), s);
}
/* update frequency info */
static void
/* update frequency info */
static void
-update_frequency (AppData * appdata, gint frequency)
+update_frequency (AppData * appdata, gfloat frequency)
{
gchar *buffer;
gint i, j;
{
gchar *buffer;
gint i, j;
gtk_label_set_text (GTK_LABEL (appdata->targetFrequency), buffer);
g_free (buffer);
gtk_label_set_text (GTK_LABEL (appdata->targetFrequency), buffer);
g_free (buffer);
- buffer = g_strdup_printf ("Played frequency is %d Hz", frequency);
+ buffer = g_strdup_printf ("Played frequency is %.2f Hz", frequency);
gtk_label_set_text (GTK_LABEL (appdata->currentFrequency), buffer);
g_free (buffer);
gtk_label_set_text (GTK_LABEL (appdata->currentFrequency), buffer);
g_free (buffer);
const gchar *name = gst_structure_get_name (s);
if (strcmp (name, "pitch") == 0) {
const gchar *name = gst_structure_get_name (s);
if (strcmp (name, "pitch") == 0) {
- frequency = g_value_get_int (gst_structure_get_value (s, "frequency"));
+ frequency = g_value_get_float (gst_structure_get_value (s, "frequency"));
if (frequency != 0)
update_frequency (data, frequency);
}
if (frequency != 0)
update_frequency (data, frequency);
}
{
AppData * appdata = (AppData *) user_data;
{
AppData * appdata = (AppData *) user_data;
- update_frequency (appdata, 440);
+ update_frequency (appdata, 440.0);