1
FILTROS IIR Y FIR
Maria Paula Rodriguez Alba 5600492
Nicoll Saray Casanova Clavijo 5600505
Maria Camila Muñoz Arias 5600499
Nicolas Bernal 5600389
Luna Juliana Gualteros 5600503
IIR paso bajo para recuperar componentes de baja frecuencia
Resumen – Este informe documenta una serie de experimentos en en las señales muestreadas. Además, se diseñaron filtros IIR
el procesamiento de señales utilizando filtros IIR y FIR. Los rechazabanda para eliminar componentes no deseadas. En
objetivos de este estudio fueron: paralelo, se diseñaron filtros FIR paso bajo para comparar su
eficacia en la recuperación de componentes de baja
• Generar señales periódicas y aplicar técnicas de muestreo. frecuencia.
• Diseñar y aplicar filtros IIR y FIR para recuperar
componentes de frecuencia específicas. Muestreo y Visualización: Para facilitar la evaluación de los
• Analizar una señal de base de datos contaminada con resultados, todas las señales procesadas se muestrearon
armónicos y restaurar la señal original. utilizando una plataforma de adquisición de datos (DAQ), lo
que permitió su visualización en una PC para su análisis.
Los resultados de estos experimentos proporcionan una
comprensión más profunda de las capacidades y limitaciones de los
Análisis de Señal de Tiempo Continuo: Se utilizó una señal
filtros IIR y FIR en el procesamiento de señales.
de tiempo continúo compuesta por componentes de 2 Hz y
Palabras clave – Filtro, Periódica, Señal 400 Hz. Los filtros IIR y FIR diseñados se aplicaron a esta
señal para evaluar su capacidad en la recuperación de
componentes de frecuencia específicas.
I. INTRODUCCION
Procesamiento de Señal de Base de Datos: Se aplicaron
técnicas de procesamiento de señales a una señal de base de
E l procesamiento de señales es una disciplina esencial en datos llamada 𝑣𝑎𝑙. Esta señal se contaminó con armónicos a
60 Hz y 110√2𝑉 de amplitud. Luego, se utilizaron filtros IIR
numerosos campos, desde la ingeniería de comunicaciones
hasta la medicina. En el núcleo de muchas aplicaciones de y FIR para recuperar la señal original y eliminar los
procesamiento de señales se encuentran los filtros digitales, armónicos.
que desempeñan un papel crucial en la manipulación y
extracción de información de señales. Este informe se centra
en la exploración de filtros IIR (Respuesta al Impulso 1.2 Relevancia y Contexto
Infinito) y FIR (Respuesta al Impulso Finito) a través de una
serie de experimentos prácticos que abarcan diversas El conocimiento y la habilidad en el diseño y aplicación de
aplicaciones y desafíos. filtros IIR y FIR son fundamentales en aplicaciones del
mundo real. Por ejemplo, en telecomunicaciones, se utilizan
1.1 Objetivos del Estudio filtros para eliminar ruido y componentes no deseadas en
señales de voz y datos. En la medicina, los filtros son
El objetivo principal de este estudio es comprender y evaluar cruciales para la detección de señales biológicas y la
el desempeño de filtros IIR y FIR en el procesamiento de eliminación de artefactos en señales médicas. Además, en
señales. Para alcanzar este objetivo, se llevaron a cabo las procesamiento de imágenes y audio, los filtros desempeñan
siguientes actividades: un papel vital en la mejora y manipulación de señales.
Generación de Señales Periódicas: En un primer conjunto de
II. PROCEDIMIENTO
experimentos, se generaron señales periódicas a partir de
impulsos discretos en el tiempo. Estos impulsos se 2.1 Generación de Señales Periódicas
programaron en intervalos específicos, lo que creó señales
con características distintivas en el dominio del tiempo. 2.1.1 Señal de Entrada
Luego, se muestrearon y se adaptaron a Secuencias Se comenzó generando la señal 𝑥[𝑛𝑇𝑠] de forma periódica,
Temporales Muestreadas (STMs) para su análisis. que se componía de impulsos discretos en el tiempo. La
señal se construyó utilizando una serie de impulsos delta de
Diseño y Aplicación de Filtros IIR y FIR: Se diseñaron filtros Dirac ponderados. Los intervalos y amplitudes de los
2
impulsos se especificaron según el enunciado de la práctica.
2.1.2 Muestreo y STM
Luego de generar la señal periódica, se procedió a
muestrearla con una frecuencia de muestreo (Fs) específica.
La señal muestreada se adaptó a una Secuencia Temporal
Muestreada (STM) para su posterior análisis.
2.2 Diseño y Aplicación de Filtros IIR y FIR
2.2.1 Filtros Paso Bajo IIR
Se diseñaron filtros IIR paso bajo para recuperar
componentes de baja frecuencia en las señales muestreadas.
Los filtros se diseñaron con frecuencias de corte específicas,
y se aplicaron a las señales para extraer las componentes de
interés.
• Filtro Pasa Bajos IIR – Fs: 2kHz y Fc: 500Hz 2.2.2 Filtros Rechazabanda IIR
Además de los filtros paso bajo, se diseñaron filtros IIR
rechazabanda para eliminar componentes no deseadas en las
señales muestreadas.
2.2.3 Filtros FIR Paso Bajo
Se diseñaron filtros FIR paso bajo con características
similares a los filtros IIR paso bajo para comparar su
rendimiento en la recuperación de componentes de baja
frecuencia.
• Filtro Pasa Bajos FIR – Fs: 2kHz y Fpass: 500Hz –
• Filtro Pasa Bajos IIR – Fs: 400Hz y Fc: 150Hz Fstop: 1kHz
• Filtro Pasa Bajos FIR – Fs: 400Hz y Fpass: 135Hz –
• Filtro Pasa Bajos IIR – Fs: 200Hz y Fc: 50Hz Fstop: 200Hz
• Filtro Pasa Bajos FIR – Fs: 200Hz y Fpass: 75Hz y
• Filtro Rechaza Banda IIR Fstop: 100Hz
3
set(s,'BaudRate',115200); % Asegúrate de que la velocidad de
baudios coincida con la configuración del microcontrolador
fopen(s);
% Inicializa un arreglo para almacenar los datos recibidos
data = zeros(1, numel(x));
% Configura una figura para graficar los datos
figure;
plot(data);
title('Señal recibida desde STM32');
xlabel('Muestras');
• Filtro Rechaza Banda FIR
ylabel('Valor');
% Inicializa un contador de muestras
sample = 1;
% Recibe y grafica los datos
while ishandle(1) % Continúa hasta que la figura se cierre
data(sample) = str2double(fgetl(s));
sample = sample + 1;
% Actualiza el gráfico en tiempo real
set(1, 'YData', data);
drawnow;
end
2.3 Muestreo de Señales y Visualización
Para analizar y visualizar los resultados de los filtros aplicados, % Cierra la conexión serial
todas las señales procesadas se muestrearon utilizando una fclose(s);
plataforma de adquisición de datos (DAQ). Esto permitió su delete(s);
visualización en una PC para su posterior análisis y clear s;
comparación. me sale error el siguiente error Unrecognized function or
variable 'x'.
2.4 Señal de Tiempo Continuo
Error in untitled4 (line 7)
Se utilizó una señal de tiempo continúo compuesta por
data = zeros(1, numel(x));
componentes de 2 Hz y 400 Hz. Esta señal se procesó utilizando
los filtros IIR y FIR diseñados en la sección anterior para • Ejercicio 2
evaluar su capacidad para recuperar componentes de frecuencia
específicas. % Configura el puerto serie.
s = serial('COM5'); % Reemplaza 'x' con el número del puerto
2.5 Señal de Base de Datos COM correspondiente
Se aplicaron técnicas de procesamiento de señales a una señal set(s,'BaudRate',115200); % Asegúrate de que la velocidad de
de base de datos denominada 𝑣𝑎𝑙. Esta señal se contaminó con baudios coincida con la configuración del microcontrolador
armónicos a 60 Hz y 110√2𝑉 de amplitud. Se utilizaron filtros fopen(s);
IIR y FIR para recuperar la señal original y eliminar los
armónicos. % Inicializa un arreglo para almacenar los datos recibidos
data = zeros(1, numel(x));
Es importante tener en cuenta que los filtros IIR y FIR se
diseñaron específicamente para cada aplicación, con % Configura una figura para graficar los datos
frecuencias de corte y características de ganancia adaptadas a figure;
los requisitos de cada experimento. plot(data);
title('Señal recibida desde STM32');
xlabel('Muestras');
III. CODIGOS
ylabel('Valor');
• Ejercicio 1.
% Inicializa un contador de muestras
% Configura el puerto serie. sample = 1;
s = serial('COM5'); % Reemplaza 'x' con el número del puerto
COM correspondiente % Recibe y grafica los datos
while ishandle(1) % Continúa hasta que la figura se cierre
4
data(sample) = str2double(fgetl(s)); int len = snprintf(buffer, sizeof(buffer), "%f\r\n", x[i]);
sample = sample + 1; HAL_UART_Transmit(&huart2, (uint8_t *)buffer, len,
% Actualiza el gráfico en tiempo real HAL_MAX_DELAY);
set(1, 'YData', data); }
drawnow; }
end }
% Cierra la conexión serial
fclose(s); int main(void)
delete(s); {
clear s; HAL_Init();
me sale error el siguiente error Unrecognized function or SystemClock_Config();
variable 'x'. MX_GPIO_Init();
MX_DMA_Init();
Error in untitled4 (line 7) MX_TIM3_Init();
data = zeros(1, numel(x)); MX_UART4_Init();
MX_USART2_UART_Init(); // Configura y habilita
• Keil 1 USART2
#include "main.h" period = 1000000 / sample_rate;
#include "stm32f3xx_hal.h"
#include <stdio.h> TIM3_Init();
TIM_HandleTypeDef htim3; HAL_TIM_Base_Start_IT(&htim3); // Iniciar el
temporizador y habilitar las interrupciones periódicas
UART_HandleTypeDef huart4;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_tx; while (1)
{
float x[] = {2.0, 1.0, 0.0, 1.0}; // Valores de la señal // // Transmitir los valores de la señal x[nTs] a MATLAB
uint32_t sample_rate = 800; // Frecuencia de muestreo de // for (int i = 0; i < sizeof(x) / sizeof(x[0]); i++) {
800Hz // char buffer[50];
uint32_t period; // int len = snprintf(buffer,
sizeof(buffer), "%f\r\n", x[i]);
void SystemClock_Config(void); // HAL_UART_Transmit(&huart2,
static void MX_GPIO_Init(void); (uint8_t *)buffer, len, HAL_MAX_DELAY);
static void MX_DMA_Init(void); // }
static void MX_TIM3_Init(void);
static void MX_UART4_Init(void);
static void MX_USART2_UART_Init(void); // // Esperar un tiempo antes de enviar nuevamente
// HAL_Delay(1000);
void TIM3_Init(void) { }
[Link] = TIM3; }
[Link] = 71; // Reloj a 1 MHz
[Link] = TIM_COUNTERMODE_UP; • Keil 2
[Link] = period - 1;
[Link] = TIM_CLOCKDIVISION_DIV1; #include "main.h"
#include "stm32f3xx_hal.h"
if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { #include <stdio.h>
// Error de inicialización del temporizador #include <math.h>
Error_Handler();
} TIM_HandleTypeDef htim3;
} UART_HandleTypeDef huart4;
void UART_HandleTypeDef huart2;
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef DMA_HandleTypeDef hdma_usart2_tx;
*htim) {
if (htim == &htim3) { void SystemClock_Config(void);
static void MX_GPIO_Init(void);
for (int i = 0; i < sizeof(x) / sizeof(x[0]); i++) { static void MX_DMA_Init(void);
char buffer[50]; static void MX_TIM3_Init(void);
5
static void MX_UART4_Init(void); %% 2000 Hz
static void MX_USART2_UART_Init(void); % Parámetros
duracion = 10; % Duración
uint32_t sample_rate = 2000; // Frecuencia de muestreo de frecuencia_muestreo = 360; % Frecuencia de muestreo
2000Hz num_muestras = duracion * frecuencia_muestreo; % N. de
uint32_t period; muestras
float t = 0.0; // Variable de tiempo
% Vector de tiempo
void TIM3_Init(void) { t = linspace(0, duracion, num_muestras);
[Link] = TIM3;
[Link] = 71; // Reloj a 1 MHz dtf = fft(val2);
[Link] = TIM_COUNTERMODE_UP;
[Link] = period - 1; % Frecuencia correspondiente
[Link] = TIM_CLOCKDIVISION_DIV1; frecuencia = (-num_muestras/2:(num_muestras/2)-1) *
frecuencia_muestreo / num_muestras;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK) {
// Error de inicialización del temporizador % Reorganizar la DTF
Error_Handler(); dtf = fftshift(dtf);
}
} % Parámetros del filtro
frecuencia_corte1 = 1; % Frecuencia de corte inferior
void frecuencia_corte2 = 58; % Frecuencia de corte superior
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef orden = 8;
*htim) {
if (htim == &htim3) { % Filtro a la señal, se realizo con filter designer
// Calcula los valores de la señal x(t) senal_filtrada = sosfilt(SOS, val2);
float x_t = 2.0 + cos(2 * 3.141592653589793 * 200 * t) +
sin(2 * 3.141592653589793 * 400 * t); % Calcular la DTF
t += 1.0 / sample_rate; // Incrementa el tiempo en función dtf_filtrada = fft(senal_filtrada);
de la frecuencia de muestreo
frecuencia_filtrada = (-num_muestras/2:(num_muestras/2)-1)
// Transmite el valor de la señal x(t) a través de UART * frecuencia_muestreo / num_muestras;
char buffer[50];
int len = snprintf(buffer, sizeof(buffer), "%f\r\n", x_t); % Reorganizar la DTF
HAL_UART_Transmit(&huart2, (uint8_t *)buffer, len, dtf_filtrada = fftshift(dtf_filtrada);
HAL_MAX_DELAY);
} % Graficar la DTF
} figure;
subplot(2,1,1);
int main(void) { plot(frecuencia, abs(dtf));
HAL_Init(); xlabel('Frecuencia (Hz)');
SystemClock_Config(); ylabel('Magnitud');
MX_GPIO_Init(); title('DTF ambos lados de la señal');
MX_DMA_Init();
MX_TIM3_Init(); % Graficar la señal filtrada
MX_UART4_Init(); subplot(2,1,2);
MX_USART2_UART_Init(); plot(frecuencia_filtrada, abs(dtf_filtrada));
xlabel('Frecuencia (Hz)');
period = 1000000 / sample_rate; ylabel('Magnitud');
TIM3_Init(); title('DTF señal filtrada');
HAL_TIM_Base_Start_IT(&htim3); // Iniciar el
temporizador y habilitar las interrupciones periódicas %% 400 Hz
% Parámetros
while (1) { duracion = 10; % Duración
frecuencia_muestreo = 360; % Frecuencia de muestreo
} num_muestras = duracion * frecuencia_muestreo; % N. de
} muestras
• Filtros % Vector de tiempo
t = linspace(0, duracion, num_muestras);
6
dtf = fft(val2); % Parámetros del filtro
frecuencia_corte1 = 1; % Frecuencia de corte inferior
% Frecuencia correspondiente frecuencia_corte2 = 58; % Frecuencia de corte superior
frecuencia = (-num_muestras/2:(num_muestras/2)-1) * orden = 8;
frecuencia_muestreo / num_muestras;
% Filtro a la señal, se realizo con filter designer
% Reorganizar la DTF senal_filtrada = sosfilt(SOSD, val2);
dtf = fftshift(dtf);
% Calcular la DTF
% Parámetros del filtro dtf_filtrada = fft(senal_filtrada);
frecuencia_corte1 = 1; % Frecuencia de corte inferior
frecuencia_corte2 = 58; % Frecuencia de corte superior frecuencia_filtrada = (-num_muestras/2:(num_muestras/2)-1)
orden = 8; * frecuencia_muestreo / num_muestras;
% Filtro a la señal, se realizo con filter designer % Reorganizar la DTF
senal_filtrada = sosfilt(SOSM, val2); dtf_filtrada = fftshift(dtf_filtrada);
% Calcular la DTF % Graficar la DTF
dtf_filtrada = fft(senal_filtrada); figure;
subplot(2,1,1);
frecuencia_filtrada = (-num_muestras/2:(num_muestras/2)-1) plot(frecuencia, abs(dtf));
* frecuencia_muestreo / num_muestras; xlabel('Frecuencia (Hz)');
ylabel('Magnitud');
% Reorganizar la DTF title('DTF ambos lados de la señal');
dtf_filtrada = fftshift(dtf_filtrada);
% Graficar la señal filtrada
% Graficar la DTF subplot(2,1,2);
figure; plot(frecuencia_filtrada, abs(dtf_filtrada));
subplot(2,1,1); xlabel('Frecuencia (Hz)');
plot(frecuencia, abs(dtf)); ylabel('Magnitud');
xlabel('Frecuencia (Hz)'); title('DTF señal filtrada');
ylabel('Magnitud');
title('DTF ambos lados de la señal');
IV. CONCLUSIONES
% Graficar la señal filtrada Los experimentos realizados en este informe destacan la
subplot(2,1,2); importancia de los filtros IIR y FIR en el procesamiento de
plot(frecuencia_filtrada, abs(dtf_filtrada)); señales. Se demostró su capacidad para recuperar componentes
xlabel('Frecuencia (Hz)'); de frecuencia específicas y eliminar componentes no deseadas.
ylabel('Magnitud'); La elección entre filtros IIR y FIR depende de factores como la
title('DTF señal filtrada'); aplicación, las especificaciones de diseño y la eficiencia
computacional.
%% 200 Hz
% Parámetros
V. REFERENCIAS
duracion = 10; % Duración
frecuencia_muestreo = 360; % Frecuencia de muestreo [1] Software matlab
num_muestras = duracion * frecuencia_muestreo; % N. de [2]. Software Stm32Cube
muestras [3]. Software uVision
% Vector de tiempo
t = linspace(0, duracion, num_muestras);
dtf = fft(val2);
% Frecuencia correspondiente
frecuencia = (-num_muestras/2:(num_muestras/2)-1) *
frecuencia_muestreo / num_muestras;
% Reorganizar la DTF
dtf = fftshift(dtf);