Filtro FIR en Punto Fijo Esteban Bustamante
Trabajo desarrollado como trabajo final de la materia Técnicas Digitales III
Cargando...
Buscando...
Nada coincide
Filtro FIR en Punto Fijo

Introducción

Este proyecto se presenta como parte práctica del trabajo final de la asignatura Técnicas Digitales III. Consiste en la implementación de un Filtro FIR (Finite Impulse Response) definido completamente en software, desarrollado en lenguaje C y orientado a sistemas digitales.

El filtro opera sobre muestras de entrada representadas en formato de punto fijo, haciendo uso de la librería FXP. Para garantizar el correcto sincronismo entre las muestras de entrada y el proceso de filtrado, se emplea un buffer de entrada que permite el procesamiento por bloques de muestras en paralelo.

Tanto la señal de entrada como la señal de salida del filtro se almacenan en archivos de datos en formato PCM (.pcm). Este formato simplifica el procesamiento posterior de los datos y garantiza compatibilidad con herramientas externas para la visualización y el análisis de señales.

Con el objetivo de facilitar su uso y análisis, el proyecto incluye una interfaz gráfica desarrollada en Python, que permite generar señales de prueba, ejecutar el filtro y visualizar gráficamente tanto la entrada como la salida. Asimismo, el filtro puede ser ejecutado directamente desde línea de comandos mediante una interfaz CLI.

Junto al binario se entrega una demostración lista para ser ejecutada tanto en modo gráfico como en modo línea de comandos (ver Demostración).

Arquitectura del sistema

El sistema se encuentra dividido en los siguientes bloques principales:

  • Generador de señales: encargado de generar señales de prueba (por ejemplo, tonos senoidales) y almacenarlas en formato PCM.
  • Filtro FIR: núcleo del sistema, implementado en C, que realiza el filtrado en punto fijo utilizando coeficientes configurables.
  • Interfaz gráfica (GUI): desarrollada en Python, permite configurar parámetros, ejecutar el filtro y visualizar resultados.
  • Interfaz de línea de comandos (CLI): permite ejecutar el filtro de forma directa, facilitando su integración en scripts y pruebas automatizadas.

Características

  • Implementación de un filtro FIR en software.
  • Uso de aritmética de punto fijo mediante la librería FXP.
  • Configuración del número de bits fraccionales.
  • Procesamiento de múltiples muestras en paralelo.
  • Coeficientes de filtro configurables externamente.
  • Entrada y salida en formato PCM de 32 bits.
  • Visualización gráfica de:
    • señal de entrada
    • señal de salida
    • coeficientes del filtro
  • Soporte para ejecución en modo GUI y modo CLI.

Uso del filtro

El filtro puede utilizarse de dos maneras:

  • Mediante una interfaz gráfica (GUI), pensada para demostraciones y análisis visual.
  • Mediante una interfaz de línea de comandos (CLI), orientada a pruebas rápidas o automatización.

Demostración

Para la demostración de la funcionalidad el filtro en C, se generó un filtro haciendo uso de FIIR, que permite generar coeficientes para filtros arbitrarios con frecuencias de muestreo y filtrado determinadas. Para esta demostración se generó un FIR cuya respuesta al impulso coincide con un seno cardinal (sinc), con una frecuencia de muestreo de 48kHz, una frecuencia de cutoff de 800Hz y un ancho de banda de transición de 3840Hz, el cual observando su respuesta en frecuencia, tenemos que genera una atenuación de 35dB a 0.1 frecuencia relativa a la de Nyquist, es decir ((0.1)Fs/2 = 2.4kHz).

Respuesta en frecuencia del filtro demostración

Demostración en modo gráfico (GUI)

Para ejecutar la demostración en modo gráfico, será necesario descargar en primer lugar la última release, y luego utilizar los siguientes comandos para ejecutar el script con la interfaz gráfica:

cd code/src && make
cd ../utils/scripts
./fir_filter_utn -gui

Desde la interfaz gráfica es posible:

  • Generar señales de entrada con uno o más tonos.
  • Configurar la frecuencia de muestreo y amplitudes.
  • Cargar un archivo de coeficientes del filtro.
  • Ejecutar el filtro FIR.
  • Visualizar gráficamente la señal de entrada, la salida filtrada y los coeficientes del filtro.

Demostración en modo línea de comandos (CLI)

El filtro también puede ejecutarse directamente desde la línea de comandos. Para esto deberán tener los archivos coeficientes.pcm e input.pcm que se incluyen con el programa, incluídos en el link de las releases. Es necesario ubicar estos archivos dentro de la carpeta td3-proyecto-final-1.6.0 que se extrae del zip descargado. Luego ejecutando estos comandos podríamos correr el programa.

cp coeficientes.pcm input.pcm code/utils/scripts/
cd code/src && make
cd ../utils/scripts
./fir_filter_utn -fc=coeficientes.pcm -NB-FRAC=31 --samples=80 input.pcm

donde:

  • coeficientes.pcm es el archivo que contiene los coeficientes del filtro (en formato float, uno por línea).
  • NB-FRAC indica el número de bits fraccionales utilizados.
  • samples define la cantidad de muestras procesadas en paralelo.
  • input.pcm es el archivo PCM de entrada.

El archivo de salida se genera automáticamente en formato PCM y puede ser posteriormente visualizado o procesado con herramientas externas.

Posibles mejoras

Si bien por el alcance de este proyecto puede considerarse terminado, estas son algunas mejoras interesantes que pueden interesarle al desarrollador:

  • Hacer una interfaz común a distintos periféricos para permitir distintas entradas.
  • Optimizar el filtro haciendo uso de threads en paralelo, lo que implicaría un mecanismo de sincronización.
  • Hacer uso de la librería libusb para permitir el procesamiento de datos en tiempo real, además haciendo uso de la interfaz anteriormente mencionada.

Referencias