#include "compute.h" #include "fft.h" #include #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 input[MAX_SAMPLES], output[MAX_SAMPLES]; float level; 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 0.0) processed[i] = 10*log10(temp); else processed[i] = 0; } for(i=0;i<256/2;i++) output[i] = processed[i]; } /* * PowerSpectrum * * This function computes the same as RealFFT, above, but * adds the squares of the real and imaginary part of each * coefficient, extracting the power and throwing away the * phase. * * For speed, it does not call RealFFT, but duplicates some * of its code. */ void PowerSpectrum(float *In, float *Out) { int i; float theta = M_PI / 128; float tmpReal[128]; float tmpImag[128]; float RealOut[128]; float ImagOut[128]; for (i = 0; i < 128; i++) { tmpReal[i] = In[2 * i]; tmpImag[i] = In[2 * i + 1]; } FFT(128, 0, tmpReal, tmpImag, RealOut, ImagOut); float wtemp = sin(0.5 * theta); float wpr = -2.0 * wtemp * wtemp; float wpi = -1.0 * sin(theta); float wr = 1.0 + wpr; float wi = wpi; int i3; float h1r, h1i, h2r, h2i, rt, it; for (i = 1; i < 128 / 2; i++) { i3 = 128 - i; h1r = 0.5 * (RealOut[i] + RealOut[i3]); h1i = 0.5 * (ImagOut[i] - ImagOut[i3]); h2r = 0.5 * (ImagOut[i] + ImagOut[i3]); h2i = -0.5 * (RealOut[i] - RealOut[i3]); rt = h1r + wr * h2r - wi * h2i; it = h1i + wr * h2i + wi * h2r; Out[i] = rt * rt + it * it; rt = h1r - wr * h2r + wi * h2i; it = -h1i + wr * h2i + wi * h2r; Out[i3] = rt * rt + it * it; wr = (wtemp = wr) * wpr - wi * wpi + wr; wi = wi * wpr + wtemp * wpi + wi; } rt = (h1r = RealOut[0]) + ImagOut[0]; it = h1r - ImagOut[0]; Out[0] = rt * rt + it * it; rt = RealOut[128 / 2]; it = ImagOut[128 / 2]; Out[128 / 2] = rt * rt + it * it; } void audio2hsv_1(gint audio_level, gint *light_h, gint *light_s, gint *light_v) { // Dummy code *light_h=-audio_level; *light_s=audio_level; *light_v=65535; } void hsv2rgb(gint h, gint s, gint v, gint *r, gint *g, gint *b) { /* * Purpose: * Convert HSV values to RGB values * All values are in the range [0..65535] */ float F, M, N, K; int I; if ( s == 0 ) { /* * Achromatic case, set level of grey */ *r = v; *g = v; *b = v; } else { I = (int) h/(65535/6); /* should be in the range 0..5 */ F = h - I; /* fractional part */ M = v * (1 - s); N = v * (1 - s * F); K = v * (1 - s * (1 - F)); if (I == 0) { *r = v; *g = K; *b = M; } if (I == 1) { *r = N; *g = v; *b = M; } if (I == 2) { *r = M; *g = v; *b = K; } if (I == 3) { *r = M; *g = N; *b = v; } if (I == 4) { *r = K; *g = M; *b = v; } if (I == 5) { *r = v; *g = M; *b = N; } } }