Example #1
0
 def multitaper(self, opcion_senal, inicio, fin, bw, t, p, multiply, fs, state_DC):
     '''
     Función que tiene como objetivo realizar el análisis del método multitaper, 
     recibe la banda de paso que se va a analizar y los parámetros W (frec. cercanas)
     T (tiempo de duración de la ventana) ,P(cantidad de ventanas ortogonales) y el
     factor que da indicios de la cantidad de segmentos que se tomarán, que son
     necesarios para este modelo y devuelve finalmente los parámetros de frecuencia
     y valores que darán el gráfico del resultado.
     '''
     if state_DC==False:
         params = dict(fs = fs, fpass = [inicio, fin], tapers = [bw, t, p], trialave = 1)
         # Se mantiene la relación para garantizar los valores correctos para el reshape
         x = int(self.__data[opcion_senal].shape[0]/(fs*multiply))
         datos = self.__data[opcion_senal]
         datos = datos[:fs*multiply*x]
         data = np.reshape(datos, (fs*multiply, x),order='F')
         Pxx,f = mtspectrumc(data, params)
     else:
         datos = self.__data[opcion_senal]
         datos = datos - np.mean(datos)
         params = dict(fs = fs, fpass = [inicio, fin], tapers = [bw, t, p], trialave = 1)
         x = int(datos.shape[0]/(fs*multiply))
         datos = datos[:fs*multiply*x]
         data = np.reshape(datos, (fs*multiply, x),order='F')
         Pxx,f = mtspectrumc(data, params)
     return Pxx,f
 def multitaper_analisis(
     self, datos, fs, w, t, n_t, fmin, fmax, first_parametro
 ):  #algoritmo que realiza los calculos para obtener el analisis por multitaper
     #quita el nivel DC restándole la media
     datosv = np.array(datos) - np.mean(np.array(datos))
     #evito errores lógicos
     if fmin >= fmax:
         return None
     p = (2 * w * t) - n_t  #obtencion del parámetro p de los tapers
     params = dict(fs=fs, fpass=[fmin, fmax], tapers=[w, t, p], trialave=1)
     #para que de en cualquier cantidad de datos que se elijan de la senal
     segmentos = (len(datosv) / (fs * first_parametro))
     if type(segmentos) == float:
         segmentos1 = round(
             segmentos
         )  #si se obtien un decimal, aproxima al valor mas cercano
         x = first_parametro * fs * segmentos1
         datos_new = datosv[:x]  #nuevo vector de datos
         data1 = np.reshape(
             datos_new, (first_parametro * fs, segmentos1), order='F'
         )  #reshape no recibe datos flotantes por lo que se aproxima al dato mas cercano y se define un nuevo vector de datos
         Pxx1, f1 = mtspectrumc(data1, params)
         return (f1, Pxx1)  #devuelvo la frecuencia y la potencia
     data = np.reshape(
         datosv, (first_parametro * fs, segmentos), order='F'
     )  #generacion de la nueva matriza partir de los parametros y los datos del canal seleccionado
     Pxx, f = mtspectrumc(data, params)
     return (f, Pxx)
Example #3
0
 def calcularPSD_Multitaper(self,segmentos,fs,fcMin,fcMax,W,T,p,trialAverage):
     if self.senalFiltrada.shape[0] == 0:                                                # Sí ya hay una señal filtrada
         if self.banderaDimension == 1:                                                  # se trabajará con ella, de lo contrario
             senal = self.senal;                                                         # se empleara la señal original
             
         elif self.banderaDimension == 2:
             if self.canalActual == -1:
                 senal = self.senal[0];
             else:
                 senal = self.senal[self.canalActual];
     else:
         senal = self.senalFiltrada;
         
     senal = senal - np.mean(senal);                                                     # MECANISMO
     N = senal.shape[0];                                                                 # De igual forma al anterior, se establecen
     numero = N/(segmentos*fs);                                                          # los límiter de los parámetros, y se calculan
                                                                                         # las muestras que debe tener cada segmento de 
     K = 2*T*W-p;                                                                        # la señal; segmentos que serán multiplicado por  
     # K < M, quien es M?                                                                # los Slepian del algoritmo Multitaper
     
     if (int(fs*numero)*segmentos == N) & (K > 0 & K < N) & (trialAverage < segmentos):
         senalSegmentada = np.reshape(senal,(int(fs*numero),segmentos),order = 'F');
         parametros = dict(fs = fs, fpass = [fcMin, fcMax], tapers = [W, T, p], trialave = trialAverage);
         PSD, f = mtspectrumc(senalSegmentada,parametros);
         self.__controlador.graficarPSD(f,PSD);
Example #4
0
    def analizar_multitaper(self, senal1, fs, fpassi, fpassf, W, T,
                            p):  #analisis usando multitaper scipy 1.1.0

        from chronux.mtspectrumc import mtspectrumc
        params = dict(fs=fs,
                      fpass=[fpassi, fpassf],
                      tapers=[W, T, p],
                      trialave=1)

        data = np.reshape(senal1, (fs * 5, 10), order='F')
        #Calculate the spectral power of the data
        self.Pxx, self.f = mtspectrumc(data, params)
        return (self.Pxx, self.f)
 def devolver_canal_filtradomulti(self, senal1, fs, fpassmenor, fpassmayor,
                                  factor, ventana, P):
     from chronux.mtspectrumc import mtspectrumc
     senal1 = np.squeeze(senal1[0, :])
     #tomo solamente los datos que voy a trabajar de mi señal
     senal1 = senal1 - np.mean(senal1)
     #le quito el valor dc a la señal mediante el valor promedio
     params = dict(fs=fs,
                   fpass=[fpassmenor, fpassmayor],
                   tapers=[factor, ventana, P],
                   trialave=1)
     data = np.reshape(senal1, (fs, 10 * 5), order='F')
     Pxx, f = mtspectrumc(data, params)
     return f, Pxx
Example #6
0
    def analice(
        self, w, t, p, smin, smax, num
    ):  #realiza el analisis de por multitaper, y devuelve las frecuencias y la potencia como vector
        size = int(len(self.senial) / (self.fs * int(num)))
        params = dict(
            fs=self.fs,
            fpass=[int(smin), int(smax)],
            tapers=[int(w), int(t), int(p)],
            trialave=1
        )  #se ingresan los parametros con los que se realiza el analisis multitaper

        data = np.reshape(self.senial, (self.fs * size, int(num)), order='F')

        pxx, f = mtspectrumc(data, params)  #genera el analisis de multitaper
        return pxx, f
Example #7
0
 def multitaper(self, frec1, frec2, W, T, P, num_seg):
     params = dict(fs=self.__fs,
                   fspass=[frec1, frec2],
                   tapers=[W, T, P],
                   trialave=1)
     x = int(self.__datos.shape[0] / (self.__fs * num_seg))
     print(x)
     datos = self.__data[self.__key]
     datos = datos - np.mean(datos)
     #print(datos)
     datos = datos[:self.__fs * num_seg]
     #print(datos)
     data = np.reshape(datos, (self.__fs * num_seg, x), order='F')
     Pxx, f = mtspectrumc(data, params)
     return f, Pxx
    def calcularMultitaper(self,data,fmp,ab,tam,inicial,final): #funcion para ejecutar el codigo del multitaper
        
        data =self.__data[:]
        
        sen= data - np.mean(data)
        
        from chronux.mtspectrumc import mtspectrumc # se importa la liberia necesaria para su ejecucion
        
        params = dict(fmp = fmp, fpass = [inicial, final], tapers = [ab, tam, 1], trialave = 1) # en esta variable queda los datos del multitaper

        data = np.reshape(sen,(fmp*5,10),order='F') #esta variable reliza un redimension de los datos

#Calculate the spectral power of the data
        Pxx, f = mtspectrumc(data, params) # se gurada en esta variables los datos resultado del mtspectrum 
        #A numeric vector [W T p] where W is the
        #bandwidth, T is the duration of the data and p 
        #is an integer such that 2TW-p tapers are used.
        return Pxx, f # se envian para ser graficados o utilizados donde se llamen
Example #9
0
 def Me_Multi(self):
     self.senal = self.senal - np.mean(self.senal)
     fsm = int(self.fsm.text())
     flow = int(self.flow.text())
     fhigh = int(self.fhigh.text())
     w = int(self.multiw.text())
     t = int(self.multit.text())
     p = int(self.multip.text())
     params = dict(fs=fsm,
                   fpass=[flow, fhigh],
                   tapers=[w, t, p],
                   trialave=1)
     data = np.reshape(self.senal, (fsm * 5, 10), order='F')
     Pxx, f = mtspectrumc(data, params)
     Pxx = Pxx[(f >= 4) & (f <= 40)]
     Pxx = Pxx.reshape(1, len(Pxx))
     self.__coordinador.recibirDatosSenal(Pxx)
     self.__x_min = 0
     self.__x_max = 2000
     self.__sc.graficar_datos(
         self.__coordinador.devolverDatosSenal(self.__x_min, self.__x_max))
Example #10
0
    def analisis_f(self, fmin, fmax):
        """
        Esta funcion efectua los metodos de Welch, Multitaper y Wavelet continuo para el analisis frecuencial

        Parameters
        ----------
        fmin : Limite inferior de intervalo de la frecuencia de interes .
        fmax : Limite superior de intervalo de la frecuencia de interes.

        """

        key = self.lineEdit.text()
        data = self.data[key]
        self.__coordinador.recibirDatosSenal(data)
        #se devuelven los datos de la senal seleccionada
        x = self.__coordinador.devolverDatosSenal(self.__x_min,
                                                  self.__x_max)[0]

        #se elimina el nivel DC de la senal, si el usuario lo indica
        #se hace restandole a los datos la media de los mismos
        if self.nivel_DC.isChecked() == True:
            x = x - np.mean(x)

        tipo = self.metodo.currentIndex()
        fs = int(self.campo_frecuencia.text())
        #dependiendo del metodo seleccionado por el usuario se efectuan diferentes procesos

        if tipo == 0:  #metodo Welch
            if self.campo_tamano.text() == "" or self.campo_solapamiento.text(
            ) == "":
                #se valida que los parametros necesarios para realizar los calculos no esten en blanco
                msg = QMessageBox(self)
                msg.setIcon(QMessageBox.Information)
                msg.setText("Informacion")
                msg.setWindowTitle('Advertencia')
                msg.setInformativeText('Faltan campos por llenar')
                msg.show()
            else:
                tamano = int(
                    self.campo_tamano.text())  #Ancho de la ventana en muestras
                solapamiento = int(
                    self.campo_solapamiento.text())  #solapamiento en muestras
                f, Pxx = signal.welch(x,
                                      fs,
                                      'hamming',
                                      tamano,
                                      solapamiento,
                                      scaling='density')

                title = "Análisis por método de Welch"

                self.__sc1.graficar_frecuencia(f, Pxx, fmin, fmax, title)

        elif tipo == 1:  #metodo multitaper

            self.graficar_key()

            self.__coordinador.recibirDatosSenal(data)
            x = self.__coordinador.devolverDatosSenal(self.__x_min,
                                                      self.__x_max)[0]
            if self.nivel_DC.isChecked() == True:
                x = x - np.mean(x)

            if self.campo_duracion.text() == "" or self.campo_ancho.text(
            ) == "" or self.campo_p.text() == "" or self.segmentos.text(
            ) == "":
                #se valida que los parametros necesarios para realizar los calculos no esten en blanco
                msg = QMessageBox(self)
                msg.setIcon(QMessageBox.Information)
                msg.setText("Informacion")
                msg.setWindowTitle('Advertencia')
                msg.setInformativeText('Faltan campos por llenar')
                msg.show()
            else:
                #se inicializan los parametros
                W = int(self.campo_duracion.text())
                T = int(self.campo_ancho.text())
                p = int(self.campo_p.text())
                N = int(self.segmentos.text())

                #se crea un vector con ellos
                params = dict(fs=fs,
                              fpass=[fmin, fmax],
                              tapers=[W, T, p],
                              trialave=1)

                #se hace un reshape de los datos
                primer_termino = x.shape[0] / N
                #se hace un ceil para no tomar el valor flotante
                primer_termino = int(np.ceil(primer_termino))
                #se encuentra el tamano final
                shape_final = primer_termino * N
                #se agregan ceros para que los tamanos coincidan
                nuevo_x = np.zeros([shape_final])
                nuevo_x[0:x.shape[0]] = x
                data = np.reshape(nuevo_x, (primer_termino, N), order='F')

                #Se calcula el espectro de los datos
                Pxx, f = mtspectrumc(data, params)

                title = "Análisis por método Multitaper"

                self.__sc1.graficar_frecuencia(f, Pxx, fmin, fmax, title)

        else:  #metodo Wavelet contiuo

            tiempo, freq, power = self.__coordinador.calcularWavelet(
                x, fmin, fmax, fs)

            self.__sc1.graficar_espectro(tiempo, freq, power, fmin, fmax)

        #Se habilitan campos y botones
        self.campo_tamano.setEnabled(False)
        self.campo_solapamiento.setEnabled(False)
        self.adelante_esp.setEnabled(True)
        self.atras_esp.setEnabled(True)
plt.subplot(2, 1, 2)
plt.plot(f[(f >= 4) & (f <= 40)], Pxx[(f >= 4) & (f <= 40)])
plt.show()

#%%analisis usando multitaper
from chronux.mtspectrumc import mtspectrumc

#A numeric vector [W T p] where W is the
#bandwidth, T is the duration of the data and p
#is an integer such that 2TW-p tapers are used.
params = dict(fs=fs, fpass=[0, 50], tapers=[4, 2, 1], trialave=1)

data = np.reshape(anestesia, (fs * 5, 10), order='F')

#Calculate the spectral power of the data
Pxx, f = mtspectrumc(data, params)

plt.plot(f[(f >= 4) & (f <= 40)], Pxx[(f >= 4) & (f <= 40)])
plt.show()

#%%analisis usando multitaper
from chronux.mtspectrumc import mtspectrumc

#A numeric vector [W T p] where W is the
#bandwidth, T is the duration of the data and p
#is an integer such that 2TW-p tapers are used.
params = dict(fs=fs, fpass=[0, 50], tapers=[4, 2, 1], trialave=1)

data = np.reshape(anestesia, (fs * 5, 10), order='F')

#Calculate the spectral power of the data