Measurement of three analogue signals a filtration and transfer of their values through Ethernet (UDP)
Dependencies: mbed EthernetNetIf
MedianFilter.cpp@5:926b094680d1, 2012-11-27 (annotated)
- Committer:
- AndrewK
- Date:
- Tue Nov 27 10:44:23 2012 +0000
- Revision:
- 5:926b094680d1
Test program. ADC + Ethernet
Who changed what in which revision?
User | Revision | Line number | New 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 | } |