Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)

Dependencies:   mbed EthernetNetIf

Committer:
AndrewK
Date:
Tue Nov 27 10:44:23 2012 +0000
Revision:
5:926b094680d1
Test program. ADC + Ethernet

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndrewK 5:926b094680d1 1 #include "mbed.h"
AndrewK 5:926b094680d1 2 #include <math.h>
AndrewK 5:926b094680d1 3 #include "MedianFilter.h"
AndrewK 5:926b094680d1 4
AndrewK 5:926b094680d1 5 int comp(const void *a, const void *b)
AndrewK 5:926b094680d1 6 {
AndrewK 5:926b094680d1 7 int *aa = (int*)a;
AndrewK 5:926b094680d1 8 int *bb = (int*)b;
AndrewK 5:926b094680d1 9 if(*aa < *bb)
AndrewK 5:926b094680d1 10 return 1;
AndrewK 5:926b094680d1 11 if(*aa == *bb)
AndrewK 5:926b094680d1 12 return 0;
AndrewK 5:926b094680d1 13 return -1;
AndrewK 5:926b094680d1 14 }
AndrewK 5:926b094680d1 15
AndrewK 5:926b094680d1 16
AndrewK 5:926b094680d1 17 void MedianFilter::NextHead()
AndrewK 5:926b094680d1 18 {
AndrewK 5:926b094680d1 19 if(++Head == max_size)
AndrewK 5:926b094680d1 20 Head = 0;
AndrewK 5:926b094680d1 21 }
AndrewK 5:926b094680d1 22
AndrewK 5:926b094680d1 23 MedianFilter::MedianFilter(int size)
AndrewK 5:926b094680d1 24 {
AndrewK 5:926b094680d1 25 max_size = size;
AndrewK 5:926b094680d1 26 median_index = max_size / 2;
AndrewK 5:926b094680d1 27 Head = 0;
AndrewK 5:926b094680d1 28 for(int i=0; i<max_size; i++)
AndrewK 5:926b094680d1 29 val[i] = 0;
AndrewK 5:926b094680d1 30 }
AndrewK 5:926b094680d1 31
AndrewK 5:926b094680d1 32 void MedianFilter::AddValue(int value)
AndrewK 5:926b094680d1 33 {
AndrewK 5:926b094680d1 34 val[Head] = value;
AndrewK 5:926b094680d1 35 NextHead();
AndrewK 5:926b094680d1 36 }
AndrewK 5:926b094680d1 37
AndrewK 5:926b094680d1 38 typedef int* IPTR;
AndrewK 5:926b094680d1 39
AndrewK 5:926b094680d1 40 void MedianFilter::Copy()
AndrewK 5:926b094680d1 41 {
AndrewK 5:926b094680d1 42 for(int i=0; i<max_size; i++) {
AndrewK 5:926b094680d1 43 sort_val[i] = val[i];
AndrewK 5:926b094680d1 44 }
AndrewK 5:926b094680d1 45 // Sort();
AndrewK 5:926b094680d1 46 qsort((void*)sort_val, (size_t)max_size, sizeof(IPTR), comp);
AndrewK 5:926b094680d1 47 }
AndrewK 5:926b094680d1 48 /*
AndrewK 5:926b094680d1 49 void MedianFilter::Sort()
AndrewK 5:926b094680d1 50 {
AndrewK 5:926b094680d1 51 for(int l=max_size-1; l>=0; l--)
AndrewK 5:926b094680d1 52 for(int i=l; i<max_size-1; i++)
AndrewK 5:926b094680d1 53 if(sort_val[i] > sort_val[i+1]) {
AndrewK 5:926b094680d1 54 int tmp = sort_val[i];
AndrewK 5:926b094680d1 55 sort_val[i] = sort_val[i+1];
AndrewK 5:926b094680d1 56 sort_val[i+1] = tmp;
AndrewK 5:926b094680d1 57 }
AndrewK 5:926b094680d1 58 }
AndrewK 5:926b094680d1 59 */
AndrewK 5:926b094680d1 60 int MedianFilter::GetMedian(int v)
AndrewK 5:926b094680d1 61 {
AndrewK 5:926b094680d1 62 AddValue(v);
AndrewK 5:926b094680d1 63 Copy();
AndrewK 5:926b094680d1 64 unsigned short med = sort_val[median_index];
AndrewK 5:926b094680d1 65 if(abs(v - med) > 50)
AndrewK 5:926b094680d1 66 return med;
AndrewK 5:926b094680d1 67 else
AndrewK 5:926b094680d1 68 return v;
AndrewK 5:926b094680d1 69 }