summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2012-06-06 21:42:40 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2012-06-06 21:42:40 +0000
commit438cfc61ee3fae8875dbbf24a44fa7d75969f2b3 (patch)
treecae20abd8ebd251dc972886340d74a1763ca94ae
parent5b385abef33b20c122bddf9cc9e947594e0ebd32 (diff)
download2012-violon-leds-438cfc61ee3fae8875dbbf24a44fa7d75969f2b3.tar.gz
2012-violon-leds-438cfc61ee3fae8875dbbf24a44fa7d75969f2b3.tar.bz2
2012-violon-leds-438cfc61ee3fae8875dbbf24a44fa7d75969f2b3.zip
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 git-svn-id: file:///var/svn/2012-violon-leds/trunk@13 6be1fa4d-33ac-4c33-becc-79fcb3794bb6
-rw-r--r--tests/test5/Makefile29
-rwxr-xr-xtests/test5/compil.sh7
-rw-r--r--tests/test5/compute.c172
-rw-r--r--tests/test5/compute.h7
-rw-r--r--tests/test5/fft.c153
-rw-r--r--tests/test5/fft.h14
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
+