rf-tools/src/broadcast_fm/fir_filters/FIR_Audio_Filter_Filter.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;
}