cdf -Señal triangular

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

\sum_{i=0}^{N}p_i(x)=1

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.