def Cargar_datos_y_señal(Link): Datos = scipy.io.loadmat(Link) Datos_Complejos = Datos['radar_I'] + 1j* Datos['radar_Q'] fase = Obtener_angulos(Datos_Complejos) fase = fase - np.mean(fase) return Datos, fase def Obtener_angulos(Datos): Resultado = np.zeros(len(Datos)) Desfasaje = 0 for i in range(len(Resultado)): ### Siempre cargo el primer caso sin importar que if i == 0: Angulo = np.angle(Datos[0,0]) Resultado[0] = Angulo continue ### Calculo el angulo del dato Angulo_anterior = Angulo Angulo = np.angle(Datos[i]) if np.sign(Angulo_anterior) != np.sign(Angulo) and np.abs(Angulo) > 2: Desfasaje += np.sum(np.pi * (-2)* np.sign(Angulo)) Resultado[i] = Desfasaje + Angulo[0] return Resultado def Resampleo_de_la_señal(Señal, frecuencia_original, nueva_frecuencia): Señal = np.ravel(Señal) # asegurar que es 1D ### Genero el filtro pasabajos para luego hacer el resampling fc = 2.0 # Frecuencia de corte pasa-bajos [Hz] numtaps = 40 # Orden del filtro FIR (más grande = transición más suave) nyq = fs / 2.0 b = firwin(numtaps, fc / nyq) # Filtro FIR pasa-bajo lineal-fase Señal_filt = lfilter(b, 1.0, Señal) ### Busco el resampling rate y lo implemento #M = int(np.floor(fs / (4*fc))) # margen de seguridad del 25% M = int(np.floor(frecuencia_original/(2*nueva_frecuencia))) M = max(1, M) # evitar M=0 Señal_dec = resample_poly(Señal_filt, up=1, down=M) fs_new = fs / M return Señal_dec, fs_new