{"id":44,"date":"2024-10-12T23:54:00","date_gmt":"2024-10-13T04:54:00","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=44"},"modified":"2026-04-06T10:41:12","modified_gmt":"2026-04-06T15:41:12","slug":"periodo-y-desplazamiento-en-tiempo","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/periodo-y-desplazamiento-en-tiempo\/","title":{"rendered":"1.2 Se\u00f1al - Periodo y Desplazamiento en tiempo con Sympy-Python"},"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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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=\"periodo\">1. Periodo de x(t)<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 2.3.1 p35, 2.3.2 p37<\/p>\n\n\n\n<p>El periodo T<sub>0<\/sub> de una sinusoidal es el tiempo que dura un ciclo de la se\u00f1al. La frecuencia en Hz determina su periodo, es decir que al aplicar&nbsp; un desplazamiento de T<sub>0<\/sub>, se repite la misma se\u00f1al.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> T_0 = \\frac{2\\pi}{\\omega_0} = \\frac{1}{f_0} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t+T_0) = x(t)<\/span>\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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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=\"desplazamiento\">2. Desplazamiento en tiempo de x(t)<\/h2>\n\n\n\n<p>El efecto de aplicar a <code><strong>t<\/strong><\/code> un desplazamiento <strong>t<\/strong><sub>0<\/sub> diferente al periodo <strong>T<\/strong><sub>0<\/sub>, presenta un desfase de <em><strong>adelanto<\/strong><\/em> o <em><strong>retraso<\/strong><\/em> seg\u00fan el signo de t<sub>0<\/sub> como se muestra en la gr\u00e1fica. Siendo x(t) = A cos(\u03c9t)<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t+t_0) = A cos(\\omega_0(t-t_0))<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = A cos(\\omega_0 t-\\omega_0 t_0)<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = A cos(\\omega_0 t + \\varphi)<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\varphi= -\\omega_0 t_0 <\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/telg1001\/files\/2017\/02\/desplaza_t_01_animado.gif\" alt=\"\" \/><\/figure>\n\n\n\n<p>Desde el punto de vista de la fase de la se\u00f1al, se puede observar que:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\varphi= -\\omega_0 t_0 = -2 pi \\Big(\\frac{t_0}{T_0} \\Big)<\/span>\n\n\n\n<p>El tema tambi\u00e9n se trata en el curso de Se\u00f1ales y Sistemas, donde se detalla:<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u01\/senales-operaciones-en-tiempo\/\" data-type=\"post\" data-id=\"81\">Se\u00f1ales con desplazamiento. escalamiento o inversi\u00f3n en tiempo<\/a><\/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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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=\"cero\">3. Ceros de x(t)<\/h2>\n\n\n\n<p>Para disponer de una marca referencial de la funci\u00f3n, se usar\u00e1 el primer cero de x(t), por simplicidad de obtener mediante:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\cos(\\omega t + \\varphi) = 0<\/span>\n\n\n\n<p>donde se cumple que<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\omega t + \\varphi = \\frac{\\pi}{2} <\/span>\n\n\n\n<p>que permite despejar el tiempo cuando ocurre el cero en un periodo:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\omega t = \\frac{\\pi}{2} - \\varphi <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> t_{cero} = \\frac{\\frac{\\pi}{2} -\\varphi}{\\omega}=\\frac{\\frac{\\pi}{2} - \\varphi}{2\\pi f_0} <\/span>\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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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\">4. Ejercicio<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan Fig 2.7 p36<\/p>\n\n\n\n<p>Realizar las gr\u00e1ficas para x(t) con varios valores de f<sub>0<\/sub> = [ 200, 100, 0 ] y observar las diferencias entre ellas.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) =5 \\cos(2 \\pi f_0 t )<\/span>\n\n\n\n<p>A\u00f1adir una se\u00f1al que se desplace en la tercera parte de su periodo (T\/3).<\/p>\n\n\n\n<p>Listar los par\u00e1metros de cada se\u00f1al.<\/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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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\">5. Algoritmo con Sympy<\/h2>\n\n\n\n<p>El ejercicio planteado requiere analizar m\u00e1s de una se\u00f1al, por lo que es conveniente agruparlas en una lista <code>x_senales<\/code>, para luego usar una funciones como&nbsp;<code>cos_args_one_term()<\/code> que obtenga los par\u00e1metros de cada se\u00f1al. La funci\u00f3n contiene el algoritmo realizado en <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/dsp-u01\/parametros-de-sinusoides\/\" data-type=\"post\" data-id=\"18265\">Se\u00f1al \u2013 Par\u00e1metros de sinusoides<\/a> .<\/p>\n\n\n\n<p>Los <strong>par\u00e1metros<\/strong> se agrupan en un <code>diccionario<\/code>, identificando cada uno por el nombre en la entrada. Se incorpora en los par\u00e1metros el valor de <code>'periodo'<\/code><\/p>\n\n\n\n<p>Por simplicidad, el an\u00e1lisis del argumento del coseno que es una expresi\u00f3n m\u00e1s simple, se realiza en la funci\u00f3n auxiliar <code>_cos_arg_freqfase()<\/code> con instrucciones para simplificar las expresiones cuando se aplican desplazamientos en el tiempo, seg\u00fan se ha mostrado en la parte te\u00f3rica.<\/p>\n\n\n\n<p>Con los par\u00e1metros de cada se\u00f1al se agrupan las <strong>frecuencias<\/strong>, <strong>amplitud<\/strong> y <strong>fase<\/strong>, a\u00f1adiendo el primer <strong>cero<\/strong> de x(t) como una referencia en el primer periodo y destacar los desplazamientos de una se\u00f1al. (ejemplo x3(t))<\/p>\n\n\n\n<p>Resultados del algoritmo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>se\u00f1ales revisadas:  4\namplitudes:  &#091;5, 5, 5, 5]\nfrecuencias: &#091;200, 100, 100, 0]\nfases:       &#091;0, 0, -0.333333333333333*pi, 0]\nperiodo m\u00e1ximo: 0.02\nperiodo m\u00ednimo: 0.005\nra\u00edces x_ceros: &#091;0.00125, 0.0025, 0.004166666666667, nan]\n&gt;&gt;&gt;<\/code><\/pre>\n\n\n\n<p>Para realizar las gr\u00e1ficas, se unificar\u00e1 el eje de tiempo usando la frecuencia m\u00e1s lenta o periodo m\u00e1ximo. El procedimiento es semejante al ejercicio anterior,&nbsp; a\u00f1adiendo sub-gr\u00e1ficas (subplots) para cada una de las se\u00f1ales.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal02.png\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal02.png\" alt=\"gr\u00e1fica de varias se\u00f1ales x(t)\" class=\"wp-image-55\" \/><\/a><\/figure>\n\n\n\n<p>Las funciones presentadas se prueban y se mejoran en cada ejercicio o tema de la unidad, por ejemplo a\u00fan no se analizan se\u00f1ales con varios t\u00e9rmino suma. Las funciones se a\u00f1aden a un archivo <strong><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/dsp-algoritmos-telg1034-py\/\" data-type=\"page\" data-id=\"18266\">telg1034.py<\/a><\/strong> para ser reutilizadas y actualizadas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Figura 2.3.1 p35 par\u00e1metros en diccionario de x(t) \n# https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/\nimport sympy as sym\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# variables continuas\nt = sym.Symbol('t', real=True,nonnegative=True)\npi = sym.pi\nDosPi = sym.UnevaluatedExpr(2*sym.pi)\n\n# INGRESO\nx1 = 5*sym.cos(DosPi*(200)*t)\nx2 = 5*sym.cos(DosPi*(100)*t)\nx3 = x2.subs(t,t-0.005\/3) # adelanto en x(t-t0)\nx4 = 5*sym.cos(DosPi*(0)*t)\n\nx_senales = &#x5B;x1,x2,x3,x4]\nx_etiqueta = &#x5B;'x1(t)','x2(t)','x3(t)','x4(t)']\n\n# PROCEDIMIENTO   \ndef cos_args_one_term(x):\n    ''' versi\u00f3n 1. Amplitud, frecuencia en Hz y rad, fase de sin() o cos()\n    referenciado a un t\u00e9rmino coseno.\n    Entrega diccionario con 'amplitud', 'freq_Hz','freq_rad','fase','periodo'.\n    '''\n    parametro={} # par\u00e1metros en diccionario\n    amplitud = sym.S.One ; T = sym.S.Zero ; fase = sym.S.Zero\n    freq_Hz = sym.S.Zero ; freq_rad = sym.S.Zero\n\n    x = sym.sympify(x) # expresi\u00f3n a sympy, por si es constante\n    \n    SinSumas = True # Analizar un solo cos o sin\n    if x.is_Add:\n        SinSumas = False\n\n    if SinSumas: # x(t) un solo cos() o sin():\n        partes = x.args\n        for unaparte in partes:\n            cond1 = unaparte.has(sym.cos)\n            cond2 = unaparte.has(sym.sin)\n            cond3 = unaparte.has(t)\n            # revisa argumento_cos(w*t+p)\n            if (cond1 or cond2) and cond3:\n                argumento_cos = unaparte.args&#x5B;0]\n                &#x5B;freq_Hz,freq_rad,fase] = _cos_arg_freqfase(argumento_cos)\n                if unaparte.has(sym.sin): # convierte a cos(), estandariza\n                    fase = fase - sym.pi\/2\n            else:\n                amplitud = amplitud*unaparte\n                \n        # amplitud, revisi\u00f3n num\u00e9rica\n        if amplitud.is_Number:\n            if amplitud&lt;0: # amplitud con signo positivo\n                amplitud = np.abs(amplitud)\n                fase = fase + sym.pi\n            if isinstance(amplitud,sym.Float):\n                amplitud = float(amplitud)\n            if isinstance(amplitud,sym.Integer):\n                amplitud = int(amplitud)\n            # mantiene forma racional (a\/b) de amplitud\n        # periodo T\n        if freq_Hz != sym.S.Zero:\n            T = 1\/freq_Hz\n        else: # es una constante\n            T = sym.S.NaN\n    if not(x.has(t)): # es una constante\n        amplitud = x\n    parametro&#x5B;'amplitud'] = amplitud\n    parametro&#x5B;'freq_Hz']  = freq_Hz\n    parametro&#x5B;'freq_rad'] = freq_rad\n    parametro&#x5B;'fase'] = fase\n    parametro&#x5B;'periodo'] = T\n                \n    if SinSumas == False:\n        msg ='x(t) tiene suma de terminos, usar solo un t\u00e9rmino de la forma:'\n        msg = msg + '\\n A*cos(w*t+p) o tambi\u00e9n A*sin(w*t+p) ... \\n'\n        print('cos_sin_args:',x,msg)\n    return(parametro)\n\ndef _cos_arg_freqfase(argumento_cos):\n    ''' _funci\u00f3n_auxiliar_ que obtiene frecuencia (Hz y rad) y fase de la\n    expresion: 2*pi*freq_Hz*t + fase\n    entrega: &#x5B;freq_Hz,freq_rad,fase]\n    '''\n    freq_Hz = sym.S.Zero ; freq_rad = sym.S.Zero ; fase = sym.S.Zero\n    argumento_cos = sym.sympify(argumento_cos) # si es constante\n    # simplifica  w*t + fase\n    argumento_cos = argumento_cos.doit() # evalua sym.UnevaluatedExpr()\n    argumento_cos = sym.expand(argumento_cos) # simplifica polinomio t\n    argumento_cos = sym.collect(argumento_cos,t) # agrupa terminos t\n    \n    if argumento_cos.is_Add: # t\u00e9rminos suma: w*t + fase\n        term_suma = sym.Add.make_args(argumento_cos)\n        for term_k in term_suma:\n            if term_k.has(t): # w*t\n                freq_rad = sym.simplify(term_k\/t)\n                freq_Hz = sym.simplify(freq_rad\/(2*pi))\n            else: # fase suma t\u00e9rmino sin t\n                fase = fase + term_k\n    if argumento_cos.is_Mul: # termino \u00fanico: w*t\n        if argumento_cos.has(t):\n            freq_rad = sym.simplify(argumento_cos\/t)\n            freq_Hz = sym.simplify(freq_rad\/(2*pi))\n        else:\n            fase = fase + argumento_cos\n    parametros_arg = &#x5B;freq_Hz,freq_rad,fase]\n    return(parametros_arg)\n\n# DESARROLLO -----------------------\nx_conteo = len(x_senales)\n# lista frecuencias en se\u00f1ales\nx_freq = &#x5B;];  x_amplitud =&#x5B;]; x_fase = &#x5B;]; x_ceros = &#x5B;]\nfor unasenal in x_senales:\n    parametro = cos_args_one_term(unasenal)\n    freq_k = parametro&#x5B;'freq_Hz']\n    ampl_k = parametro&#x5B;'amplitud']\n    fase_k = parametro&#x5B;'fase']\n    x_freq.append(freq_k)\n    x_amplitud.append(ampl_k)\n    x_fase.append(fase_k)\n    # marca un cero cos(wt+p)=0; wt+p=pi\/2\n    # t_cero = (pi\/2-p)\/w = (pi\/2-p)\/(2*pi*f)\n    uncero = sym.nan # si es una constante\n    if abs(freq_k)&gt;0:\n        uncero = (pi\/2 - fase_k)\/(2*pi*freq_k)\n        uncero = np.around(float(uncero),decimals=15)\n    x_ceros.append(uncero)\n\n# periodo m\u00e1ximo y m\u00ednimo de se\u00f1ales\nT_max = 1 ; T_min = 1\nfreq = np.array(x_freq)\nfreq_min = float(np.min(np.abs(freq)))\nfreq_max = float(np.max(np.abs(freq)))\nd_freq = np.abs(freq_max - freq_min) # ancho de banda\nif freq_max&gt;0:\n    T_min = 1\/freq_max\nif d_freq&gt;0: # min y max no son iguales \n    if freq_min&gt;0:\n        T_max = 1\/d_freq\n    else:  # freq_min==0, selecionar otro T_max\n        freq_min = float(np.min(freq&#x5B;freq&gt;0]))\n        T_max = 1\/freq_min \nelse: # min y max son iguales\n    T_max = 1\/freq_min\n\n# SALIDA\nprint('se\u00f1ales revisadas: ', x_conteo)\nprint('amplitudes: ', x_amplitud)\nprint('frecuencias:', x_freq)\nprint('fases:      ', x_fase)\nprint('periodo m\u00e1ximo:', T_max)\nprint('periodo m\u00ednimo:', T_min)\nprint('ra\u00edces x_ceros:', x_ceros)\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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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=\"grafica\">6. Gr\u00e1fica con subplots<\/h2>\n\n\n\n<p>Para la parte gr\u00e1fica se ampl\u00edan las instrucciones anteriores, a\u00f1adiendo sub-gr\u00e1ficas (subplots) para cada una de las se\u00f1ales.<\/p>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: <a href=\"https:\/\/matplotlib.org\/stable\/api\/_as_gen\/matplotlib.pyplot.subplots.html\">matplotlib.pyplot.subplots<\/a><\/p>\n\n\n\n<p>Para esta ocasi\u00f3n se aborda el desplazamiento considerando que la expresi\u00f3n usada es con Sympy. Para la gr\u00e1fica que requiere la conversi\u00f3n de forma simb\u00f3lica a num\u00e9rica con la instrucci\u00f3n <code>lambdify<\/code> para m\u00e1s de una se\u00f1al. como se muestra en el ejercicio.<\/p>\n\n\n\n<p>Conversi\u00f3n de <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mnumericos\/mn-recursos\/resumen-sympy\/#convertir\">forma simb\u00f3lica a forma num\u00e9rica Lambda<\/a> ( curso: m\u00e9todos num\u00e9ricos)<\/p>\n\n\n\n<p>Para la gr\u00e1fica se pueden usar el par\u00e1metro del periodo obtenido en el algoritmo. por lo que ser\u00e1 necesario solamente a\u00f1adir la cantidad de periodos a observar de la se\u00f1al con menor frecuencia. Para mostrar una curva \"suave\" se indicar\u00e1 la cantidad de tramos por periodo que se usar\u00e1 para las muestras, se sugiere para el coseno al menos 20.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># GRAFICAR x(t) ---------------------------<\/span>\n<span style=\"color: #ff0000\"># INGRESO<\/span>\ntramos_T = 20       <span style=\"color: #ff0000\"># tramos por periodo<\/span>\nperiodos_graf = 4   <span style=\"color: #ff0000\"># periodos en una grafica<\/span><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal02.png\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal02.png\" alt=\"gr\u00e1fica de varias se\u00f1ales x(t)\" class=\"wp-image-55\" \/><\/a><\/figure>\n\n\n\n<p>Las se\u00f1ales contenidas en la lista <code>x_senales<\/code> requieren muestras de cada una, que se agrupan en <strong>xi_k<\/strong>, reutilizando el proceso usando en la gr\u00e1fica realizada al inicio de la unidad.<\/p>\n\n\n\n<p>El primer cero de la funci\u00f3n se marca con una l\u00ednea vertical discont\u00ednua (<code>dashed<\/code>) de color rojo en los puntos encontrados en <code>x_ceros<\/code>. Cuando una se\u00f1al es una constante, el cero se marca con <code>sym.nan<\/code> (not a number) que no genera la l\u00ednea roja.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    <span style=\"color: #d35400\">if<\/span> x_ceros&#091;i]!=sym.nan:\n        graf_x.axvline(x_ceros&#091;i],color=<span style=\"color: #008000\">'red'<\/span>,\n                       linestyle=<span style=\"color: #008000\">'dashed'<\/span>)<\/code><\/pre>\n\n\n\n<p>gr\u00e1fica, instrucciones adicionales<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICAR x(t) ---------------------------\n# INGRESO\ntramos_T = 20       # tramos por periodo\nperiodos_graf = 4   # periodos en una grafica\n\n# PROCEDIMIENTO GRAFICA\nmuestras_T = tramos_T + 1\n# intervalo de t entre &#x5B;a,b] en pasos dt\na = 0\nb = T_max*periodos_graf\ndt = T_min\/tramos_T # tama\u00f1o de paso,tramo, muestreo\nti = np.arange(a,b+dt,dt)\n\nxi_k = &#x5B;] # muestras de cada se\u00f1al x\nfor unasenal in x_senales:\n    # x(t) a forma num\u00e9rica lambda t:\n    if unasenal.has(t):\n        xk = sym.lambdify(t,unasenal)\n    else: # es constante\n        xk = lambda t: unasenal + 0*t\n    xki = xk(ti) # eval\u00faa en intervalo\n    xi_k.append(np.copy(xki))\n\n# graficar\nfig_x = plt.figure()\nfor i in range(0,x_conteo,1):\n    graf_sub = x_conteo*100+10+i+1\n    graf_x = fig_x.add_subplot(graf_sub)\n    graf_x.plot(ti,xi_k&#x5B;i])\n    graf_x.set_ylabel(x_etiqueta&#x5B;i])\n    graf_x.grid()\n    graf_x.axhline(0,color='black')\n    if i == 0:\n        graf_x.set_title('Se\u00f1ales xk(t)')\n    if x_ceros&#x5B;i]!=sym.nan:\n        graf_x.axvline(x_ceros&#x5B;i],color='red',\n                       linestyle='dashed')\ngraf_x.set_xlabel('t (segundos)')\n# graf_x.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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/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=\"funcionestelg1034\">7. Funciones de telg1034.py como dsp<\/h2>\n\n\n\n<p>Las funciones para uso en otras unidades se agrupan en el archivo <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/dsp-algoritmos-telg1034-py\/\" data-type=\"page\" data-id=\"18266\"><strong>telg1034<\/strong>.py<\/a> que permite simplificar los algoritmos como el del ejercicio anterior. Las funciones se llaman usando el alias dsp<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #d35400\">import<\/span> telg1034 <span style=\"color: #d35400\">as<\/span> dsp<\/code><\/pre>\n\n\n\n<p>La declaraci\u00f3n de <strong>variables cont\u00ednuas<\/strong> como s\u00edmbolo tambi\u00e9n se simplifican a una l\u00ednea. Se incorpora la forma <strong>equivalentes<\/strong> de funciones Sympy y Numpy al usar <code>lambdify<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># variables continuas<\/span>\n<span style=\"color: #d35400\">from<\/span> telg1034 <span style=\"color: #d35400\">import<\/span> t,A,w,f,p,pi,DosPi,I,equivalentes<\/code><\/pre>\n\n\n\n<p>En los siguientes ejercicios se har\u00e1 uso de <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/dsp-algoritmos-telg1034-py\/\" data-type=\"page\" data-id=\"18266\">telg1034.py<\/a> para resumir las funciones de cada algoritmo que se incorpore en la unidad.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 Ejemplo de desplazamiento por adelanto o retraso<\/h3>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan ejercicio 2.4 p39<\/p>\n\n\n\n<p>Usando x(t), realice la gr\u00e1fica para x(t-t<sub>1<\/sub>) cuando t<sub>1<\/sub> = 0.0075. Luego repita el proceso para t<sub>1<\/sub> = -0.01. Revise la direcci\u00f3n del desplazamiento. Para cada caso calcule la fase de la sinusoide desplazada en el tiempo.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_1(t) = 20 cos(2\\pi(40)t - 0.4\\pi) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_2(t) = x_1( t-0.0075) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_3(t) = x_1( t-(-0.01))<\/span>\n\n\n\n<p>Las se\u00f1ales indicadas en el ejercicio se ingresan al algoritmo en la lista <code>x_senales<\/code>. Los desplazamientos se realizan al sustituir <code>t<\/code> por <code>(t-desplaza)<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nx1 = 20*sym.cos(DosPi*40*t-0.4*pi)\nx2 = x1.subs(t,t-0.0075)\nx3 = x1.subs(t,t-(-0.01))<\/code><\/pre>\n\n\n\n<p>con los siguientes resultados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>se\u00f1ales revisadas:  3\namplitudes:  &#091;20, 20, 20]\nfrecuencias: &#091;40, 40, 40]\nfases:       &#091;-0.4*pi, -1.0*pi, 0.4*pi]\nperiodo m\u00e1ximo: 0.05\nperiodo m\u00ednimo: 0.025\nraices x_ceros: &#091;0.01125, 0.01875, 0.00125]\n&gt;&gt;&gt;<\/code><\/pre>\n\n\n\n<p>Para la parte gr\u00e1fica se usa las instrucciones dadas en la secci\u00f3n [ <a href=\"# gr\u00e1fica\">gr\u00e1fica<\/a> ]:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal_shift_01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"563\" height=\"444\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/senalSinusoidal_shift_01.png\" alt=\"se\u00f1al desplazada en el tiempo\" class=\"wp-image-75\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Instrucciones en Python<\/h3>\n\n\n\n<p>Instrucciones simplificadas, sin la secci\u00f3n gr\u00e1fica.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 2.4 p39 x(t) desplazamiento adelanto o retraso\n# https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-senales\/\nimport sympy as sym\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport telg1034 as dsp\n\n# variables continuas\nfrom telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes\n\n# INGRESO\nx1 = 20*sym.cos(DosPi*40*t-0.4*pi)\nx2 = x1.subs(t,t-0.0075)\nx3 = x1.subs(t,t-(-0.01))\n\nx_senales = &#x5B;x1,x2,x3]\nx_etiqueta = &#x5B;'x(t)','x(t-0.0075)','x(t+0.01)']\n\n# PROCEDIMIENTO   \nx_conteo = len(x_senales)\n# lista frecuencias en se\u00f1ales\nx_freq = &#x5B;];  x_amplitud =&#x5B;]; x_fase = &#x5B;]; x_ceros = &#x5B;]\nfor unasenal in x_senales:\n    parametro = dsp.cos_args_one_term(unasenal)\n    freq_k = parametro&#x5B;'freq_Hz']\n    ampl_k = parametro&#x5B;'amplitud']\n    fase_k = parametro&#x5B;'fase']\n    x_freq.append(freq_k)\n    x_amplitud.append(ampl_k)\n    x_fase.append(fase_k)\n    # marca un cero cos(wt+p)=0; wt+p=pi\/2\n    # t_cero = (pi\/2-p)\/w = (pi\/2-p)\/(2*pi*f)\n    uncero = sym.nan # si es una constante\n    if abs(freq_k)&gt;0:\n        uncero = (pi\/2 - fase_k)\/(2*pi*freq_k)\n        uncero = np.around(float(uncero),decimals=15)\n    x_ceros.append(uncero)\n\n# periodo m\u00e1ximo y m\u00ednimo de se\u00f1ales\nT_max = 1 ; T_min = 1\nfreq = np.array(x_freq)\nfreq_min = float(np.min(np.abs(freq)))\nfreq_max = float(np.max(np.abs(freq)))\nd_freq = np.abs(freq_max - freq_min) # ancho de banda\nif freq_max&gt;0:\n    T_min = 1\/freq_max\nif d_freq&gt;0: # min y max no son iguales \n    if freq_min&gt;0:\n        T_max = 1\/d_freq\n    else:  # freq_min==0, selecionar otro T_max\n        freq_min = float(np.min(freq&#x5B;freq&gt;0]))\n        T_max = 1\/freq_min \nelse: # min y max son iguales\n    T_max = 1\/freq_min\n\n# SALIDA\nprint('se\u00f1ales revisadas: ', x_conteo)\nprint('amplitudes: ', x_amplitud)\nprint('frecuencias:', x_freq)\nprint('fases:      ', x_fase)\nprint('periodo m\u00e1ximo:', T_max)\nprint('periodo m\u00ednimo:', T_min)\nprint('ra\u00edces x_ceros:', x_ceros)\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=\"#periodo\">periodo<\/a><\/p>\n\n\n\n<p><a href=\"#desplazamiento\">desplazamiento<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcionestelg1034\">telg1034.py as dsp<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>periodo desplazamiento ejercicio algoritmo gr\u00e1fica telg1034.py as dsp 1. Periodo de x(t) Referencia: McClellan 2.3.1 p35, 2.3.2 p37 El periodo T0 de una sinusoidal es el tiempo que dura un ciclo de la se\u00f1al. La frecuencia en Hz determina su periodo, es decir que al aplicar&nbsp; un desplazamiento de T0, se repite la misma se\u00f1al. [&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-44","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\/44","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=44"}],"version-history":[{"count":6,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/44\/revisions"}],"predecessor-version":[{"id":24104,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/44\/revisions\/24104"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=44"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=44"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=44"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}