add - CQpub0 Mikami / FIR_LPF_Direct

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
nagasm
Date:
Mon Dec 15 10:33:45 2014 +0000
Commit message:
add - CQpub0 Mikami / FIR_LPF_Direct

Changed in this revision

FIR_LPF.hpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
sub.hpp Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 5bbdcb797a66 FIR_LPF.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FIR_LPF.hpp	Mon Dec 15 10:33:45 2014 +0000
@@ -0,0 +1,66 @@
+const int order = 200;
+float xn[order+1];
+
+// from CQpub0 Mikami / FIR_LPF_Direct
+//  http://developer.mbed.org/users/CQpub0Mikami/code/FIR_LPF_Direct
+//
+//                                   Band1       Band2
+// Lower band edge frequency (kHz) 0.000000    0.600000
+// Upper band edge frequency (kHz) 0.500000    5.000000
+// Gain                            1.000000    0.000000
+// Weight                          1.000000    1.000000
+// Deviation                       0.009734    0.009734
+// Deviation [dB]                  0.084139  -40.234188
+
+const float fc[order+1] = {   
+    -3.566292E-03f,  2.335185E-03f,  1.917338E-03f,  1.681921E-03f,  1.522689E-03f,
+     1.364066E-03f,  1.157961E-03f,  8.803014E-04f,  5.296940E-04f,  1.236180E-04f,
+    -3.047488E-04f, -7.123405E-04f, -1.051992E-03f, -1.279654E-03f, -1.360180E-03f,
+    -1.273725E-03f, -1.018960E-03f, -6.155554E-04f, -1.029986E-04f,  4.621914E-04f,
+     1.013316E-03f,  1.480161E-03f,  1.798055E-03f,  1.916527E-03f,  1.805744E-03f,
+     1.463100E-03f,  9.143371E-04f,  2.130115E-04f, -5.640853E-04f, -1.326518E-03f,
+    -1.978121E-03f, -2.430574E-03f, -2.613837E-03f, -2.486610E-03f, -2.043447E-03f,
+    -1.317959E-03f, -3.802110E-04f,  6.680631E-04f,  1.704594E-03f,  2.600376E-03f,
+     3.235972E-03f,  3.515095E-03f,  3.379365E-03f,  2.817894E-03f,  1.872141E-03f,
+     6.322899E-04f, -7.684087E-04f, -2.167773E-03f, -3.393601E-03f, -4.284042E-03f,
+    -4.705797E-03f, -4.577073E-03f, -3.875274E-03f, -2.648668E-03f, -1.012065E-03f,
+     8.616354E-04f,  2.758435E-03f,  4.447251E-03f,  5.706155E-03f,  6.350451E-03f,
+     6.257734E-03f,  5.386359E-03f,  3.786968E-03f,  1.602121E-03f, -9.435526E-04f,
+    -3.565645E-03f, -5.948320E-03f, -7.781761E-03f, -8.797770E-03f, -8.807067E-03f,
+    -7.725336E-03f, -5.594939E-03f, -2.585050E-03f,  1.010693E-03f,  4.809328E-03f,
+     8.361672E-03f,  1.121444E-02f,  1.295107E-02f,  1.324389E-02f,  1.191081E-02f,
+     8.934171E-03f,  4.488148E-03f, -1.062401E-03f, -7.182842E-03f, -1.321242E-02f,
+    -1.841506E-02f, -2.204769E-02f, -2.343209E-02f, -2.202840E-02f, -1.749386E-02f,
+    -9.730157E-03f,  1.092382E-03f,  1.453105E-02f,  2.989524E-02f,  4.629194E-02f,
+     6.269474E-02f,  7.802411E-02f,  9.123583E-02f,  1.014078E-01f,  1.078185E-01f,
+     1.100078E-01f,  1.078185E-01f,  1.014078E-01f,  9.123583E-02f,  7.802411E-02f,
+     6.269474E-02f,  4.629194E-02f,  2.989524E-02f,  1.453105E-02f,  1.092382E-03f,
+    -9.730157E-03f, -1.749386E-02f, -2.202840E-02f, -2.343209E-02f, -2.204769E-02f,
+    -1.841506E-02f, -1.321242E-02f, -7.182842E-03f, -1.062401E-03f,  4.488148E-03f,
+     8.934171E-03f,  1.191081E-02f,  1.324389E-02f,  1.295107E-02f,  1.121444E-02f,
+     8.361672E-03f,  4.809328E-03f,  1.010693E-03f, -2.585050E-03f, -5.594939E-03f,
+    -7.725336E-03f, -8.807067E-03f, -8.797770E-03f, -7.781761E-03f, -5.948320E-03f,
+    -3.565645E-03f, -9.435526E-04f,  1.602121E-03f,  3.786968E-03f,  5.386359E-03f,
+     6.257734E-03f,  6.350451E-03f,  5.706155E-03f,  4.447251E-03f,  2.758435E-03f,
+     8.616354E-04f, -1.012065E-03f, -2.648668E-03f, -3.875274E-03f, -4.577073E-03f,
+    -4.705797E-03f, -4.284042E-03f, -3.393601E-03f, -2.167773E-03f, -7.684087E-04f,
+     6.322899E-04f,  1.872141E-03f,  2.817894E-03f,  3.379365E-03f,  3.515095E-03f,
+     3.235972E-03f,  2.600376E-03f,  1.704594E-03f,  6.680631E-04f, -3.802110E-04f,
+    -1.317959E-03f, -2.043447E-03f, -2.486610E-03f, -2.613837E-03f, -2.430574E-03f,
+    -1.978121E-03f, -1.326518E-03f, -5.640853E-04f,  2.130115E-04f,  9.143371E-04f,
+     1.463100E-03f,  1.805744E-03f,  1.916527E-03f,  1.798055E-03f,  1.480161E-03f,
+     1.013316E-03f,  4.621914E-04f, -1.029986E-04f, -6.155554E-04f, -1.018960E-03f,
+    -1.273725E-03f, -1.360180E-03f, -1.279654E-03f, -1.051992E-03f, -7.123405E-04f,
+    -3.047488E-04f,  1.236180E-04f,  5.296940E-04f,  8.803014E-04f,  1.157961E-03f,
+     1.364066E-03f,  1.522689E-03f,  1.681921E-03f,  1.917338E-03f,  2.335185E-03f,
+    -3.566292E-03f
+};
+
+float FIR_calc(float data){
+    int i;
+    float acc = 0;
+    xn[0] = data;
+    for (i=0; i<=order; i++) acc = acc + fc[i]*xn[i];
+    for (i=order; i>0; i--) xn[i] = xn[i-1];
+    return(acc);
+}
\ No newline at end of file
diff -r 000000000000 -r 5bbdcb797a66 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Dec 15 10:33:45 2014 +0000
@@ -0,0 +1,88 @@
+#include "mbed.h"
+#include "sub.hpp"
+#include "FIR_LPF.hpp"
+
+float mean_sum, ad_data[101];
+int average_mode, max_count, ad_pointer[5];
+
+void sum_clear(){
+    int i;
+    for (i=0; i<5; i++) ad_pointer[i] = 0;
+    for (i=0; i<101; i++) ad_data[i] = 0;
+    mean_sum = 0;
+}
+
+float move_mean_calc(float data){
+    mean_sum = mean_sum - ad_data[ad_pointer[0]] + data;
+    ad_data[ad_pointer[0]] = data;
+    ad_pointer[0]++;
+    if(ad_pointer[0] == max_count) ad_pointer[0] = 0;
+    return(mean_sum / (float)max_count);
+}
+
+int main(){
+    int i, detection, sum, gain;
+    i = 0;
+    detection = 0;
+    gain = 1;
+    for (i=0; i<5; i++) timer_value[i] = 0;
+    for (i=0; i<=order; i++) xn[i] = 0.0;
+    sum_clear();
+    xbee.baud(38400);
+    xbee.attach(&rx_fifoset, xbee.RxIrq);
+    timer_setup.attach_us(&timer_interrupt, 5); // 5usec
+    while(1){
+        if(timer_value[1] > 19){ // 0.1msec sampling
+            timer_value[1] = 0;
+            float data = (float)gain * (analog_value3.read() - 0.5f);
+            if(detection == 1){
+                if (data < 0) data = -data;
+            }
+            data = FIR_calc(data);      // FIR calc call
+            if(timer_value[2] > 1999){  // 10msec
+                timer_value[2] = 0;
+                if(average_mode != 0) data = move_mean_calc(data);
+                tx_message((uint16_t)((data + 1.0f) * 2047)<<4);
+            }
+        }
+        if(timer_value[0] > 99999){ // 500msec
+            timer_value[0] = 0;
+            myled = !myled;
+        }
+        tx_fifo_check();
+        if(rx_fifo_check() == 1){
+            sum = 0;
+            for (i=0; i<6; i++) sum += conv_hex(raw_data[i])<<(4*(5-i));
+            tx_message(sum); // Echo Back 
+            if(sum>>16 == 0x80){
+                switch((sum & 0xff00)>>8){
+                    case 0x00:
+                        detection = sum & 0x01;
+                        break;
+                    case 0x01:
+                        gain = sum & 0x0f;
+                        break;
+                    case 0x02:
+                        average_mode = sum & 0x07;
+                        max_count = 5;
+                        switch(average_mode){
+                            case(2):
+                                max_count = 10;
+                                break;
+                            case(3):
+                                max_count = 20;
+                                break;
+                            case(4):
+                                max_count = 50;
+                                break;
+                            case(5):
+                                max_count = 100;
+                                break;
+                            }
+                        sum_clear();
+                        break;
+                }
+            }
+        }        
+    }
+}
diff -r 000000000000 -r 5bbdcb797a66 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Dec 15 10:33:45 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5
\ No newline at end of file
diff -r 000000000000 -r 5bbdcb797a66 sub.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sub.hpp	Mon Dec 15 10:33:45 2014 +0000
@@ -0,0 +1,73 @@
+unsigned char rxFIFO[256], txFIFO[256], raw_data[6];
+unsigned char rx_top, rx_end, tx_top, tx_end, phase;
+int timer_value[6];
+
+RawSerial xbee(PA_2, PA_3);
+Ticker timer_setup;
+AnalogIn analog_value0(A0);
+AnalogIn analog_value1(A1);
+AnalogIn analog_value2(A2);
+AnalogIn analog_value3(A3);
+DigitalOut myled(LED1);
+
+void common_setup(){
+    rx_top = rx_end = tx_top = tx_end = phase = 0; 
+}
+
+void timer_interrupt(){
+    int i;
+    for (i=0; i<6; i++) ++timer_value[i] &= 65535;
+}
+
+void tx_fifo_check(){
+    if(xbee.writeable() == 1){
+        if(tx_top != tx_end){
+            xbee.putc(txFIFO[tx_end]);
+            ++tx_end &= 255;
+        }
+    }
+}
+
+int rx_fifo_check(){
+    unsigned char data;
+    if(rx_top != rx_end){
+        data = rxFIFO[rx_end];
+        ++rx_end &= 255;
+        if (data < 33){
+            phase = 0;
+            return(1);
+        }
+        raw_data[phase] = data;
+        if(++phase > 5) phase = 0;
+        return(0);
+    }
+    return(0);
+}
+
+void rx_fifoset(void){
+    rxFIFO[rx_top] = xbee.getc();
+    ++rx_top &= 255;
+}
+
+void tx_fifoset(unsigned char data){
+    txFIFO[tx_top] = data;
+    ++tx_top &= 255;
+}
+
+unsigned char hex_conv(unsigned char data){
+    data &= 15;
+    if(data < 10) return(data+48);
+    else return(data+55);
+}
+
+unsigned char conv_hex(unsigned char data){
+    if((data > 47) && (data < 58)) return(data-48);
+    else if((data > 64) && (data < 71)) return(data-55);
+    return(0);
+}
+
+void tx_message(int data){
+    int i;
+    for (i=0; i<6; i++) tx_fifoset(hex_conv((data>>(4*(5-i))) & 15));
+    tx_fifoset(13);
+}