153 lines
3.7 KiB
C
153 lines
3.7 KiB
C
#include "FIR_Audio_Filter_Filter.h"
|
|
|
|
static double filter_taps[FIR_AUDIO_FILTER_FILTER_TAP_NUM] = {
|
|
0.005517301037304242,
|
|
0.010958468006496662,
|
|
0.010240455922518009,
|
|
0.01626919575760614,
|
|
0.017121566138134488,
|
|
0.019559785776548867,
|
|
0.018573985808748823,
|
|
0.016981674306998703,
|
|
0.013027824505458897,
|
|
0.008348299295171996,
|
|
0.002827934347197235,
|
|
-0.0022439756999176066,
|
|
-0.006402028253938463,
|
|
-0.008814800382330594,
|
|
-0.009267566652943171,
|
|
-0.007703207526723216,
|
|
-0.004562291988505165,
|
|
-0.0005232995432083925,
|
|
0.003518575437801644,
|
|
0.006694025550492667,
|
|
0.008294079489543669,
|
|
0.007965160640712026,
|
|
0.005755920521670115,
|
|
0.0021526778614508585,
|
|
-0.0020452123559512488,
|
|
-0.005875787341622662,
|
|
-0.008425796705843449,
|
|
-0.009052315787298352,
|
|
-0.00752225339131066,
|
|
-0.0040990782652213,
|
|
0.00049750332784811,
|
|
0.005234144776188673,
|
|
0.008990696285244222,
|
|
0.010798308794869566,
|
|
0.010105847532439045,
|
|
0.006897132667607324,
|
|
0.0017653188321013905,
|
|
-0.00420373081909947,
|
|
-0.00964286796105942,
|
|
-0.013192556860158036,
|
|
-0.013826393925481531,
|
|
-0.011121337171052629,
|
|
-0.005396493245103629,
|
|
0.0022726920185823602,
|
|
0.010240805979570002,
|
|
0.016615084025158867,
|
|
0.019654280140049052,
|
|
0.018177759921499358,
|
|
0.011915646666813001,
|
|
0.0016581423845507999,
|
|
-0.010757223751418863,
|
|
-0.02270805003461664,
|
|
-0.03121367797048097,
|
|
-0.033501256492323245,
|
|
-0.027529898309997605,
|
|
-0.012463160702206726,
|
|
0.011056274270822274,
|
|
0.04090736333522399,
|
|
0.07374003152391906,
|
|
0.10546517736325783,
|
|
0.131881590198464,
|
|
0.1493758864385702,
|
|
0.1554926121172843,
|
|
0.1493758864385702,
|
|
0.131881590198464,
|
|
0.10546517736325783,
|
|
0.07374003152391906,
|
|
0.04090736333522399,
|
|
0.011056274270822274,
|
|
-0.012463160702206726,
|
|
-0.027529898309997605,
|
|
-0.033501256492323245,
|
|
-0.03121367797048097,
|
|
-0.02270805003461664,
|
|
-0.010757223751418863,
|
|
0.0016581423845507999,
|
|
0.011915646666813001,
|
|
0.018177759921499358,
|
|
0.019654280140049052,
|
|
0.016615084025158867,
|
|
0.010240805979570002,
|
|
0.0022726920185823602,
|
|
-0.005396493245103629,
|
|
-0.011121337171052629,
|
|
-0.013826393925481531,
|
|
-0.013192556860158036,
|
|
-0.00964286796105942,
|
|
-0.00420373081909947,
|
|
0.0017653188321013905,
|
|
0.006897132667607324,
|
|
0.010105847532439045,
|
|
0.010798308794869566,
|
|
0.008990696285244222,
|
|
0.005234144776188673,
|
|
0.00049750332784811,
|
|
-0.0040990782652213,
|
|
-0.00752225339131066,
|
|
-0.009052315787298352,
|
|
-0.008425796705843449,
|
|
-0.005875787341622662,
|
|
-0.0020452123559512488,
|
|
0.0021526778614508585,
|
|
0.005755920521670115,
|
|
0.007965160640712026,
|
|
0.008294079489543669,
|
|
0.006694025550492667,
|
|
0.003518575437801644,
|
|
-0.0005232995432083925,
|
|
-0.004562291988505165,
|
|
-0.007703207526723216,
|
|
-0.009267566652943171,
|
|
-0.008814800382330594,
|
|
-0.006402028253938463,
|
|
-0.0022439756999176066,
|
|
0.002827934347197235,
|
|
0.008348299295171996,
|
|
0.013027824505458897,
|
|
0.016981674306998703,
|
|
0.018573985808748823,
|
|
0.019559785776548867,
|
|
0.017121566138134488,
|
|
0.01626919575760614,
|
|
0.010240455922518009,
|
|
0.010958468006496662,
|
|
0.005517301037304242
|
|
};
|
|
|
|
void FIR_Audio_Filter_Filter_init(FIR_Audio_Filter_Filter* f) {
|
|
int i;
|
|
for(i = 0; i < FIR_AUDIO_FILTER_FILTER_TAP_NUM; ++i)
|
|
f->history[i] = 0;
|
|
f->last_index = 0;
|
|
}
|
|
|
|
void FIR_Audio_Filter_Filter_put(FIR_Audio_Filter_Filter* f, double input) {
|
|
f->history[f->last_index++] = input;
|
|
if(f->last_index == FIR_AUDIO_FILTER_FILTER_TAP_NUM)
|
|
f->last_index = 0;
|
|
}
|
|
|
|
double FIR_Audio_Filter_Filter_get(FIR_Audio_Filter_Filter* f) {
|
|
double acc = 0;
|
|
int index = f->last_index, i;
|
|
for(i = 0; i < FIR_AUDIO_FILTER_FILTER_TAP_NUM; ++i) {
|
|
index = index != 0 ? index-1 : FIR_AUDIO_FILTER_FILTER_TAP_NUM-1;
|
|
acc += f->history[index] * filter_taps[i];
|
|
};
|
|
return acc;
|
|
}
|