filtro de paso bajo IIR que atenúa todas las frecuencias

2

Estoy tratando de hacer un filtro IIR de paso bajo en dsPIC (dsPIC33FJ12MC202) usando el compilador mikroC. He generado coeficientes de filtro utilizando la herramienta de diseño de filtros. Mis especificaciones de filtro son las siguientes:
LPF, Wp = 4KHz, Ws = 5KHz, Ap = 0, As = 60, Muestreo de aproximadamente 20Khz

Estoytomandounaentradaanalógicadelcanalcero,filtrandoyenviandoelvalorfiltradoatravésdeUART.Elcódigosevealgocomoesto:

intadcValue;charresult[6];constunsignedintBUFFER_SIZE=8;constunsignedintFILTER_ORDER=3;constunsignedintCOEFF_B[FILTER_ORDER+1]={0x17D9,0x478B,0x478B,0x17D9};constunsignedintCOEFF_A[FILTER_ORDER+1]={0x8000,0xAF27,0x383C,0xF802};constunsignedintSCALE_B=1;constunsignedintSCALE_A=0;unsignedintinext;ydataunsignedintinput[BUFFER_SIZE];ydataunsignedintoutput[BUFFER_SIZE];voidfilter(unsignedintadcValue){unsignedintCurrentValue;input[inext]=adcValue;CurrentValue=IIR_Radix(SCALE_B,SCALE_A,COEFF_B,//bcoefficientsofthefilterCOEFF_A,//acoefficientsofthefilterFILTER_ORDER+1,//Filterorder+1input,//InputbufferBUFFER_SIZE,//Inputbufferlengthoutput,//Outputbufferinext);//Currentsample//CurrentValue=2048;output[inext]=CurrentValue;inext=(inext+1)&(BUFFER_SIZE-1);//inext=(inext+1)modBUFFER_SIZE;//SendingfilteredvalueviaUARTWordToStr(CurrentValue,result);strcat(result,"\n\r");
  UART1_Write_Text(result);
}


void main()
{  
   inext  = 0;                                 // Initialize buffer index
   Vector_Set(input, BUFFER_SIZE, 0);         // Clear input buffer
   Vector_Set(output, BUFFER_SIZE, 0);       // Clear output buffer

   //Using R12, R13 for Rx, Tx
   PPS_Mapping(12, _INPUT, _U1RX);
   PPS_Mapping(13, _OUTPUT, _U1TX);

   UART1_Init(115200);
   ADC1_Init();

   while(1)
   {
      adcValue = ADC1_Read(0);
      Delay_us(50);
      filter(adcValue);
   }
}

La función IIR_Radix es proporcionada por el compilador mikroC, por lo que estoy esperando que sea inferior a 4Khz. Debería dar salida cualquiera que sea la entrada y por encima de 4KHz, debe atenuar la entrada.

Actualmente estoy simulando un circuito usando Proteus y cuando aplico el generador de Onda Sinusoidal (Amplitud 5v, Frecuencia = 1000 Hz) en el canal ADC, estoy obteniendo una salida que tiene un valor máximo de 95 (por ejemplo, 0, 22, 69, 95, 69, 22, 0 ...) en la Terminal Virtual. Pero 1000 Hz está en banda de paso, así que debería obtener lo que sea la entrada, como (0, 25, 499, 1023, 499, 25, 0 ...). Entonces, ¿por qué estoy obteniendo una salida atenuada incluso para las frecuencias de banda de paso?

Estoy analizando la salida en el terminal virtual dentro de la simulación de proteus, vea a la derecha.

    
pregunta Dark_Prince

1 respuesta

1

Usted dice que la frecuencia de muestreo es "aproximadamente 20kHz" (¿tal vez exactamente 22.1kHz, típicamente para audio?). Por lo tanto, el período de una onda sinusoidal de 1 kHz debe ser de aproximadamente 20 muestras.

Pero tus datos tienen un periodo de 6 muestras. No es 1kHz, sino más como 3.5kHz. Acercarse un poco a la frecuencia de la esquina, aunque no lo suficientemente cerca para explicar la atenuación por un factor de 5.

Mirando la captura de pantalla, sin embargo, cada segundo valor es cero. Así que su frecuencia es sólo bajo fs / 2. Y eso está sólidamente en la banda de parada.

    
respondido por el Ben Voigt

Lea otras preguntas en las etiquetas