audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann

This commit is contained in:
Jordi Burguet-Castell 2011-04-11 18:41:43 -05:00 committed by Sebastian Dröge
parent d3a24dc842
commit 782d6af83d

View file

@ -26,6 +26,8 @@
* chapter 16 * chapter 16
* available at http://www.dspguide.com/ * available at http://www.dspguide.com/
* *
* For the window functions see
* http://en.wikipedia.org/wiki/Window_function
*/ */
/** /**
@ -103,7 +105,10 @@ gst_audio_wsinclimit_mode_get_type (void)
enum enum
{ {
WINDOW_HAMMING = 0, WINDOW_HAMMING = 0,
WINDOW_BLACKMAN WINDOW_BLACKMAN,
WINDOW_GAUSSIAN,
WINDOW_COSINE,
WINDOW_HANN
}; };
#define GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW (gst_audio_wsinclimit_window_get_type ()) #define GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW (gst_audio_wsinclimit_window_get_type ())
@ -118,6 +123,12 @@ gst_audio_wsinclimit_window_get_type (void)
"hamming"}, "hamming"},
{WINDOW_BLACKMAN, "Blackman window", {WINDOW_BLACKMAN, "Blackman window",
"blackman"}, "blackman"},
{WINDOW_GAUSSIAN, "Gaussian window",
"gaussian"},
{WINDOW_COSINE, "Cosine window",
"cosine"},
{WINDOW_HANN, "Hann window",
"hann"},
{0, NULL, NULL} {0, NULL, NULL}
}; };
@ -142,6 +153,9 @@ static void gst_audio_wsinclimit_finalize (GObject * object);
static gboolean gst_audio_wsinclimit_setup (GstAudioFilter * base, static gboolean gst_audio_wsinclimit_setup (GstAudioFilter * base,
GstRingBufferSpec * format); GstRingBufferSpec * format);
#define POW2(x) (x)*(x)
/* Element class */ /* Element class */
static void static void
@ -249,11 +263,24 @@ gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self)
else else
kernel[i] = sin (w * (i - len / 2)) / (i - len / 2); kernel[i] = sin (w * (i - len / 2)) / (i - len / 2);
/* windowing */ /* windowing */
if (self->window == WINDOW_HAMMING) switch (self->window) {
kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / len)); case WINDOW_HAMMING:
else kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1)));
kernel[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / len) + break;
0.08 * cos (4 * G_PI * i / len)); case WINDOW_BLACKMAN:
kernel[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) +
0.08 * cos (4 * G_PI * i / (len - 1)));
break;
case WINDOW_GAUSSIAN:
kernel[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1))));
break;
case WINDOW_COSINE:
kernel[i] *= cos (G_PI * i / (len - 1) - G_PI / 2);
break;
case WINDOW_HANN:
kernel[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1)));
break;
}
} }
/* normalize for unity gain at DC */ /* normalize for unity gain at DC */