spek

Acoustic spectrum analyser
git clone http://git.hanabi.in/repos/spek.git
Log | Files | Refs | README

commit 546d61c0a8b065f40914e6a298b53b231263cf28
parent 48afd3b4e89b15a6fa14e7e4613b78ae8f263ac9
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date:   Sun,  5 Aug 2012 17:56:06 -0700

Add spek-fft.c

Diffstat:
Msrc/Makefile.am | 2++
Msrc/spek-audio.h | 2+-
Msrc/spek-fft.c | 37++++++++++++++++++++-----------------
Msrc/spek-fft.h | 43+++++++++++++++++++++++++------------------
4 files changed, 48 insertions(+), 36 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am @@ -2,6 +2,8 @@ bin_PROGRAMS = spek spek_SOURCES = \ spek.cc \ + spek-fft.c \ + spek-fft.h \ spek-window.cc \ spek-window.hh diff --git a/src/spek-audio.h b/src/spek-audio.h @@ -1,6 +1,6 @@ /* spek-audio.h * - * Copyright (C) 2010 Alexander Kojevnikov <alexander@kojevnikov.com> + * Copyright (C) 2010-2012 Alexander Kojevnikov <alexander@kojevnikov.com> * * Spek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/spek-fft.c b/src/spek-fft.c @@ -1,6 +1,6 @@ /* spek-fft.c * - * Copyright (C) 2010 Alexander Kojevnikov <alexander@kojevnikov.com> + * Copyright (C) 2010-2012 Alexander Kojevnikov <alexander@kojevnikov.com> * * Spek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,29 +21,31 @@ #include "spek-fft.h" -SpekFftPlan * spek_fft_plan_new (gint n, gint threshold) { - gint bits; - SpekFftPlan *p = g_new0 (SpekFftPlan, 1); - p->input = av_mallocz (sizeof (gfloat) * n); - p->output = av_mallocz (sizeof (gfloat) * (n / 2 + 1)); +struct spek_fft_plan * spek_fft_plan_new(int n, int threshold) +{ + int bits; + struct spek_fft_plan *p = malloc(sizeof(struct spek_fft_plan)); + p->input = av_mallocz(sizeof(float) * n); + p->output = av_mallocz(sizeof(float) * (n / 2 + 1)); p->threshold = threshold; - for (bits = 0; n; n >>= 1, bits++); + for(bits = 0; n; n >>= 1, ++bits); p->n = 1 << --bits; - p->cx = av_rdft_init (bits, DFT_R2C); + p->cx = av_rdft_init(bits, DFT_R2C); return p; } -void spek_fft_execute (SpekFftPlan *p) { +void spek_fft_execute(struct spek_fft_plan *p) +{ int i; int n = p->n; - av_rdft_calc (p->cx, p->input); + av_rdft_calc(p->cx, p->input); - /* Calculate magnitudes */ + // Calculate magnitudes. p->output[0] = p->input[0] * p->input[0] / (n * n); p->output[n / 2] = p->input[1] * p->input[1] / (n * n); for (i = 1; i < n / 2; i++) { - gfloat val; + float val; val = p->input[i * 2] * p->input[i * 2] + p->input[i * 2 + 1] * p->input[i * 2 + 1]; val /= n * n; val = 10.0 * log10f (val); @@ -51,9 +53,10 @@ void spek_fft_execute (SpekFftPlan *p) { } } -void spek_fft_destroy (SpekFftPlan *p) { - av_rdft_end (p->cx); - av_free (p->input); - av_free (p->output); - g_free (p); +void spek_fft_destroy(struct spek_fft_plan *p) +{ + av_rdft_end(p->cx); + av_free(p->input); + av_free(p->output); + free(p); } diff --git a/src/spek-fft.h b/src/spek-fft.h @@ -1,6 +1,6 @@ /* spek-fft.h * - * Copyright (C) 2010 Alexander Kojevnikov <alexander@kojevnikov.com> + * Copyright (C) 2010-2012 Alexander Kojevnikov <alexander@kojevnikov.com> * * Spek is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,30 +16,37 @@ * along with Spek. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __SPEK_FFT_H__ -#define __SPEK_FFT_H__ +#ifndef SPEK_FFT_H__ +#define SPEK_FFT_H__ + +#ifdef __cplusplus +extern "C" { +#endif -#include <glib.h> #include <libavcodec/avfft.h> -typedef struct { - /* Internal data */ +struct spek_fft_plan { + // Internal data. RDFTContext *cx; - gint n; - gint threshold; + int n; + int threshold; - /* Exposed properties */ - gfloat *input; - gfloat *output; -} SpekFftPlan; + // Exposed properties. + float *input; + float *output; +}; -/* Allocate buffers and create a new FFT plan */ -SpekFftPlan * spek_fft_plan_new (gint n, gint threshold); +// Allocate buffers and create a new FFT plan. +struct spek_fft_plan * spek_fft_plan_new(int n, int threshold); -/* Execute the FFT on plan->input */ -void spek_fft_execute (SpekFftPlan *p); +// Execute the FFT on plan->input. +void spek_fft_execute(struct spek_fft_plan *p); -/* Destroy the plan and de-allocate buffers */ -void spek_fft_destroy (SpekFftPlan *p); +// Destroy the plan and de-allocate buffers. +void spek_fft_delete(struct spek_fft_plan *p); + +#ifdef __cplusplus +} +#endif #endif