Yoichi Nagashima
/
CQ_nagasm_06_LPF
add - CQpub0 Mikami / FIR_LPF_Direct
Revision 0:5bbdcb797a66, committed 2014-12-15
- Comitter:
- nagasm
- Date:
- Mon Dec 15 10:33:45 2014 +0000
- Commit message:
- add - CQpub0 Mikami / FIR_LPF_Direct
Changed in this revision
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); +}