aboutsummaryrefslogtreecommitdiff
path: root/fft.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2013-09-03 01:09:03 +0000
committerDimitri Sokolyuk <demon@dim13.org>2013-09-03 01:09:03 +0000
commiteb0fd10c40eb7f58a2b894fd32663c8fbfbd504f (patch)
treedada3cfa767c7594827d48c3b747a14035911add /fft.c
parentd8879c536f6ae4a9c00429d91add5a447f7278a4 (diff)
add resize_fft
Diffstat (limited to 'fft.c')
-rw-r--r--fft.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/fft.c b/fft.c
index 06c1670..1e0e426 100644
--- a/fft.c
+++ b/fft.c
@@ -26,12 +26,12 @@ struct fft {
fftw_plan plan;
double *in;
double *out;
- int n;
+ size_t n;
double *window;
};
double *
-hamming(int n)
+hamming(size_t n)
{
double *w;
int i;
@@ -47,19 +47,36 @@ hamming(int n)
}
struct fft *
-init_fft(int n)
+resize_fft(struct fft *p, size_t n)
{
- struct fft *p;
+ if (n != p->n) {
+ p->n = n;
+
+ if (p->in)
+ fftw_free(p->in);
+ p->in = fftw_malloc(p->n * sizeof(double));
+
+ if (p->out)
+ fftw_free(p->out);
+ p->out = fftw_malloc(p->n * sizeof(double));
- p = malloc(sizeof(struct fft));
+ if (p->window)
+ free(p->window);
+ p->window = hamming(p->n);
- p->n = n;
- p->in = fftw_malloc(n * sizeof(double));
- p->out = fftw_malloc(n * sizeof(double));
- p->plan = fftw_plan_r2r_1d(n, p->in, p->out,
- FFTW_R2HC, FFTW_MEASURE);
+ p->plan = fftw_plan_r2r_1d(p->n, p->in, p->out,
+ FFTW_R2HC, FFTW_MEASURE);
+ }
+ return p;
+}
+
+struct fft *
+init_fft(size_t n)
+{
+ struct fft *p;
- p->window = hamming(n);
+ p = calloc(1, sizeof(struct fft));
+ p = resize_fft(p, n);
return p;
}