/*************************************************************************** * Copyright (C) 2020 - 2025 by Federico Amedeo Izzo IU2NUO, * * Niccolò Izzo IU2KIN, * * Silvano Seva IU2KWO, * * Frederik Saraci IU2NRO * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, see * ***************************************************************************/ #include int16_t dsp_dcBlockFilter(struct dcBlock *dcb, int16_t sample) { /* * Implementation of a fixed-point DC block filter with noise shaping, * ensuring zero DC component at the output. * Filter pole set at 0.995 * * Code adapted from https://dspguru.com/dsp/tricks/fixed-point-dc-blocking-filter-with-noise-shaping/ */ dcb->accum -= dcb->prevIn; dcb->prevIn = static_cast(sample) << 15; dcb->accum += dcb->prevIn; dcb->accum -= 164 * dcb->prevOut; // 32768.0 * (1.0 - pole) dcb->prevOut = dcb->accum >> 15; return static_cast(dcb->prevOut); }