summaryrefslogtreecommitdiff
path: root/tests/test5/compute.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test5/compute.c')
-rw-r--r--tests/test5/compute.c91
1 files changed, 13 insertions, 78 deletions
diff --git a/tests/test5/compute.c b/tests/test5/compute.c
index 3a94efe..e8b03fc 100644
--- a/tests/test5/compute.c
+++ b/tests/test5/compute.c
@@ -4,6 +4,9 @@
#include <math.h>
#define MAX_SAMPLES 2048
+static inline float todB_a(const float *x);
+void compute_spectrum(float * data, int width, double rate, float *output);
+
gfloat compute_level(const float *data, size_t nsamples, size_t nchan) {
@@ -32,22 +35,26 @@ gfloat compute_level(const float *data, size_t nsamples, size_t nchan) {
}
// printf("\n");
- compute_spectrom(input, nsamples, rate, output);
+ compute_spectrum(input, nsamples, rate, output);
+ //printf("%f\n", output[0]);
level=0.f;
for (i=1;i<128;i++) {
level+=output[i];
}
level/=127.f;
- //printf("%f\n", level);
return level;
}
-// From Audacity
-void compute_spectrom(float * data, int width, double rate, float *output) {
+static inline float todB_a(const float *x){
+ return (float)((*(int32_t *)x)&0x7fffffff) * 7.17711438e-7f -764.6161886f;
+}
+
+// Adapted from Audacity
+void compute_spectrum(float * data, int width, double rate, float *output) {
int i;
float processed[256]={0.0f};
-//TODO : remove init here
+//TODO : remove init here(handy for step by step debug)
float in[256]={0.0f};
float out[256]={0.0f};
@@ -57,7 +64,7 @@ void compute_spectrom(float * data, int width, double rate, float *output) {
for (i=0; i<256; i++)
in[i] = data[start + i];
- // Hanning
+ // Windowing : Hanning
for (i=0; i<256; i++)
in[i] *= 0.50 - 0.50 * cos(2 * M_PI * i / (256 - 1));
@@ -83,78 +90,6 @@ void compute_spectrom(float * data, int width, double rate, float *output) {
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]; //FIXME : WTFFFF ?
- tmpImag[i]=0;
- }
-
- 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;