二阶滤波

/*=====================================================================================
 File name:        filter.C  (IQ version)
                    
 Originator:    Digital Control Systems Group
            Texas Instruments

 Description:  The Voltage Reconstruction based on switching functions and DC-Bus voltage                    

=====================================================================================
 History:
-------------------------------------------------------------------------------------
 04-15-2005    Version 3.20
-------------------------------------------------------------------------------------*/

#include "IQmathLib.h"         // Include header for IQmath library
// Don't forget to set a proper GLOBAL_Q in "IQmathLib.h" file
#include "DSP281x_Device.h"
#include "filter.h"

void two_order_filter_calc(TWO_ORDER_FILT_CALC *v)
{    
    v->yn = _IQmpy(v->par->x0,v->xn) + _IQmpy(v->par->x1,v->xn_1) + _IQmpy(v->par->x2,v->xn_2) + _IQmpy(v->par->y1,v->yn_1) + _IQmpy(v->par->y2,v->yn_2);
    v->xn_2 = v->xn_1;
    v->xn_1 = v->xn;
    v->yn_2 = v->yn_1;
    v->yn_1 = v->yn;
}

void low_bpf_calc(LOW_BPF *v)
{
    v->yn = _IQmpy(v->xn,v->filter_t) + _IQmpy(v->yn_1,_IQ(1.0) - v->filter_t);
    v->yn_1 = v->yn;
}
/*
 * filter.h
 *
 *  Created on: 2014-1-21
 *      Author: lizhiguo
 */

#ifndef __FILTER_H__
#define __FILTER_H__
typedef struct
{
      _iq  x0;
      _iq  x1;
      _iq  x2;
      _iq  y1;
      _iq  y2;
}TOW_ORDER_FILTER_PAR;

typedef struct
{
    _iq xn;
    _iq yn;
    _iq yn_1;
    _iq filter_t;
    void (*calc)();
}LOW_BPF;
#define LOW_BPF_DEFAULTS {0,0,0,_IQ(1.0),(void (*)(Uint32))low_bpf_calc}

typedef struct {  _iq  xn;
                  _iq  yn;
                  _iq  xn_1;
                  _iq  xn_2;
                  _iq  yn_1;
                  _iq  yn_2;
                  TOW_ORDER_FILTER_PAR *par;
                    void  (*calc)();    // Pointer to calculation function
                 }TWO_ORDER_FILT_CALC;

#define TOW_ORDER_FILTER_CALC_DEFAULTS {0,0,0,0,0,0,0,(void (*)(Uint32))two_order_filter_calc}
typedef TWO_ORDER_FILT_CALC *TWO_ORDER_FILT_CALC_handle;
void two_order_filter_calc(TWO_ORDER_FILT_CALC_handle);
void low_bpf_calc(LOW_BPF *v);



#define FILTER(s,f,o) f.xn = s;f.calc(&f);o = f.yn
#define FILTER_PAR(p) (TOW_ORDER_FILTER_PAR *)(&p)

#endif //