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.