Referencia: Leon W Couch apéndice B p675
Señal Triangular, pmf, cdf
Se obtiene barriendo una ventana estrecha de Δx voltios de ancho, verticalmente a lo largo de las formas de onda y después midiendo la frecuencia relativa de la ocurrencia de voltajes en la ventana Δx.
El eje de tiempo se divide en n intervalos y la forma de onda aparece nΔx veces dentro de estos intervalos en la ventana Δx.
Para observar lo indicado usando python, se presenta el siguiente grupo de instrucciones:
Generar la señal
En un intervalo [a,b] de tiempo, con n muestras en el intervalo y una señal triangular con frecuencia fs Hz.
Las librerías de señales de scipy
tiene la señal diente de sierra, con parámetro de simetría que permite variar la forma del triángulo para ajustarlo a una señal simétrica como la del ejemplo.
import matplotlib.pyplot as plt import numpy as np import scipy.signal as signal import scipy.stats as stats # INGRESO # Rango en tiempo de la señal y muestras a = 0 b = 1 n = 2000 # Frecuencia de la señal en Hz fs = 5 # PROCEDIMIENTO # simetria de la señal triangular diente de sierra simetria = 0.5 t = np.linspace(a, b, n) senal = signal.sawtooth(2 * np.pi * fs * t, simetria) # SALIDA plt.plot(t,senal) plt.title('Señal Triangular') plt.xlabel('t') plt.ylabel('señal') plt.show()
Determinar la función de probabilidad de masa PMF
Se divide el rango de valores posibles de la señal en m intervalos.
Para simplificar el conteo de valores por rango se usa la función scipy.stats.relfreq
, que cuenta en m intervalos entre el rango de la señal, dando como resultado las frecuencias relativas a intervalos Δx
Si se considera aproximar la función a contínua para observación, será necesario compensar el vector de relativas al dividir por Δx pues el conteo relativo depende del número de divisiones m.
# Función de Probabilidad de Masa, PMF m = 20 # intervalos en análisis #PROCEDIMIENTO relativa = stats.relfreq(senal, numbins = m ) deltax = relativa.binsize # considerando el deltax, para valor de PMF relcontinua = relativa.frequency/deltax # Eje de frecuencias, por cada deltax senalmin = np.min(senal) senalmax = np.max(senal) senalrango = np.linspace(senalmin,senalmax,m) # SALIDA print('frecuencia relativa:') print(relativa.frequency) print('Rango de Señal') print(senalrango) print('Aproximación a contínua') print(relcontinua) # SALIDA Grafico de PMF pa = 0-0.1 # rango eje frecuencias pb = 1+0.1 plt.subplot(211) plt.axis([senalmin-deltax,senalmax+deltax,pa,pb]) plt.bar(senalrango,relativa.frequency, width=deltax*0.8) plt.xlabel('Amplitud de señal') plt.ylabel('PMF') plt.subplot(212) plt.axis([senalmin-deltax,senalmax+deltax,pa,pb]) plt.plot(senalrango,relcontinua) plt.xlabel('Amplitud de señal') plt.ylabel('Aproximación a PDF') plt.show()
frecuencia relativa: [ 0.027 0.052 0.053 0.053 0.052 0.053 0.052 0.053 0.052 0.053 0.053 0.052 0.053 0.052 0.053 0.052 0.053 0.053 0.052 0.027] Rango de Señal [-1. -0.8947895 -0.789579 -0.6843685 -0.579158 -0.4739475 -0.368737 -0.2635265 -0.158316 -0.0531055 0.052105 0.1573155 0.262526 0.3677365 0.472947 0.5781575 0.683368 0.7885785 0.893789 0.9989995] Aproximación a contínua [ 0.25662838 0.49424725 0.503752 0.503752 0.49424725 0.503752 0.49424725 0.503752 0.49424725 0.503752 0.503752 0.49424725 0.503752 0.49424725 0.503752 0.49424725 0.503752 0.503752 0.49424725 0.25662838]
Determinar la Función de distribucíón acumulada
Considere el caso discreto, solo es necesario ir acumulando los valores de «relativa».
Al usar la aproximación a contínua, la sumatoria debe considerar el área bajo la curva, por lo que los valores se multiplican por Δx antes de acumular los valores de las frecuencias.
# Función distribución acumulada acumulada = np.cumsum(relcontinua*deltax) # Salida CDF plt.step(senalrango,relcontinua,label='pdf', where='post') plt.step(senalrango,acumulada,label='cdf', where='post') plt.xlabel('Amplitud de señal') plt.title(' Función de distribuión acumulada , CDF') plt.legend() plt.show()
Tarea: realice el ejercicio con otras señales periódicas.