aboutsummaryrefslogtreecommitdiff
path: root/fft.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2014-09-19 13:15:36 +0000
committerDimitri Sokolyuk <demon@dim13.org>2014-09-19 13:15:36 +0000
commit055d8b92e8d9211e147f439070e470df5098912a (patch)
tree1e1c1fc44a403f9a69f08d3a62bdf7e18a29b8f6 /fft.c
parentbba33ea0a0764bf9f5903b031cb36604c4314a69 (diff)
fft resize
Diffstat (limited to 'fft.c')
-rw-r--r--fft.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/fft.c b/fft.c
index fd1185f..3698447 100644
--- a/fft.c
+++ b/fft.c
@@ -64,25 +64,40 @@ squares(size_t n)
return p;
}
-int
-init_fft(size_t n)
+void
+resize_fft(size_t n)
{
- in = fftw_malloc(n * sizeof(double));
- out = fftw_malloc(n * sizeof(fftw_complex) / 2);
- assert(in && out);
+ fftw_plan oldplan = plan;
+ double *oldwindow = window;
+ double *oldsq = sq;
plan = fftw_plan_dft_r2c_1d(n, in, out, FFTW_MEASURE);
window = hamming(n);
sq = squares(n / 2);
sz = n;
- return 0;
+ fftw_destroy_plan(oldplan);
+ free(oldwindow);
+ free(oldsq);
+}
+
+void
+init_fft(size_t n)
+{
+ in = fftw_malloc(n * sizeof(double));
+ out = fftw_malloc(n * sizeof(fftw_complex) / 2);
+ assert(in && out);
+
+ resize_fft(n);
}
-int
+void
exec_fft(double *io, size_t n)
{
int i;
+
+ if (n != sz)
+ resize_fft(n);
for (i = 0; i < sz; i++)
in[i] = window[i] * io[i];
@@ -91,13 +106,12 @@ exec_fft(double *io, size_t n)
for (i = 0; i < sz / 2; i++)
io[i] = sq[i] * cabs(out[i]);
-
- return 0;
}
void
free_fft(void)
{
+ fftw_destroy_plan(plan);
fftw_free(in);
fftw_free(out);
free(window);