ESP-IDF Firmware
Firmware architecture and call graph
Loading...
Searching...
No Matches
dsps_firmr_s16_ansi.c File Reference
#include "dsps_fir.h"
#include "dsp_common.h"
#include "dsp_tests.h"
Include dependency graph for dsps_firmr_s16_ansi.c:

Go to the source code of this file.

Functions

int32_t dsps_firmr_s16_ansi (fir_s16_t *fir, const int16_t *input, int16_t *output, int32_t input_len)
 16 bit signed fixed point multi-rate FIR filter

Function Documentation

◆ dsps_firmr_s16_ansi()

int32_t dsps_firmr_s16_ansi ( fir_s16_t * fir,
const int16_t * input,
int16_t * output,
int32_t input_len )

16 bit signed fixed point multi-rate FIR filter

Function implements FIR filter with decimation The extension (_ansi) uses ANSI C and could be compiled and run on any platform. The extension (_ae32) is optimized for ESP32 chip.

Parameters
firpointer to fir filter structure, that must be initialized before
inputinput array
outputarray with the result of the FIR filter
input_lenlength of the intput array
Returns
: function returns the number of samples stored in the output array depends on the previous state value could be [0..len*intepr/decimation]

Definition at line 11 of file dsps_firmr_s16_ansi.c.

12{
13 int32_t result = 0;
14 long long rounding = 0;
15 const int32_t final_shift = fir->shift - 15;
16 rounding = (long long)(fir->rounding_val);
17
18 if (fir->shift >= 0) {
19 rounding = (rounding >> fir->shift) & 0xFFFFFFFFFF; // 40-bit mask
20 } else {
21 rounding = (rounding << (-fir->shift)) & 0xFFFFFFFFFF; // 40-bit mask
22 }
23
24 int32_t m = fir->start_pos;
25
26 for (int i = 0; i < input_len; i++) {
27 fir->delay[fir->pos] = input[i];
28
29 for (m = fir->start_pos; m < fir->interp; m += fir->decim) {
30 long long acc = rounding;
31 int coeff_pos = 0;
32 for (int n = fir->pos; n < fir->delay_size; n++) {
33 acc += (int32_t)fir->delay[n] * (int32_t)fir->coeffs[coeff_pos++ * fir->interp + m];
34 }
35 for (int n = 0; n < fir->pos; n++) {
36 acc += (int32_t)fir->delay[n] * (int32_t)fir->coeffs[coeff_pos++ * fir->interp + m];
37 }
38
39 if (final_shift > 0) {
40 output[result++] = (int16_t)(acc << final_shift);
41 } else {
42 output[result++] = (int16_t)(acc >> (-final_shift));
43 }
44 }
45 fir->start_pos = m - fir->interp;
46
47 fir->pos--;
48 if (fir->pos < 0) {
49 fir->pos = fir->delay_size - 1;
50 }
51 }
52
53 return result;
54}
int16_t delay_size
Interpolation parameters.
Definition dsps_fir.h:71
int16_t shift
Definition dsps_fir.h:61
int16_t * coeffs
Definition dsps_fir.h:55
int32_t rounding_val
Definition dsps_fir.h:63
int16_t * delay
Definition dsps_fir.h:56
int16_t decim
Definition dsps_fir.h:59
int16_t pos
Definition dsps_fir.h:58
int16_t start_pos
Definition dsps_fir.h:74
int16_t interp
Definition dsps_fir.h:72
const int m
Definition test_mmult.c:16
const int n
Definition test_mmult.c:17

References fir_s16_s::coeffs, fir_s16_s::decim, fir_s16_s::delay, fir_s16_s::delay_size, fir_s16_s::interp, m, n, fir_s16_s::pos, fir_s16_s::rounding_val, fir_s16_s::shift, and fir_s16_s::start_pos.