]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
ADD: added a simple averging filter function. input parameter K, can be 1 to 8
authoriceman1001 <iceman@iuse.se>
Mon, 29 Aug 2016 18:29:31 +0000 (20:29 +0200)
committericeman1001 <iceman@iuse.se>
Mon, 29 Aug 2016 18:29:31 +0000 (20:29 +0200)
ref: http://www.edn.com/design/systems-design/4320010/A-simple-software-lowpass-filter-suits-embedded-system-applications

client/cmddata.c
client/ui.c
client/ui.h

index 4279e9b612eded8449212f7aa0ebc082b3215741..f9aaa8db408f431891e5ebd9b91989f1657ca762 100644 (file)
@@ -2417,7 +2417,10 @@ int Cmdhex2bin(const char *Cmd)
 }
 
 int CmdDataIIR(const char *Cmd){
-       iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
+
+       uint8_t k = param_get8(Cmd,0);
+       //iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
+       iceSimple_Filter(GraphBuffer, GraphTraceLen, k);
        RepaintGraphWindow();
        return 0;
 }
index 9c24f17d1bdd2aa5155397dc54fb9fafcff646fc..cfaec6a510dcfaadfe4edc725a41eeddf461097c 100644 (file)
@@ -85,10 +85,14 @@ void iceIIR_Butterworth(int *data, const size_t len){
        int i,j;
        
        int * output =  (int* ) malloc(sizeof(int) * len);      
+       if ( !output ) return;
+       
+       // clear mem
        memset(output, 0x00, len);
-       float fc = 0.1125f;          // center frequency
-       size_t adjustedLen = len;
        
+       size_t adjustedLen = len;
+       float fc = 0.1125f;          // center frequency
+               
     // create very simple low-pass filter to remove images (2nd-order Butterworth)
     float complex iir_buf[3] = {0,0,0};
     float b[3] = {0.003621681514929,  0.007243363029857, 0.003621681514929};
@@ -98,7 +102,7 @@ void iceIIR_Butterworth(int *data, const size_t len){
     float complex x_prime  = 1.0f;   // save sample for estimating frequency
     float complex x;
                
-       for (i=0; i<adjustedLen; ++i) {
+       for (i = 0; i < adjustedLen; ++i) {
 
                sample = data[i];
                
@@ -118,16 +122,38 @@ void iceIIR_Butterworth(int *data, const size_t len){
         float freq = cargf(x*conjf(x_prime));
         x_prime = x;    // retain this sample for next iteration
 
-               output[i] =(freq > 0)? 10 : -10;
+               output[i] =(freq > 0) ? 127 : -127;
     } 
 
        // show data
+       //memcpy(data, output, adjustedLen);
        for (j=0; j<adjustedLen; ++j)
                data[j] = output[j];
-               
+       
        free(output);
 }
 
+void iceSimple_Filter(int *data, const size_t len, uint8_t k){
+// ref: http://www.edn.com/design/systems-design/4320010/A-simple-software-lowpass-filter-suits-embedded-system-applications
+// parameter K
+#define FILTER_SHIFT 4 
+
+       int32_t filter_reg = 0;
+       int16_t input, output;
+       int8_t shift = (k <=8 ) ? k : FILTER_SHIFT;
+
+       for (int i = 0; i < len; ++i){
+
+               input = data[i];
+               // Update filter with current sample
+               filter_reg = filter_reg - (filter_reg >> shift) + input;
+
+               // Scale output for unity gain
+               output = filter_reg >> shift;
+               data[i] = output;
+       }
+}
+
 float complex cexpf (float complex Z)
 {
   float complex  Res;
index 3417f3629230263ff1fb2cb4a8b0b983b0ab407f..8d6c21b5b8a30935e81efad4b111af2b4ede40dd 100644 (file)
@@ -42,4 +42,5 @@ extern int offline;
 extern int flushAfterWrite;   //buzzy
 
 void iceIIR_Butterworth(int * data, const size_t len);
+void iceSimple_Filter(int *data, const size_t len, uint8_t k);
 #endif
Impressum, Datenschutz