00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <biquad.h>
00024 #include <string.h>
00025
00027 void biquad_init (struct biquad_filter * p)
00028 {
00029 uint8_t flags;
00030 IRQ_LOCK(flags);
00031
00032
00033 memset(p, 0, sizeof(struct biquad_filter));
00034
00035
00036 p-> b0=1;
00037
00038 IRQ_UNLOCK(flags);
00039 }
00040
00046 void biquad_flush_memories(struct biquad_filter *p)
00047 {
00048 uint8_t flags;
00049 IRQ_LOCK(flags);
00050
00051
00052 p->mem_in_1 = 0;
00053 p->mem_in_2 = 0;
00054 p->mem_out_1 = 0;
00055 p->mem_out_2 = 0;
00056
00057 IRQ_UNLOCK(flags);
00058 }
00059
00061 void biquad_set_numerator_coeffs(struct biquad_filter *p, int16_t b0, int16_t b1, int16_t b2)
00062 {
00063 uint8_t flags;
00064 IRQ_LOCK(flags);
00065
00066 p->b0 = b0;
00067 p->b1 = b1;
00068 p->b2 = b2;
00069
00070 IRQ_UNLOCK(flags);
00071 }
00072
00073 void biquad_set_deniminator_coeffs(struct biquad_filter *p, int16_t a1, int16_t a2)
00074 {
00075 uint8_t flags;
00076 IRQ_LOCK(flags);
00077
00078 p->a1 = -a1;
00079 p->a2 = -a2;
00080
00081 IRQ_UNLOCK(flags);
00082 }
00083
00084 void biquad_set_divisor_shifts(struct biquad_filter *p, uint8_t recursive_shift, uint8_t out_shift)
00085 {
00086 uint8_t flags;
00087 IRQ_LOCK(flags);
00088
00089 p-> out_shift = out_shift;
00090 p-> recursive_shift = recursive_shift;
00091
00092 IRQ_UNLOCK(flags);
00093 }
00094
00095 void biquad_set_series_son(struct biquad_filter *p, struct biquad_filter *son)
00096 {
00097 uint8_t flags;
00098 IRQ_LOCK(flags);
00099
00100 p->son = son;
00101
00102 IRQ_UNLOCK(flags);
00103 }
00104
00107 int32_t biquad_do_filter(void * data , int32_t in)
00108 {
00109
00110 int32_t output;
00111
00112 struct biquad_filter * p = data;
00113
00114
00115 output = p->b0 * in;
00116
00117 output += p->b1 * p->mem_in_1;
00118 output += p->b2 * p->mem_in_2;
00119
00120 output += p->a1 * p->mem_out_1;
00121 output += p->a2 * p->mem_out_2;
00122
00123
00124
00125
00126 p->mem_in_2 = p->mem_in_1;
00127 p->mem_in_1 = in;
00128
00129 p->mem_out_2 = p-> mem_out_1;
00130 p->mem_out_1 = output >> p-> recursive_shift;
00131
00132
00133
00134 output >>= p-> out_shift;
00135
00136
00137
00138 if(p->son != NULL)
00139 output = biquad_do_filter(p->son, output);
00140
00141
00142 return output;
00143
00144 }