{"id":276,"date":"2024-12-23T17:28:18","date_gmt":"2024-12-23T22:28:18","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=276"},"modified":"2026-04-06T10:31:41","modified_gmt":"2026-04-06T15:31:41","slug":"fir-filtro-de-medias-moviles","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/fir-filtro-de-medias-moviles\/","title":{"rendered":"4.1 FIR - Filtro de Medias M\u00f3viles"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#mediamovil\">media m\u00f3vil<\/a><\/p>\n\n\n\n<p>ejercicio:<\/p>\n\n\n\n<p><a href=\"#ejercicio\">rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#componentes\">2 componentes<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 5 p167<\/p>\n\n\n\n<p>Se introduce el an\u00e1lisis para un <strong>sistema discreto<\/strong> en tiempo con respuesta de impulso finita,&nbsp; <strong>FIR<\/strong> (Finite Impulse Response), tambi\u00e9n conocido como filtros FIR.<\/p>\n\n\n\n<p>Un filtro es un sistema con valores de salida resultantes de la suma ponderada de un n\u00famero finito de valores de una secuencia de entrada. Se define como una operaci\u00f3n tambi\u00e9n conocida como<strong> ecuaci\u00f3n de diferencias<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mediamovil\">1. El filtro de Medias M\u00f3viles<\/h2>\n\n\n\n<p>Una se\u00f1al discreta se modifica por medio de un filtro que se determina como un promedio de un intervalo que se desplaza en el tiempo. Para un sistema tipo causal, se tiene:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y[n] = \\sum_{k=n-M}^{n} b_{n-k} x[k] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = b_{(M)} x[n-M ] + b_{(M-1)} x[n-M+1] + \\text{...} + b_{(0)} x[n]<\/span>\n\n\n\n<p>cuando los coeficientes de b<sub>k<\/sub> no son iguales, se dice que el promedio o <strong>media&nbsp; m\u00f3vil<\/strong> es <strong>ponderado<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#mediamovil\">media m\u00f3vil<\/a><\/p>\n\n\n\n<p>ejercicio:<\/p>\n\n\n\n<p><a href=\"#ejercicio\">rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#componentes\">2 componentes<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejercicio\">2. Ejercicio. Se\u00f1al rectangular<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan ejemplo 5.1 p174<\/p>\n\n\n\n<p>Considere un sistema con media m\u00f3vil para 3 puntos que se expresa como una ventana que desplaza.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y[n] = \\sum_{k=n-2}^{n} \\frac{1}{3} x[k] <\/span>\n\n\n\n<p>con entrada rectangular entre [0,10]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2025\/01\/FIR_mediamovil01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"557\" height=\"441\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2025\/01\/FIR_mediamovil01.png\" alt=\"FIR media m\u00f3vil\" class=\"wp-image-277\" \/><\/a><\/figure>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n]= \\begin{cases} 1, &amp; 0 \\le n \\le 10 \\\\0 , &amp; en otro caso\\end{cases} <\/span>\n\n\n\n<p><strong>Ref<\/strong>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u01\/senales-escalon-e-impulso\/\" data-type=\"post\" data-id=\"92\">Se\u00f1ales Escal\u00f3n unitario \u03bc(t) e Impulso unitario \u03b4(t)<\/a>. blog de Se\u00f1ales y Sistemas<\/p>\n\n\n\n<p>La se\u00f1al se define como un escal\u00f3n que se compone de dos se\u00f1ales escal\u00f3n:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n]= \\mu [n] -\\mu [n-11] <\/span>\n\n\n\n<p>Para el algoritmo se define a partir de \u03bc[n] que en Sympy es Heaviside. Se indican la cantidad de muestras a observar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nu = sym.Heaviside(n)\n<span style=\"color: #ff0000\"># se\u00f1al como suma de las partes<\/span>\nmuestrasN = 10 + 1  <span style=\"color: #ff0000\"># # intervalo &#091;0,10]<\/span>\nxn = u - u.subs(n,n-muestrasN)\n\n<span style=\"color: #ff0000\"># FIR media m\u00f3vil<\/span>\nventana = 2 + 1 <span style=\"color: #ff0000\"># intervalo &#091;0,2]<\/span>\nbk = np.ones(ventana, dtype=<span style=\"color: #ff00ff\">float<\/span>)\/ventana\ncausal = <span style=\"color: #d35400\">True<\/span>  <span style=\"color: #ff0000\"># causal o no causal<\/span><\/code><\/pre>\n\n\n\n<p>En la media m\u00f3vil se requiere M=2, si el sistema es causal y el vector b<sub>k<\/sub> que son los valores de ponderaci\u00f3n. Se obtienen los siguientes resultados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>muestreo: 11  ; tama\u00f1o ki: 17\nx&#091;n]: Heaviside(n) - Heaviside(n - 11)\nbk: &#091;0.33333333 0.33333333 0.33333333]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#mediamovil\">media m\u00f3vil<\/a><\/p>\n\n\n\n<p>ejercicio:<\/p>\n\n\n\n<p><a href=\"#ejercicio\">rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#componentes\">2 componentes<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentes\">3. Ejercicio&nbsp; con se\u00f1al de dos componentes<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: McClellan 5-.1 p176<\/p>\n\n\n\n<p>Considere la se\u00f1al con un componente exponencial y otro componente senoidal que se considera <strong>ruido<\/strong> o <strong>interferencia<\/strong> que degrada la se\u00f1al a observar. Se pretende minimizar o remover el efecto del componente senoidal<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n]= \\begin{cases} (1.02)^n + \\frac{1}{2}\\cos(2 \\pi n \/8 + \\pi\/4), &amp; 0 \\le n \\le 40 \\\\0 , &amp; n&lt;0\\end{cases} <\/span>\n\n\n\n<p>Realice el ejercicio con media m\u00f3vil que tiene una ventana de 7 puntos o M=6.<\/p>\n\n\n\n<p>Usando el algoritmo se tiene el siguiente resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"554\" height=\"436\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/FIR_mediamovil02.png\" alt=\"FIR media movil 02\" class=\"wp-image-20639\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>muestreo: 41  ; tama\u00f1o ki: 55\nx&#091;n]: (1.02**n + 0.5*cos(pi*n\/4 + pi\/4))*(Heaviside(n) - Heaviside(n - 40))\nbk: &#091;0.14285714 0.14285714 0.14285714 0.14285714 \n     0.14285714 0.14285714 0.14285714]<\/code><\/pre>\n\n\n\n<p>El bloque de ingreso para el algoritmo es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nu = sym.Heaviside(n)\n<span style=\"color: #ff0000\"># se\u00f1al como suma de las partes<\/span>\nmuestrasN = 40 + 1  <span style=\"color: #ff0000\"># # intervalo &#091;0,40]<\/span>\nx0 = u - u.subs(n,n-muestrasN)\nx1 = 1.02**n +0.5*sym.cos(2*pi*n\/8 + pi\/4)\nxn = x1*x0\n\n<span style=\"color: #ff0000\"># FIR media m\u00f3vil<\/span>\nventana = 6 + 1 <span style=\"color: #ff0000\"># intervalo &#091;0,6]<\/span>\nbk = np.ones(ventana, dtype=<span style=\"color: #ff00ff\">float<\/span>)\/ventana\ncausal=<span style=\"color: #d35400\">True<\/span>  <span style=\"color: #ff0000\"># causal o no causal<\/span><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#mediamovil\">media m\u00f3vil<\/a><\/p>\n\n\n\n<p>ejercicio:<\/p>\n\n\n\n<p><a href=\"#ejercicio\">rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#componentes\">2 componentes<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmo\">4. Algoritmo en Python<\/h2>\n\n\n\n<p>El modelo de algoritmo para los ejercicios&nbsp; se presenta para la se\u00f1al rectangular. Para otros ejercicios se actualiza la se\u00f1al en el bloque de ingreso.<\/p>\n\n\n\n<p>La variable <code>causal=True<\/code> establece el signo de la ventana deslizante, si el sistema es causal, el signo es negativo.<\/p>\n\n\n\n<p>Algoritmos y funciones: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/dsp-algoritmos-telg1034-py\/\" data-type=\"page\" data-id=\"18266\">telg1034.py<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 5.1 p174 FIR - Media M\u00f3vil general\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport sympy as sym\nimport telg1034 as dsp\n\n# variables continuas\nfrom telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes\n# variables discretas\nfrom telg1034 import n\n\n# INGRESO\nu = sym.Heaviside(n)\n# se\u00f1al como suma de las partes\nmuestrasN = 10 + 1  # # intervalo &#x5B;0,10]\nxn = u - u.subs(n,n-muestrasN)\n\n# FIR media m\u00f3vil\nventana = 2 + 1 # intervalo &#x5B;0,2]\nbk = np.ones(ventana, dtype=float)\/ventana\ncausal = True  # causal o no causal\n\n# PROCEDIMIENTO ----------------\n# muestreo x&#x5B;n]\nki = np.arange(-ventana,muestrasN + ventana,1,dtype=int)\nxni = sym.lambdify(n,xn, modules=equivalentes)\nxki = xni(ki) \n\n# FIR Media M\u00f3vil\ncausal_sign = +1 # sistema causal\nif not(causal): # sistema no causal\n    causal_sign = -1\n    \n# ajuste de intervalo con ventana\nyki = np.zeros(muestrasN + 2*ventana,dtype=float)\nfor i in range(-ventana,muestrasN + 2*ventana,1):\n    unaventana = 0\n    for k in range(0,ventana,1):\n        if (i-causal_sign*k)&gt;=0 and (i-causal_sign*k)&lt;=(muestrasN+ventana):\n            unaventana = unaventana + xki&#x5B;i-causal_sign*k]*bk&#x5B;k]\n    yki&#x5B;i] = unaventana\n\n# SALIDA\nprint('muestreo:',muestrasN,' ; tama\u00f1o ki:',len(ki))\nprint('x&#x5B;n]:',xn)\nprint('bk:',bk)\n\n# GRAFICA FIR\nplt.subplot(211) # x&#x5B;n]\nplt.stem(ki,xki,linefmt = 'C0:',\n         label='x&#x5B;n]')\nplt.xlabel('n')\nplt.ylabel('x&#x5B;n]')\nplt.title('FIR Media M\u00f3vil')\nplt.legend()\n\nplt.subplot(212) # y&#x5B;n]\nplt.stem(ki,yki,linefmt = 'C2:',label='y&#x5B;n]')\nplt.xlabel('n')\nplt.ylabel('y&#x5B;n]')\nplt.legend()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#mediamovil\">media m\u00f3vil<\/a><\/p>\n\n\n\n<p>ejercicio:<\/p>\n\n\n\n<p><a href=\"#ejercicio\">rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#componentes\">2 componentes<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>media m\u00f3vil ejercicio: rectangular 2 componentes algoritmo Referencia: McClellan 5 p167 Se introduce el an\u00e1lisis para un sistema discreto en tiempo con respuesta de impulso finita,&nbsp; FIR (Finite Impulse Response), tambi\u00e9n conocido como filtros FIR. Un filtro es un sistema con valores de salida resultantes de la suma ponderada de un n\u00famero finito de valores [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-dsp-unidades","format":"standard","meta":{"footnotes":""},"categories":[193],"tags":[],"class_list":["post-276","post","type-post","status-publish","format-standard","hentry","category-dsp-unidades"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=276"}],"version-history":[{"count":5,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/276\/revisions"}],"predecessor-version":[{"id":24097,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/276\/revisions\/24097"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}