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 using the PMODI2S2 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}\$
]3
Digital Filter: \$ LPF_{Digital}=\frac{0.00102z^2 +0.002041z+0.00102}{z^2-1.908z+0.9116}\$, using tustin
Pictures:
Input signal(yellow) from wave gen and output signal(green) after the Biquad filter
Input signal(yellow) from wave gen and output signal(green) passthrough with the peripheral no digital processing
Bode plot from Oscilloscope with the biquad filter:
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] = 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] = Rx_Buff_f_out[i];
}
TC_Callback = 0;
}
}
}
UPDATE 1: As requested doing a spreadsheet of different frequencies and a block diagram and a physical setup to show you guys.
wavegen -> scope
(directly, nothing in-between); the probes must be DC coupled; no highpass or bandpass filter anywhere on the way there; passthrough means if you feed 1 Vdc at input, you get 1 Vdc times amplification at output. \$\endgroup\$