|
Packit |
67cb25 |
#include <stdio.h>
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include <gsl/gsl_math.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_filter.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_rng.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_randist.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_vector.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
main(void)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const size_t N = 1000; /* length of time series */
|
|
Packit |
67cb25 |
const size_t K = 7; /* window size */
|
|
Packit |
67cb25 |
const double f = 5.0; /* frequency of square wave in Hz */
|
|
Packit |
67cb25 |
gsl_filter_median_workspace *median_p = gsl_filter_median_alloc(K);
|
|
Packit |
67cb25 |
gsl_filter_rmedian_workspace *rmedian_p = gsl_filter_rmedian_alloc(K);
|
|
Packit |
67cb25 |
gsl_vector *t = gsl_vector_alloc(N); /* time */
|
|
Packit |
67cb25 |
gsl_vector *x = gsl_vector_alloc(N); /* input vector */
|
|
Packit |
67cb25 |
gsl_vector *y_median = gsl_vector_alloc(N); /* median filtered output */
|
|
Packit |
67cb25 |
gsl_vector *y_rmedian = gsl_vector_alloc(N); /* recursive median filtered output */
|
|
Packit |
67cb25 |
gsl_rng *r = gsl_rng_alloc(gsl_rng_default);
|
|
Packit |
67cb25 |
size_t i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* generate input signal */
|
|
Packit |
67cb25 |
for (i = 0; i < N; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double ti = (double) i / (N - 1.0);
|
|
Packit |
67cb25 |
double tmp = sin(2.0 * M_PI * f * ti);
|
|
Packit |
67cb25 |
double xi = (tmp >= 0.0) ? 1.0 : -1.0;
|
|
Packit |
67cb25 |
double ei = gsl_ran_gaussian(r, 0.1);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_set(t, i, ti);
|
|
Packit |
67cb25 |
gsl_vector_set(x, i, xi + ei);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_filter_median(GSL_FILTER_END_PADVALUE, x, y_median, median_p);
|
|
Packit |
67cb25 |
gsl_filter_rmedian(GSL_FILTER_END_PADVALUE, x, y_rmedian, rmedian_p);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* print results */
|
|
Packit |
67cb25 |
for (i = 0; i < N; ++i)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double ti = gsl_vector_get(t, i);
|
|
Packit |
67cb25 |
double xi = gsl_vector_get(x, i);
|
|
Packit |
67cb25 |
double medi = gsl_vector_get(y_median, i);
|
|
Packit |
67cb25 |
double rmedi = gsl_vector_get(y_rmedian, i);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
printf("%f %f %f %f\n",
|
|
Packit |
67cb25 |
ti,
|
|
Packit |
67cb25 |
xi,
|
|
Packit |
67cb25 |
medi,
|
|
Packit |
67cb25 |
rmedi);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_vector_free(t);
|
|
Packit |
67cb25 |
gsl_vector_free(x);
|
|
Packit |
67cb25 |
gsl_vector_free(y_median);
|
|
Packit |
67cb25 |
gsl_vector_free(y_rmedian);
|
|
Packit |
67cb25 |
gsl_rng_free(r);
|
|
Packit |
67cb25 |
gsl_filter_median_free(median_p);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return 0;
|
|
Packit |
67cb25 |
}
|