diff options
-rw-r--r-- | tests/test5/Makefile | 29 | ||||
-rwxr-xr-x | tests/test5/compil.sh | 7 | ||||
-rw-r--r-- | tests/test5/compute.c | 172 | ||||
-rw-r--r-- | tests/test5/compute.h | 7 | ||||
-rw-r--r-- | tests/test5/fft.c | 153 | ||||
-rw-r--r-- | tests/test5/fft.h | 14 |
6 files changed, 214 insertions, 168 deletions
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 <stdlib.h> +#include "fft.h" #include <math.h> -#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<nsamples;i+=nchan) { val=((float *)data)[i]; @@ -24,14 +25,22 @@ gfloat compute_level(const float *data, size_t nsamples, size_t nchan) { } */ for (i=0;i<nsamples;i++) { - input[i]=data[i*nchan]; + input[i]=data[i/**nchan*/]; +/* printf("\r%f ", input[i]); + fflush(stdout); +*/ } +// printf("\n"); compute_spectrom(input, nsamples, rate, output); + level=0; for (i=0;i<nsamples;i++) { level+=output[i]; + //printf("\r%f ", output[i]); + //fflush(stdout); } + //printf("\n"); return level/nsamples; } @@ -148,151 +157,6 @@ void PowerSpectrum(float *In, float *Out) Out[128 / 2] = rt * rt + it * it; } -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<len; i++) - gFFTBitTable[b-1][i] = ReverseBits(i, b); - - len <<= 1; - } -} - -int NumberOfBitsNeeded(int PowerOfTwo) -{ - int i; - -/* - if (PowerOfTwo < 2) { - fprintf(stderr, "Error: FFT called with size %d\n", PowerOfTwo); - exit(1); - } -*/ - for (i = 0;; i++) - if (PowerOfTwo & (1 << i)) - return i; -} - -inline int FastReverseBits(int i, int NumBits) -{ - if (NumBits <= MaxFastBits) - return gFFTBitTable[NumBits - 1][i]; - else - return ReverseBits(i, NumBits); -} - -int ReverseBits(int index, int NumBits) -{ - int i, rev; - - for (i = rev = 0; i < NumBits; i++) { - rev = (rev << 1) | (index & 1); - index >>= 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 <math.h> +#include <stdlib.h> + +#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<len; i++) + gFFTBitTable[b-1][i] = ReverseBits(i, b); + + len <<= 1; + } +} + +int NumberOfBitsNeeded(int PowerOfTwo) +{ + int i; + +/* + if (PowerOfTwo < 2) { + fprintf(stderr, "Error: FFT called with size %d\n", PowerOfTwo); + exit(1); + } +*/ + for (i = 0;; i++) + if (PowerOfTwo & (1 << i)) + return i; +} + +inline int FastReverseBits(int i, int NumBits) +{ + if (NumBits <= MaxFastBits) + return gFFTBitTable[NumBits - 1][i]; + else + return ReverseBits(i, NumBits); +} + +int ReverseBits(int index, int NumBits) +{ + int i, rev; + + for (i = rev = 0; i < NumBits; i++) { + rev = (rev << 1) | (index & 1); + index >>= 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 <gtk/gtk.h> + +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 + |