From a96e6ccdca73f9c57a9d08dea3d3c36a07ab986f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 23 Jun 2013 13:34:03 +0000 Subject: remove scaling, simplify fft --- Makefile | 2 +- fft.c | 47 ++++++++++++++++++----------------------------- fft.h | 2 +- spectrogram.c | 13 ++----------- 4 files changed, 22 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 5bcfce5..25593b4 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ PCCF!= pkg-config --cflags ${LIBS} PCLA!= pkg-config --libs ${LIBS} CFLAGS+=${PCCF} LDADD+= ${PCLA} -lsndio -DEBUG+= -Wall +DEBUG+= -Wall -ggdb NOMAN= .include diff --git a/fft.c b/fft.c index a13eaad..06c1670 100644 --- a/fft.c +++ b/fft.c @@ -51,18 +51,12 @@ init_fft(int n) { struct fft *p; - p = malloc(2 * sizeof(struct fft)); + p = malloc(sizeof(struct fft)); - p[0].n = n; - p[0].in = fftw_malloc(n * sizeof(double)); - p[0].out = fftw_malloc(n * sizeof(double)); - p[0].plan = fftw_plan_r2r_1d(n, p[0].in, p[0].out, - FFTW_R2HC, FFTW_MEASURE); - - p[1].n = n; - p[1].in = fftw_malloc(n * sizeof(double)); - p[1].out = fftw_malloc(n * sizeof(double)); - p[1].plan = fftw_plan_r2r_1d(n, p[1].in, p[1].out, + 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->window = hamming(n); @@ -71,33 +65,28 @@ init_fft(int n) } int -dofft(struct fft *p, int16_t *data, double *left, double *right, int n, float scala) +dofft(struct fft *p, int16_t *data, double *out, int odd) { int i; - for (i = 0; i < n; i++) { - p[0].in[i] = p->window[i] * data[2 * i + 0] / (double)INT16_MAX; - p[1].in[i] = p->window[i] * data[2 * i + 1] / (double)INT16_MAX; - } + for (i = 0; i < p->n; i++) + p->in[i] = p->window[i] * data[2 * i + odd] + / (double)INT16_MAX; - fftw_execute(p[0].plan); - fftw_execute(p[1].plan); + fftw_execute(p->plan); - for (i = 1; i < n / 2; i++) { - left[i - 1] = sqrt(scala * i - * (pow(p[0].out[i], 2) + pow(p[0].out[n - i], 2))); - right[i - 1] = sqrt(scala * i - * (pow(p[1].out[i], 2) + pow(p[1].out[n - i], 2))); - } + for (i = 1; i < p->n / 2; i++) + out[i - 1] = sqrt(i * (pow(p->out[i], 2) + + pow(p->out[p->n - i], 2))); return 0; } void -del_fft(struct fft *fft) +del_fft(struct fft *p) { - fftw_free(fft->in); - fftw_free(fft->out); - free(fft->window); - free(fft); + fftw_free(p->in); + fftw_free(p->out); + free(p->window); + free(p); } diff --git a/fft.h b/fft.h index 1e89451..6f0f3bc 100644 --- a/fft.h +++ b/fft.h @@ -21,7 +21,7 @@ struct fft; struct fft *init_fft(int); -int dofft(struct fft *, int16_t *, double *, double *, int, float); +int dofft(struct fft *, int16_t *, double *, int); void del_fft(struct fft *); #endif diff --git a/spectrogram.c b/spectrogram.c index 3372696..58b5181 100644 --- a/spectrogram.c +++ b/spectrogram.c @@ -281,8 +281,6 @@ main(int argc, char **argv) struct fft *fft; struct data data; - float scala = 1.0; - int ch, dflag = 1; int delta; int psize, ssize; @@ -361,7 +359,8 @@ main(int argc, char **argv) while (!die) { read_sio(sio, data.buffer, data.bufsz); - dofft(fft, data.buffer, data.left, data.right, delta, scala); + dofft(fft, data.buffer, data.left, 0); + dofft(fft, data.buffer, data.right, 1); draw(&data); while (XPending(dsp)) { @@ -375,14 +374,6 @@ main(int argc, char **argv) case XK_q: die = 1; break; - case XK_KP_Add: - scala *= 2; - msg("inc scala: %f", scala); - break; - case XK_KP_Subtract: - scala /= 2; - msg("dec scala: %f", scala); - break; default: break; } -- cgit v1.2.3