cancel
Showing results for 
Search instead for 
Did you mean: 

Output signal is being attenuated after the Biquad filter direct Form 1, why?

CLeo.1
Senior II

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?

Or could it be the setup for the I2S hardware within the MCU?

0693W000004K6f2QAC.jpg0693W000004K6nZQAS.jpg0693W000004K6neQAC.jpg0693W000004K6njQAC.jpg0693W000004K6kHQAS.jpgCODE:

#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;
 
      }
 
 
 
  }
 
}

0 REPLIES 0