Skip to main content
CLeo.1
Senior II
October 16, 2020
Question

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

  • October 16, 2020
  • 0 replies
  • 913 views

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

This topic has been closed for replies.