$B%j%9%H(B2-5-1.txt

$B"#%j%9%H(B2-5-1$B"#(B

$B!|%a%$%s!!(Bmain.cpp

#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); // $B3d$j9~$_$r(B5usec
    while(1){
        if(timer_value[1] > 19){ 		// 0.1msec $B%5%s%W%j%s%0(B
            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);      // $B$3$3$G(B FIR LPF$B$r8F$V(B
            if(timer_value[2] > 1999){  // 10msec$B!!$4$H$K%[%9%H(BPC$B$K(BXBee$B$GAw?.(B
                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;
                }
            }
        }        
    }
}

$B!|%5%V(B sub.hpp

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);
}

$B!|%5%V(B FIR_LPF.hpp

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){		// FIR$B%U%#%k%?$N1i;;ItJ,(B
    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);
}

========================
mbed$B%5%$%H(B
http://developer.mbed.org/users/nagasm/code/CQ_nagasm_06_LPF/
$B$K$F8x3+Cf(B
========================
