Thought this would deserve a separate post on its own. What's going on is that I finally got my low pass digital filter working on the [STM32H753ZI][1] using the [PMODI2S2][2] peripheral and I noticed the output signal is extremely low ~340mVpp this is after the biquad filtering. If I take out the low pass filtering the output signal then raises to around ~600mVpp. What's causing this phenomenon? The digital filter bode plot says the gain from very low frequencies up to the cut off is 0dB so I dont understand whats going on. The only thing I can think of is the biquad filter is causing an attenuation perhaps? Analog Filter: \$ LPF_{Analog}=\frac{3.94e07}{s^2+8889s+3.94e07}\$ ![enter image description here][3]][3] Digital Filter: \$ LPF_{Digital}=\frac{0.00102z^2 +0.002041z+0.00102}{z^2-1.908z+0.9116}\$, using tustin [![enter image description here][4]][4] Pictures: Input signal(yellow) from wave gen and output signal(green) after the Biquad filter [![enter image description here][5]][5] Input signal(yellow) from wave gen and output signal(green) passthrough with the peripheral no digital processing [![enter image description here][6]][6] Bode plot from Oscilloscope with the biquad filter: [![enter image description here][7]][7] CODE: #define ARM_MATH_CM7 #include "main.h" #include "arm_math.h" void init_Clock(void); void init_I2S(void); void init_Debugging(void); void init_Interrupt(void); void init_SpeedTest(void); int32_t RxBuff[4]; int32_t TxBuff[4]; uint8_t TC_Callback = 0; uint8_t HC_Callback = 0; char uartBuff[8]; float32_t iir_coeffs[5] = {0.00102f, 0.002041f, 0.00102f, 1.908f, -0.9116f}; //B0, B1, B2, A1, A2 float32_t iir_mono_state[4]; float32_t Rx_Buff_f[4]; float32_t Rx_Buff_f_out[4]; arm_biquad_casd_df1_inst_f32 monoChannel; void DMA1_Stream0_IRQHandler(void) { if (((DMA1 -> LISR) & (DMA_LISR_TCIF0)) != 0){ DMA1 -> LIFCR |= DMA_LIFCR_CTCIF0; TC_Callback = 1; } else if (((DMA1 -> LISR) & (DMA_LISR_HTIF0)) != 0){ DMA1 -> LIFCR |= DMA_LIFCR_CHTIF0; HC_Callback = 1; } } int main(void) { init_Clock(); init_I2S(); //init_Debugging(); init_Interrupt(); //init_SpeedTest(); arm_biquad_cascade_df1_init_f32(&monoChannel, 1, iir_coeffs, iir_mono_state); while (1) { if (HC_Callback == 1){ // GPIOA->BSRR |= GPIO_BSRR_BS3_HIGH; for (int i = 0; i < 2; i++){ Rx_Buff_f[i] = (float32_t)RxBuff[i]; } arm_biquad_cascade_df1_f32(&monoChannel, Rx_Buff_f, Rx_Buff_f_out, 2); for (int i = 0; i < 2; i++){ TxBuff[i] = (int32_t)Rx_Buff_f_out[i]; } HC_Callback = 0; } else if (TC_Callback == 1){ // GPIOA->BSRR |= GPIO_BSRR_BR3_LOW; for (int i = 2; i < 4; i++){ Rx_Buff_f[i] = (float32_t)RxBuff[i]; } arm_biquad_cascade_df1_f32(&monoChannel, &Rx_Buff_f[2], &Rx_Buff_f_out[2], 2); for (int i = 2; i < 4; i++){ TxBuff[i] = (int32_t)Rx_Buff_f_out[i]; } TC_Callback = 0; } } } [1]: https://www.google.com/search?rlz=1C1CHBD_enCA841CA841&sxsrf=ALeKk0181J_yj10LYaGo5FVNDbOKMr78Qg%3A1602789035623&ei=q56IX_2-JZH5tAbGzr2YAw&q=stm32H753zi&oq=stm32H753zi&gs_lcp=CgZwc3ktYWIQAzIECCMQJzIECCMQJzIECCMQJzICCAAyBAgAEB4yBAgAEB4yBAgAEB46BAgAEEdQvxhYvxhg9xxoAHACeACAAWCIAWCSAQExmAEAoAEBqgEHZ3dzLXdpesgBCMABAQ&sclient=psy-ab&ved=0ahUKEwi9wPi4prfsAhWRPM0KHUZnDzMQ4dUDCA0&uact=5 [2]: https://reference.digilentinc.com/reference/pmod/pmodi2s2/reference-manual [3]: https://i.sstatic.net/0JCTN.png [4]: https://i.sstatic.net/pK42P.png [5]: https://i.sstatic.net/l7nsc.png [6]: https://i.sstatic.net/lt0lW.png [7]: https://i.sstatic.net/TMi9X.png