1
0
mirror of https://github.com/agdsn/ancient-weatherstation.git synced 2026-06-19 23:07:59 +00:00

- Chart: linear average improved (performance)

- Chart: gaussian average implemented


git-svn-id: file:///home/jan/tmp/wetterstation/trunk@225 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
losinshi
2007-04-18 15:19:34 +00:00
parent 022071a473
commit 85fd3d1859
12 changed files with 140 additions and 53 deletions
+7 -4
View File
@@ -55,10 +55,13 @@ typedef struct image_cfg {
int zero_min; /* Nullinie auf jeden Fall anzeigen */
int bars; /* Balken malen statt einer Linie */
int show_average; /* Durchschnittslinie zeichnen */
int show_min;
int show_max;
int invert_min;
int invert_max;
int gauss_width; /* 'Breite' der Gauss-Glocke */
int average_look_width; /* wieviele Pixel sollen 'links und rechts' angeschaut werden */
int use_gauss_average; /* Gaussche Glockenkurve statt einer linearen Wichtung fuer den Durchschnitt bebutzen */
int show_min; /* Minimum in der oberen ecke einblenden */
int show_max; /* maximum in der oberen ecke einblenden */
int invert_min; /* minimum invertiert anzeigen */
int invert_max; /* maximum invertiert anzeigen */
int dflt_dir; /* Standart - Verzeichnis fuer die Bilder */
/* Farben */
+3
View File
@@ -62,6 +62,9 @@ static const config_keyword keywords[] = {
{"zero_min", read_yn, &(img_cfg.zero_min), DEFAULT_ZERO_MIN},
{"as_bars", read_yn, &(img_cfg.bars), DEFAULT_AS_BARS},
{"show_average", read_yn, &(img_cfg.show_average), DEFAULT_SHOW_AVERAGE},
{"use_gauss_average", read_yn, &(img_cfg.use_gauss_average), DEFAULT_USE_GAUSS_AVERAGE},
{"average_look_width", read_int, &(img_cfg.average_look_width), DEFAULT_AVERAGE_LOOK_WIDTH},
{"gauss_width", read_int, &(img_cfg.gauss_width), DEFAULT_GAUSS_WIDTH},
{"show_min", read_yn, &(img_cfg.show_min), DEFAULT_SHOW_MIN},
{"show_max", read_yn, &(img_cfg.show_max), DEFAULT_SHOW_MAX},
{"invert_min", read_yn, &(img_cfg.invert_min), DEFAULT_INVERT_MIN},
+49 -17
View File
@@ -54,6 +54,7 @@ static char *get_conn_string();
static PGconn *pg_check_connect(char *);
static PGresult *pg_check_exec(PGconn *, char *, int);
static char *get_type_table_by_id(PGconn *, int );
static inline double * build_koeff_array(int, int , int);
/* Gibt die Liste mit den y-Labels zurueck */
@@ -496,7 +497,7 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
int field_size = c_width + 10; /* Array-Groeße (sollte nicht groeßer sein als die Breite in Pixel) */
int i,j,m; /* Zaehlvariablen */
double sum = 0; /* Summe der berechneten Werte */
double koeff = 0; /* Momentan zu bearbeitener Koeffizient */
double *koeff = 0; /* Momentan zu bearbeitener Koeffizient */
double count = 0; /* Summe der Koeffizienten */
pix_list_ptr old_temp = real_list; /* Liste mit den 'echten' Werten */
@@ -534,6 +535,9 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
list_count++;
}
/* Koeffizienten bauen */
koeff = build_koeff_array(img_cfg.use_gauss_average, img_cfg.average_look_width, img_cfg.gauss_width);
/* Array durchgehen und neue Werte berechnen.
* Es werden immer 30 Werte Link und 30 Werte rechts mit
* sich jeweils um 0.03 veringernden koeffizienten
@@ -543,18 +547,15 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
if(old_ptr_field[i] != NULL){
/* Aktueller Wert aus der 'realen' Liste */
sum = ((double)old_ptr_field[i]->value_sum) / ((double)old_ptr_field[i]->value_count);
sum = ((double)old_ptr_field[i]->value_sum) / ((double)old_ptr_field[i]->value_count) * koeff[0];
/* Summe der Koeffizienten.
* Aktueller Wert hat die Wichtung 1,
* daher mit 1 initialisiert */
count = 1;
count = koeff[0];
/* 30 (29) Links ind rechts durchgehen */
for(j = 1; j < 30; j++){
/* aktueller Koeffizient */
koeff = 0.9 - (0.01 * (3*j));
for(j = 1; j < img_cfg.average_look_width; j++){
/* Anzahl, wie viele Werte mit dem Aktuellem
* Koeffizienten zur Summe addiert wurden */
@@ -563,7 +564,7 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
/* j Werte 'links' vom aktuellem Wert */
if( (i - j) >= 0){
if(old_ptr_field[i-j] != NULL){
sum += (((double)old_ptr_field[i-j]->value_sum) / ((double)old_ptr_field[i-j]->value_count)) * koeff;
sum += (((double)old_ptr_field[i-j]->value_sum) / ((double)old_ptr_field[i-j]->value_count)) * koeff[j];
m++;
}
}
@@ -571,18 +572,19 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
/* j Werte rechts vom aktuellem Wert */
if( (i + j) < list_count){
if(old_ptr_field[i+j] != NULL){
sum += (((double)old_ptr_field[i+j]->value_sum) / ((double)old_ptr_field[i+j]->value_count)) * koeff;
sum += (((double)old_ptr_field[i+j]->value_sum) / ((double)old_ptr_field[i+j]->value_count)) * koeff[j];
m++;
}
}
/* Hier wir die anzahl der Werte,
* die zur Summe hinzuaddiert wurden
* multipliziert mit dem aktuellem
* koeffizienten und das ganze auf
* den gesammtkoeffizienten addiert */
count += m * koeff;
/* Hier wir die anzahl der Werte,
* die zur Summe hinzuaddiert wurden
* multipliziert mit dem aktuellem
* koeffizienten und das ganze auf
* den gesammtkoeffizienten addiert */
count += m * koeff[j];
}
/* Neues Element an die Durchschnittsliste anfuegen */
@@ -596,6 +598,9 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
}
}
/* Koeffizienten freigeben */
free(koeff);
/* Array freigeben */
free(old_ptr_field);
@@ -604,6 +609,33 @@ pix_list_ptr build_average_line(pix_list_ptr real_list, int c_width){
}
/* Array mit koeffizienten bauen
* gibt als rueckgabewert die koeffizienten
* Typ: 0=linear, 1=gauss*/
static inline double* build_koeff_array(int type, int look_width, int gauss_width){
int j; /* Laufvariable */
double div;
int o = gauss_width;
double * koeff_array = malloc((sizeof(double) * (look_width+1)));
for(j = 0; j < look_width; j++){
if(type){
/* GAUSS!!!*/
koeff_array[j] = (1/ (sqrt(2*PI) * o))*exp(-(j*j)/(o*o));
} else {
/* LINEAR*/
if (j == 0){
koeff_array[0] = 1;
} else {
div = 0.9 / ((double)look_width);
koeff_array[j] = 0.9 - (div * j);
}
}
}
return koeff_array;
}
/* baut den String fuer die Postgres-Verbindung zusammen */
static char *get_conn_string(){
char *conn_string = malloc(sizeof(char)*BUFFSIZE);