From 438cfc61ee3fae8875dbbf24a44fa7d75969f2b3 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Wed, 6 Jun 2012 21:42:40 +0000 Subject: Ajout Makefile, résolution crash malloc (tableau statique à la place). Données audio 2 channels : apparament avec un offset style [i*nchan] on obtient bcp de valeurs à 0... FFT : valeurs en sortie toutes pétées, faut débugguer. Conso CPU : correcte MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2012-violon-leds/trunk@13 6be1fa4d-33ac-4c33-becc-79fcb3794bb6 --- tests/test5/Makefile | 29 +++++++++ tests/test5/compil.sh | 7 -- tests/test5/compute.c | 172 ++++++-------------------------------------------- tests/test5/compute.h | 7 -- tests/test5/fft.c | 153 ++++++++++++++++++++++++++++++++++++++++++++ tests/test5/fft.h | 14 ++++ 6 files changed, 214 insertions(+), 168 deletions(-) create mode 100644 tests/test5/Makefile delete mode 100755 tests/test5/compil.sh create mode 100644 tests/test5/fft.c create mode 100644 tests/test5/fft.h diff --git a/tests/test5/Makefile b/tests/test5/Makefile new file mode 100644 index 0000000..8d5e47b --- /dev/null +++ b/tests/test5/Makefile @@ -0,0 +1,29 @@ +CC=gcc +CFLAGS=-W -Wall -Werror -Wno-error=unused-parameter -g +LDFLAGS=-Werror -g +EXEC=test5 + +CFLAGS+=$(shell pkg-config --cflags gtk+-2.0 gthread-2.0 libpulse) +LDFLAGS+=$(shell pkg-config --libs gtk+-2.0 gthread-2.0 libpulse) + +SRC= $(wildcard *.c) +OBJ= $(SRC:.c=.o) + +all: $(EXEC) + +$(EXEC): $(OBJ) + $(CC) -o $@ $^ $(LDFLAGS) + +#main.o: hello.h + +%.o: %.c + $(CC) -o $@ -c $< $(CFLAGS) + +.PHONY: clean mrproper + +clean: + rm *.o + +mrproper: clean + rm $(EXEC) + diff --git a/tests/test5/compil.sh b/tests/test5/compil.sh deleted file mode 100755 index 776669a..0000000 --- a/tests/test5/compil.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -ex -gcc -Wall -g -c gtkvumeter.c $(pkg-config --cflags gtk+-2.0) -gcc -Wall -g -c win_main.c $(pkg-config --cflags gtk+-2.0) -gcc -Wall -g -c compute.c $(pkg-config --cflags gtk+-2.0) -gcc -Wall -g -c test5.c $(pkg-config --cflags gtk+-2.0 gthread-2.0 libpulse) -gcc -Wall -g -c capture.c $(pkg-config --cflags gtk+-2.0 libpulse) -gcc -Wall -o test5 *.o $(pkg-config --libs gtk+-2.0 gthread-2.0 libpulse) diff --git a/tests/test5/compute.c b/tests/test5/compute.c index f6f08c4..2658904 100644 --- a/tests/test5/compute.c +++ b/tests/test5/compute.c @@ -1,20 +1,21 @@ #include "compute.h" -#include +#include "fft.h" #include -#define MaxFastBits 16 - -int **gFFTBitTable = NULL; +#define MAX_SAMPLES 2048 gfloat compute_level(const float *data, size_t nsamples, size_t nchan) { + double rate=44100; //TODO dynamique size_t i; - float level=0; - float *input = malloc(nsamples*sizeof(float)); - float *output = malloc(nsamples*sizeof(float)); + float input[MAX_SAMPLES], output[MAX_SAMPLES]; + float level; - double rate=44100; //TODO dynamique + if (nsamples >= MAX_SAMPLES) { + printf("WARN : nsamples >= MAX_SAMPLES : %i >= %i\n", nsamples, MAX_SAMPLES); + nsamples=MAX_SAMPLES; + } /* Just return the max peak for (i=0;i>= 1; - } - - return rev; -} - - void audio2hsv_1(gint audio_level, gint *light_h, gint *light_s, gint *light_v) { // Dummy code *light_h=-audio_level; diff --git a/tests/test5/compute.h b/tests/test5/compute.h index 90230a7..24d57e9 100644 --- a/tests/test5/compute.h +++ b/tests/test5/compute.h @@ -7,13 +7,6 @@ gfloat compute_level(const float *data, size_t nsamples, size_t nchan); void compute_spectrom(float * data, int width, double rate, float *output); void PowerSpectrum(float *In, float *Out); -void FFT(int NumSamples, gboolean InverseTransform, - float *RealIn, float *ImagIn, float *RealOut, float *ImagOut); -void InitFFT(); -int NumberOfBitsNeeded(int PowerOfTwo); -inline int FastReverseBits(int i, int NumBits); -int ReverseBits(int index, int NumBits); - void audio2hsv_1(gint audio_level, gint *light_h, gint *light_s, gint *light_v); void hsv2rgb(gint h, gint s, gint v, gint *r, gint *g, gint *b); diff --git a/tests/test5/fft.c b/tests/test5/fft.c new file mode 100644 index 0000000..902d7f0 --- /dev/null +++ b/tests/test5/fft.c @@ -0,0 +1,153 @@ +#include "fft.h" +#include +#include + +#define MaxFastBits 16 + +int **gFFTBitTable = NULL; + +void FFT(int NumSamples, + gboolean InverseTransform, + float *RealIn, float *ImagIn, float *RealOut, float *ImagOut) +{ + int NumBits; /* Number of bits needed to store indices */ + int i, j, k, n; + int BlockSize, BlockEnd; + + double angle_numerator = 2.0 * M_PI; + double tr, ti; /* temp real, temp imaginary */ +/* + if (!IsPowerOfTwo(NumSamples)) { + fprintf(stderr, "%d is not a power of two\n", NumSamples); + exit(1); + } +*/ + if (!gFFTBitTable) + InitFFT(); + + if (!InverseTransform) + angle_numerator = -angle_numerator; + + NumBits = NumberOfBitsNeeded(NumSamples); + + /* + ** Do simultaneous data copy and bit-reversal ordering into outputs... + */ + for (i = 0; i < NumSamples; i++) { + j = FastReverseBits(i, NumBits); + RealOut[j] = RealIn[i]; + ImagOut[j] = (ImagIn == NULL) ? 0.0 : ImagIn[i]; + } + + /* + ** Do the FFT itself... + */ + + BlockEnd = 1; + for (BlockSize = 2; BlockSize <= NumSamples; BlockSize <<= 1) { + + double delta_angle = angle_numerator / (double) BlockSize; + + double sm2 = sin(-2 * delta_angle); + double sm1 = sin(-delta_angle); + double cm2 = cos(-2 * delta_angle); + double cm1 = cos(-delta_angle); + double w = 2 * cm1; + double ar0, ar1, ar2, ai0, ai1, ai2; + + for (i = 0; i < NumSamples; i += BlockSize) { + ar2 = cm2; + ar1 = cm1; + + ai2 = sm2; + ai1 = sm1; + + for (j = i, n = 0; n < BlockEnd; j++, n++) { + ar0 = w * ar1 - ar2; + ar2 = ar1; + ar1 = ar0; + + ai0 = w * ai1 - ai2; + ai2 = ai1; + ai1 = ai0; + + k = j + BlockEnd; + tr = ar0 * RealOut[k] - ai0 * ImagOut[k]; + ti = ar0 * ImagOut[k] + ai0 * RealOut[k]; + + RealOut[k] = RealOut[j] - tr; + ImagOut[k] = ImagOut[j] - ti; + + RealOut[j] += tr; + ImagOut[j] += ti; + } + } + BlockEnd = BlockSize; + } + + /* + ** Need to normalize if inverse transform... + */ + + if (InverseTransform) { + float denom = (float) NumSamples; + + for (i = 0; i < NumSamples; i++) { + RealOut[i] /= denom; + ImagOut[i] /= denom; + } + } +} + +void InitFFT() +{ + gFFTBitTable = malloc(MaxFastBits*sizeof(int)); + + int len = 2; + int b, i; + for (b=1; b<=MaxFastBits; b++) { + gFFTBitTable[b-1]=malloc(len*sizeof(int)); + + for (i=0; i>= 1; + } + + return rev; +} + + diff --git a/tests/test5/fft.h b/tests/test5/fft.h new file mode 100644 index 0000000..7f2f0de --- /dev/null +++ b/tests/test5/fft.h @@ -0,0 +1,14 @@ +#ifndef FFT_H +#define FFT_H + +#include + +void FFT(int NumSamples, gboolean InverseTransform, + float *RealIn, float *ImagIn, float *RealOut, float *ImagOut); +void InitFFT(); +int NumberOfBitsNeeded(int PowerOfTwo); +inline int FastReverseBits(int i, int NumBits); +int ReverseBits(int index, int NumBits); + +#endif + -- cgit v1.2.3