mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann
This commit is contained in:
parent
d3a24dc842
commit
782d6af83d
1 changed files with 33 additions and 6 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue