aboutsummaryrefslogtreecommitdiff
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
parentbba33ea0a0764bf9f5903b031cb36604c4314a69 (diff)
fft resize
-rw-r--r--Sgraph.c2
-rw-r--r--Sgraph.h1
-rw-r--r--fft.c32
-rw-r--r--fft.h4
-rw-r--r--spectrogram.c4
5 files changed, 28 insertions, 15 deletions
diff --git a/Sgraph.c b/Sgraph.c
index b1be364..22b46f9 100644
--- a/Sgraph.c
+++ b/Sgraph.c
@@ -234,7 +234,7 @@ Redisplay(Widget w, XEvent *event, Region r)
if (!XtIsRealized(w))
return;
- bottom = sw->core.height;
+ bottom = sw->core.height - 10;
for (x = 0; x < sw->sgraph.size / 2; x++) {
yl = sw->sgraph.leftData[x];
diff --git a/Sgraph.h b/Sgraph.h
index 7bd05d5..324958b 100644
--- a/Sgraph.h
+++ b/Sgraph.h
@@ -19,6 +19,7 @@
#define _Sgraph_h
#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
/****************************************************************
*
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);
diff --git a/fft.h b/fft.h
index acbb205..70a8b68 100644
--- a/fft.h
+++ b/fft.h
@@ -19,8 +19,8 @@
#define __FFT_H
__BEGIN_DECLS
-int init_fft(size_t);
-int exec_fft(double *, size_t);
+void init_fft(size_t);
+void exec_fft(double *, size_t);
void free_fft(void);
__END_DECLS
diff --git a/spectrogram.c b/spectrogram.c
index f01ec2a..d6233b4 100644
--- a/spectrogram.c
+++ b/spectrogram.c
@@ -77,7 +77,7 @@ worker(XtPointer data)
double *left, *right;
n = 0;
- XtSetArg(arg[n], XtNsize, &size); n++;
+ XtSetArg(arg[n], XtNwidth, &size); n++;
XtSetArg(arg[n], XtNsamples, &samples); n++;
XtSetArg(arg[n], XtNleftData, &left); n++;
XtSetArg(arg[n], XtNrightData, &right); n++;
@@ -86,8 +86,6 @@ worker(XtPointer data)
size = read_sio(left, right, size);
exec_fft(left, size);
exec_fft(right, size);
- //warnx("samples: %d, size: %d, %d", samples, size, n);
- //warnx("l/r: %p (%lf) / %p (%lf)", left, *left, right, *right);
n = 0;
XtSetArg(arg[n], XtNsize, size); n++;