Autor Tema: Goertzel y punto fijo  (Leído 2397 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado david_tec

  • PIC10
  • *
  • Mensajes: 10
Goertzel y punto fijo
« en: 06 de Mayo de 2009, 14:35:25 »
Hola!
Estoy haciendo un proyecto que consiste en medir y corregir el factor de potencia, además medir la distorsión armónica total de la señal de la red eléctrica, esto para un sistema monofásico.
El principal problema de este proyecto es medir la distorsión la armónica, está etapa del proyecto la voy a realizar utilizando el algoritmo de Goertzel, que además puedo aprovechar no solo para medir la distorsión sino para calcular de una vez el factor de potencia. Una limitante que poseo es el PIC, pues debo utilizar el PIC18F97J60, el cual posee un cristal de 25MHz, y realiza 10.5 MIPS. Actualmente estoy pensando en medir hasta la armónica número 7, por lo que mi frecuencia de muestreo es de 900Hz (si tengo problemas de tiempo voy a bajar a la armónica 5, inclusive puede ser hasta la 3). Mi idea es implementar el algoritmo en Matlab y luego pasarlo al PIC.
Ya en Matlab tengo el algoritmo funcionando, sin embargo estoy utilizando punto flotante. Yo deseo utilizar punto fijo en el formato Q15 (he visto documentos en donde utilizan este formato); sin embargo aún no logro hechar a andar el programa en Matlab, principalmente porque no se bien manejar el punto fijo. He investigado y se que para la multiplicación lo que debo realizar en este caso es un desplazamiento hacia la derecha de 15 bits, sin embargo no se como puedo evitar que en una suma no ocurra un overflow, esta es la ecuación de diferencias del algoritmo de Goertzel:

vk=2*coef1*vk1-vk2+muestra

vk=valor actual
coef1=cos(2*pi*n/N)
n= número del armónico (para la fundamental n=1)
N=número de muestras (en mi caso 15)
vk1=valor anterior
vk2=valor trasanterior
muestra= valor normalizado y escalado de la muestra de la señal de entrada.
 
Como le mencionaba yo creo saber como evitar el overflow en la mutiplicación, lo que no se bien es como manejar el 2 de la ecuación de diferencias, lo que se me ocurrió fue multiplicar primero coef1*vk1 y luego este resultdo multiplicarlo por 2. Sin embargo el problema principal está cuando realizo la suma de la muestra, ya que inicialmente la muestra presenta un valor de 0 a 1023 (10 bits de resolución del ADC), luego le resto el valor medio a la señal para eliminar el offset (la señal queda entre -511.5 a 511.5) y luego divido la muestra entre 511.5 por lo que la señal de entrada estará entre -1 y 1, finalmente multiplico la muestra por 2^15, para tener en Q15. Lo que pasa es que la muestra posee todo el rango de Q15, por lo que muy fácilmente con sumas pequeñas se llega al overflow. La ecuación de diferencias debo realizarl en ciclos de 15 (es decir 15 muestras). 
Agradezco que alguien me pueda orientar.
Gracias y disculpen las molestias.
Saludos
JDVM

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Goertzel y punto fijo
« Respuesta #1 en: 06 de Mayo de 2009, 23:11:12 »
Hola, creo que si usas un PIC18 no tienes a disposición el formato Q1.15 (a menos no por hardware), lo que puedes hacer es trabajar todo el algoritmo con número enteros.

Los dsPIC tienen ese tipo de formato numérico, y logran velocidades bastante altas en el proceso.

Otra opción sería que conviertas el valor del conversor A/D a Q1.15 para realizar tu algoritmo, pero pienso que no es lo más conveniente.

saludos!


 

anything