summaryrefslogtreecommitdiff
path: root/tests/test5
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2012-06-10 20:22:56 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2012-06-10 20:22:56 +0000
commit88f174d0b8b749cf96a38e284f266d3bdaa55ef4 (patch)
treec43e181b0a33eb77249264dc8dc869d870df1f6b /tests/test5
parent4e623f07d088fb98edb6595bf315ab4026d559b7 (diff)
download2012-violon-leds-88f174d0b8b749cf96a38e284f266d3bdaa55ef4.tar.gz
2012-violon-leds-88f174d0b8b749cf96a38e284f266d3bdaa55ef4.tar.bz2
2012-violon-leds-88f174d0b8b749cf96a38e284f266d3bdaa55ef4.zip
Bon, on reprends à plat les problèmes de maths avec des fichiers en entrée pour valider tutes les étapes...
git-svn-id: file:///var/svn/2012-violon-leds/trunk@16 6be1fa4d-33ac-4c33-becc-79fcb3794bb6
Diffstat (limited to 'tests/test5')
-rw-r--r--tests/test5/TOREAD2
-rw-r--r--tests/test5/capture.c1
-rw-r--r--tests/test5/compute.c52
-rw-r--r--tests/test5/test5.c2
-rw-r--r--tests/test5/win_main.c3
5 files changed, 35 insertions, 25 deletions
diff --git a/tests/test5/TOREAD b/tests/test5/TOREAD
index b1abccf..c3acc33 100644
--- a/tests/test5/TOREAD
+++ b/tests/test5/TOREAD
@@ -5,3 +5,5 @@ http://www.developpez.net/forums/d467150/autres-langages/algorithmes/fft-role/
http://code.google.com/p/jivemodular/source/browse/trunk/apps/jive/src/model/plugins/meters/AudioSpecMeterEditor.cpp?r=67
http://en.wikipedia.org/wiki/Frequency_weighting
+http://en.wikipedia.org/wiki/Root_mean_square#RMS_in_frequency_domain
+
diff --git a/tests/test5/capture.c b/tests/test5/capture.c
index 26d345c..e8ca2fd 100644
--- a/tests/test5/capture.c
+++ b/tests/test5/capture.c
@@ -124,6 +124,7 @@ pa_stream *create_stream(pa_context *c, const pa_source_info *si) {
.tlength=1024,
.prebuf=-1,
.minreq=-1,
+ // .minreq=256, //For FFT calculus
.fragsize=512
};
diff --git a/tests/test5/compute.c b/tests/test5/compute.c
index e8b03fc..d64f8c1 100644
--- a/tests/test5/compute.c
+++ b/tests/test5/compute.c
@@ -3,8 +3,9 @@
#include "fft.h"
#include <math.h>
+#define MIN_SAMPLES 256
#define MAX_SAMPLES 2048
-static inline float todB_a(const float *x);
+//static inline float todB_a(const float *x);
void compute_spectrum(float * data, int width, double rate, float *output);
@@ -13,42 +14,49 @@ 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[128];
- float level;
+ float value;
+ int gain=20, range=80;
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];
- //printf("val==%i\n", val);
- if (val<0) val=-val;
- if (level<val) level=val;
+ if (nsamples < MIN_SAMPLES) {
+ printf("WARN : nsamples < MIN_SAMPLES : %i >= %i\n", nsamples, MIN_SAMPLES);
+ for (i=0;i<MIN_SAMPLES;i++) {
+ if ( (i/nsamples)%2==1 )
+ input[i]=data[i/**nchan*/];
+ else
+ input[i]=data[nsamples-i-1];
+ }
+ nsamples=MIN_SAMPLES;
+ } else {
+ for (i=0;i<nsamples;i++) {
+ input[i]=data[i/**nchan*/];
+ }
}
-*/
- for (i=0;i<nsamples;i++) {
- input[i]=data[i/**nchan*/];
-/* printf("\r%f ", input[i]);
- fflush(stdout);
-*/
- }
-// printf("\n");
compute_spectrum(input, nsamples, rate, output);
//printf("%f\n", output[0]);
- level=0.f;
+ value=0.f;
for (i=1;i<128;i++) {
- level+=output[i];
+ value+=output[i];
}
- level/=127.f;
- return level;
+ // Mean value
+ value/=127.f;
+ // 0.0 to 1.0 range
+ value=(value + gain + range) / (double)range;
+ value=MAX(0.f,value);
+ value=MIN(value,1.f);
+
+// printf("DEBUG: nsamples=%8i value==%f\n", nsamples, value);
+ return value;
}
-
+/*
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) {
diff --git a/tests/test5/test5.c b/tests/test5/test5.c
index 7bf6a88..a80bf75 100644
--- a/tests/test5/test5.c
+++ b/tests/test5/test5.c
@@ -49,7 +49,7 @@ void my_process(float *data, size_t nsamples, size_t nchan) {
sound_level=compute_level(data, nsamples, nchan);
// Update sound vumeter value (refreshed asynchronously)
- *audio_vumeter_val=(int)(sound_level*10.f);
+ *audio_vumeter_val=(int)(sound_level*100.f);
// Transfert Function
audio2hsv_1(*audio_vumeter_val,light_h,light_s,light_v);
diff --git a/tests/test5/win_main.c b/tests/test5/win_main.c
index 66b2c6b..c36a1a0 100644
--- a/tests/test5/win_main.c
+++ b/tests/test5/win_main.c
@@ -23,7 +23,7 @@ GtkWidget *win_main_build() {
//TODO : gtk_vumeter_set_min_max (GTK_VU_METER(vumeter), min, max);
vumeter_sound = gtk_vu_meter_new (TRUE);
- gtk_vu_meter_set_min_max(GTK_VU_METER(vumeter_sound), -600, 0);
+ gtk_vu_meter_set_min_max(GTK_VU_METER(vumeter_sound), 0, 100);
gtk_box_pack_start(GTK_BOX(hbox1), vumeter_sound, FALSE, FALSE, 0);
vumeter_h = gtk_vu_meter_new (TRUE);
@@ -61,7 +61,6 @@ GtkWidget *win_main_build() {
}
gboolean win_main_update_vumeters(gpointer vals) {
- printf("%i\n", ((gint*)vals)[0]);
gtk_vu_meter_set_level(GTK_VU_METER(vumeter_sound), ((gint*)vals)[0]);
gtk_vu_meter_set_level(GTK_VU_METER(vumeter_h), ((gint*)vals)[1]);
gtk_vu_meter_set_level(GTK_VU_METER(vumeter_s), ((gint*)vals)[2]);