ECGPUWAVE 1.3.4

File: <base>/src/ecgpuwave/prosen.f (23,992 bytes)
 
C        =======================================================================
C          PROSEN (HACE LOS PROCESADOS DE LA SEQAL: FILTRADO PASO ALTO Y BAJO
C                  DERIVADAS,VALOR CUADRATICO Y INTEGRACION CON VENTANA MOVIL)
C          AUTOR: PABLO LAGUNA/RAIMON JANE, 
C          DATA: 22-MAIG-87
C          MODIFICAT: 19-FEBRER-88
C        =======================================================================
C       -----------------------------------------------------------------------
C       Copyright (C) 2002 Pablo Laguna
C
C       This program is free software; you can redistribute it and/or modify it
C       under the terms of the GNU General Public License as published by the
C       Free Software Foundation; either version 2 of the License, or (at your
C       option) any later version.
C
C       This program is distributed in the hope that it will be useful, but
C       WITHOUT ANY WARRANTY; without even the implied warranty of
C       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
C       General Public License for more details.
C
C       You should have received a copy of the GNU General Public License along
C       with this program; if not, write to the Free Software Foundation, Inc.,
C       59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
C
C       You may contact the author by e-mail (laguna@posta.unizar.es) or postal
C       mail (Dpt. Ingenieria Electrónica y Comunicaciones, Grupo de Tecnología
C       de las Comunicaciones (GTC), Centro Politécnico Superior. Universidad
C       de Zaragoza, María de Luna, 3 (Pol. Actur), Edificio A, Despacho 3.16,
C       50015 Zaragoza. Spain).  For updates to this software, please visit
C       PhysioNet (http://www.physionet.org/).
C       _______________________________________________________________________

c
c        SE LE LLAMA DESDE ECGMAIN PARA REPRESENTAR POR PANTALLA,IMPRESORA 
c        Y PARA DETECTAR QRS (SU PROCESAMIENTO PREVIO)
c
C

C        ---------------------------------------------------------------
C          REALIZA UN FILTRADO PASO BAJO DE LA SEQAL
C        ---------------------------------------------------------------  


         subroutine fpb(n,if,ifc,x,y,iretard)
         dimension x(100000),y(100000)

c        APLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO PASO BAJO. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ.
C         EL FILTRO TIENE UN POLO DOBLE EN (0,1) Y ifc CEROS DOBLES EN
C        ELA CIRCULO UNIDAD .LA GANANCIA DEL
C        FILTRO SERIA DEl NUMERO de CEROS AL CUADRADO. 
C         EL RETARDO DEL FILTRO ES DE NUMERO de CEROS MENOS UNO
C         LAS CONDICIONES INICIALES SUPONGO QUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR 0
C         LA ECUACION SERIA y(Nt)=2y(Nt-t)-y(Nt-2t)+x(Nt)-2x(Nt-CEROSt)
C                                 +x(Nt-2*CEROSt).
C         LA SEQAL FILTRADA LA DEVUELVE EN EL VECTOR y


C        RM ES EL VALOR MEDIO DE LOS 10 PRIMEROS PUNTOS
c         sum=x(1)
c         do i=2,10
c          sum=sum+x(i)
c         end do
c         rm=sum/10
c          rm=x(1)
         rm=0.

C        l eS EL NUMERO DE CEROS
c        ifc ES LA FRECUENCIA DE CORTE A CERO DEL FILTRO
c        if ES LA FRECUENCIA DE MUESTREO DE LA SEQAL
c         l=nint(1.*if/ifc)
c         y(1)=x(1)+ l*rm
c         do i=2,l
c             y(i)=y(i-1)+x(i)-rm
c         end do
c         do i=l+1,n
c             y(i)=y(i-1)+x(i)-x(i-l)
c         end do
c         do i=n,n+l
c               y(i)=y(i-1)+x(n)-x(i-l)
c         end do
 

c        filtro de segundo orden (cuidado se puede inestabilizar

           l=nint(1.*if/ifc)
           y(1)=x(1)+(l**2-1)*rm
           y(2)=(2*y(1)+x(2)-(l**2+1)*rm)
          do i=3,l
               y(i)=(2*y(i-1)-y(i-2)+x(i)-rm)
          end do
           do i=l+1,2*l
               y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+rm)
           end do
           do i=2*l+1,n
               y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+x(i-2*l))
           end do

          do i=n,n+l
               y(i)=(2*y(i-1)-y(i-2)+x(n)-2*x(i-l)+x(i-2*l))
          end do
 
C        QUITO EL RETARDO DE LA SEQAL
         iretard=l-1
         if (n.le.(100000-l+1) ) then
                              do i=1,n
                                y(i)=y(i+l)
                              end do
                             else
                              do i=1,100000-l+1
                                y(i)=y(i+l)
                              end do
                              do i=100000-l+1,n
                                y(i)=0
                              end do
         end if 


C        PONGO EL RESTO A CERO
         do i=n+1,100000
            y(i)=0
         end do
 
         return
         end


C        --------------------------------------------------------------
c          REALIZA UN FILTRADO PASO BAJO DE UN TROZO DE SEQAL
C        --------------------------------------------------------------

         subroutine fpbc(ni,n,if,ifc,x,y,iretard)
         dimension x(100000),y(400)

c        APLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO PASO BAJO. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ.
C         EL FILTRO TIENE UN POLO DOBLE EN (0,1) Y ifc CEROS DOBLES EN
C        EL CIRCULO UNIDAD .LA GANANCIA DEL
C        FILTRO SERIA DEl NUMERO de CEROS AL CUADRADO. 
C         EL RETARDO DEL FILTRO ES DE NUMERO de CEROS MENOS UNO
C         LAS CONDICIONES INICIALES SUPONGO QUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR 0
C         lA ECUACION SERIA Y(nT)=2Y(nT-T)-Y(nT-2T)+X(nT)-2X(nT-cerosT)
c                                 +X(nT-2*cerosT).
C         lA SEQAL FILTRADA LA DEVUELVE EN EL VECTOR y


C        RM ES EL VALOR MEDIO DE LOS 10 PRIMEROS PUNTOS
c         sum=x(ni)
c         do i=ni+2,ni+10
c          sum=sum+x(i)
c         end do
         rm=x(ni)
       
c        l ES EL NUMERO DE CEROS
C        ifc ES LA FRECUENCIA A LA QUE EL FILTRO CAE A CERO
C        if ES LA FRECUENCIA A LA QUE ESTA MUESTREADA LA SEQAL 
C        ni ES LA POSICION INICIAL A PARTIR DE LA CUAL QUIERO FILTRAR
c        n ES EL NUMERO DE PUNTOS A FILTRAR
C        SE DEBE CUMPLIR (n<1000-l) SI NO SE SALDRA DE LOS LIMITES DEL VECTOR
         l=nint(1.*if/ifc)
         y(1)=x(ni+1)+(l**2-1)*rm
         y(2)=(2*y(1)+x(ni+2)-(l**2+1)*rm)
         do i=3,l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-rm)
         end do
         do i=l+1,2*l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-2*x(ni+i-l)+rm)
         end do
         do i=2*l+1,n+l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-2*x(ni+i-l)+x(ni+i-2*l))
         end do
 
C        QUITO EL RETARDO DE LA SEQAL
         iretard=l
         if (n.le.(400-l+1)) then
                              do i=1,n
                                y(i)=y(i+l)
                              end do
                             else
                              do i=1,400-l+1
                                y(i)=y(i+l)
                              end do
                              do i=400-l+1,n
                                y(i)=0
                              end do
         end if 

C        PONGO EL RESTO A CERO
         do i=n+1,400
            y(i)=0
         end do
 
         return
         end
                     
C        ---------------------------------------------------------------
C          FILTRE PASSA ALT (primer ordre) 
C        ---------------------------------------------------------------  

         subroutine  fpa(n,if,ifc,x,y,iretard)
         dimension x(100000), y(100000)
C                                          


c        APLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO PASO BAJO. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ.
C         EL FILTRO TIENE UN POLO DOBLE EN (0,1) Y ifc CEROS DOBLES EN
C        ELA CIRCULO UNIDAD .LA GANANCIA DEL
C        FILTRO SERIA DEl NUMERO de CEROS AL CUADRADO. 
C         EL RETARDO DEL FILTRO ES DE NUMERO de CEROS MENOS UNO
C         LAS CONDICIONES INICIALES SUPONGO QUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR 0
C         LA ECUACION SERIA y(Nt)=2y(Nt-t)-y(Nt-2t)+x(Nt)-2x(Nt-CEROSt)
C                                 +x(Nt-2*CEROSt).
C         LA SEQAL FILTRADA LA DEVUELVE EN EL VECTOR y


C        RM ES EL VALOR MEDIO DE LOS 10 PRIMEROS PUNTOS
c         sum=x(1)
c         do i=2,10
c          sum=sum+x(i)
c         end do
c         rm=sum/10
c          rm=x(1)
         rm=0.

C        l eS EL NUMERO DE CEROS
c        ifc ES LA FRECUENCIA DE CORTE A CERO DEL FILTRO
c        if ES LA FRECUENCIA DE MUESTREO DE LA SEQAL
c         l=nint(1.*if/ifc)
c         y(1)=x(1)+ l*rm
c         do i=2,l
c             y(i)=y(i-1)+x(i)-rm
c         end do
c         do i=l+1,n
c             y(i)=y(i-1)+x(i)-x(i-l)
c         end do
c	 do i=n,n+l
c              y(i)=y(i-1)+x(n)-x(i-l)
c         end do

c        filtro de segundo orden (cuidado se puede desestabilizar)

           l=nint(1.*if/ifc)
           y(1)=x(1)+(l**2-1)*rm
           y(2)=(2*y(1)+x(2)-(l**2+1)*rm)
           do i=3,l
               y(i)=(2*y(i-1)-y(i-2)+x(i)-rm)
          end do
           do i=l+1,2*l
               y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+rm)
           end do
          do i=2*l+1,n
               y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+x(i-2*l))
           end do

         do i=n,n+l
               y(i)=(2*y(i-1)-y(i-2)+x(n)-2*x(i-l)+x(i-2*l))
          end do
 

C        PARTE PASO TODO MENOS PASO BAJO

         iretard=l-1
         gain=l*l
         do i=1,n-iretard
            y(i)=gain*x(i)-y(i+iretard)
         end do    
         do i=n-iretard+1,n
           y(i)=0.
         end do

         
         return
         end
                     
C        ---------------------------------------------------------------
C          REALIZA UN FILTRADO PASO ALTO DE LA SEQAL
C        ---------------------------------------------------------------  

C---         subroutine  fpa(n,if,ifc,x,y,iretard)
c---         dimension x(100000),y(100000)
C
c        aPLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO PASO ALTO. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ . eL FILTRO LO
c        IMPLEMENTO RESTANDO DE UNO PASO TODO OTRO PASO BAJO DE FRECUENCIA
c        DE CORTE MENOR QUE LA ANTERIOR . 
C         cON ESTO OBTENGO UNA  FRECUENCIA DE CORTE DE FC HZ, Y EL
C         lAS CONDICIONES INICIALES SUPONGOQUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR 0.
C         lA ECUACION SERIA y(Nt)=ceros*x(Nt-ceros/2*t)-y(Nt-t)-x(Nt)
c                                 +x(Nt-ceros*t).
C         lA SEQAL FILTRADA LA DEVUELVE EN EL VECTOR y
C        


C        RM ES EL VALOR DEL PRIMER PUNTO
C         rm=x(1)
c--         rm=0.

C        l eS EL NUMERO DE CEROS
c        ifc ES LA FRECUENCIA DE CORTE A CERO DEL FILTRO
c        if ES LA FRECUENCIA DE MUESTREO DE LA SEQAL
c--         l=nint(1.*if/ifc)
c--         y(1)=x(1)+(l**2-1)*rm
c--         y(2)=(2*y(1)+x(2)-(l**2+1)*rm)
c--         do i=3,l
c--             y(i)=(2*y(i-1)-y(i-2)+x(i)-rm)
c--         end do
c--         do i=l+1,2*l
c--             y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+rm)
c--         end do
c--         do i=2*l+1,n
c--             y(i)=(2*y(i-1)-y(i-2)+x(i)-2*x(i-l)+x(i-2*l))
c--         end do
C         do i=n,n+l
C             y(i)=(2*y(i-1)-y(i-2)+x(n)-2*x(i-l)+x(i-2*l))
C         end do


C        PARTE PASO TODO MENOS PASO BAJO
c         do i=1,(l-1)
c         y(i)=l**2*rm-y(i)
c         end do
c         do i=l,n+l
c         y(i)=l**2*x(i-(l-1))-y(i)
c         end do
         
c--         do i=1,l-1
c--         y(i)=l**2*rm-y(i)
c--         end do
c--         do i=l,n
c--         y(i)=l**2*x(i-(l-1))-y(i)
c--         end do

C        QUITO EL RETARDO DE LA SEQAL
c
c         iretard=l-1
c         if (n.le.(100000-l+1)) then
c                              do i=1,n
c                                y(i)=y(i+l-1)
c                              end do
c                             else
c                              do i=1,100000-l+1
c                                y(i)=y(i+l-1)
c                              end do
c                              do i=100000-l+1,n
c                                y(i)=0
c                              end do
c         end if 
         
c-         if (n.le.(100000-l+1)) then
c-                              do i=1,n-L+1
c-                                y(i)=y(i+l-1)
c-                              end do
c-                             else
c-                              do i=1,100000-l+1
c-                                y(i)=y(i+l-1)
c-                              end do
c-                              do i=100000-l,n
c-                                y(i)=0
c-                              end do
c-         end if 

C        PONGO EL RESTO A CERO
c-         do i=n-L,100000
c-          y(i)=0
c-         end do
c-
c---         return
c---         end

C        --------------------------------------------------------------
c          REALIZA UN FILTRADO PASO AlTO DE UN TROZO DE SEQAL
C        --------------------------------------------------------------

         subroutine fpac(ni,n,if,ifc,x,y,iretard)
         dimension x(100000),y(2000)

c        APLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO PASO ALTO. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ.
C         EL FILTRO TIENE UN POLO DOBLE EN (0,1) Y ifc CEROS DOBLES EN
C        EL CIRCULO UNIDAD .LA GANANCIA DEL
C        FILTRO SERIA DEl NUMERO de CEROS AL CUADRADO. 
C         EL RETARDO DEL FILTRO ES DE NUMERO de CEROS MENOS UNO
C         LAS CONDICIONES INICIALES SUPONGO QUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR X(NI)
C         lA ECUACION SERIA Y(nT)=2Y(nT-T)-Y(nT-2T)+X(nT)-2X(nT-cerosT)
c                                 +X(nT-2*cerosT).
C         lA SEQAL FILTRADA LA DEVUELVE EN EL VECTOR y


C        RM ES EL VALOR MEDIO DE LOS 10 PRIMEROS PUNTOS
c         sum=x(ni)
c         do i=ni+2,ni+10
c          sum=sum+x(i)
c         end do
         rm=x(ni)
       
c        l ES EL NUMERO DE CEROS
C        ifc ES LA FRECUENCIA A LA QUE EL FILTRO CAE A CERO
C        if ES LA FRECUENCIA A LA QUE ESTA MUESTREADA LA SEQAL 
C        ni ES LA POSICION INICIAL A PARTIR DE LA CUAL QUIERO FILTRAR
c        n ES EL NUMERO DE PUNTOS A FILTRAR
C        SE DEBE CUMPLIR (n<2000-l) SI NO SE SALDRA DE LOS LIMITES DEL VECTOR
         l=nint(1.*if/ifc)
         y(1)=x(ni+1)+(l**2-1)*rm
         y(2)=(2*y(1)+x(ni+2)-(l**2+1)*rm)
         do i=3,l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-rm)
         end do
         do i=l+1,2*l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-2*x(ni+i-l)+rm)
         end do
         do i=2*l+1,n+l
             y(i)=(2*y(i-1)-y(i-2)+x(ni+i)-2*x(ni+i-l)+x(ni+i-2*l))
         end do
 
C        QUITO EL RETARDO DE LA SEQAL
         iretard=l
         if (n.le.(2000-l+1)) then
                              do i=1,n
                                y(i)=y(i+l)
                              end do
                             else
                              do i=1,2000-l+1
                                y(i)=y(i+l)
                              end do
                              do i=2000-l+1,n
                                y(i)=0
                              end do
         end if 

C        PARTE PASO TODO MENOS PASO BAJO
         do i=1,n
         y(i)=l**2*x(ni+i)-y(i)
         end do

C        PONGO EL RESTO A CERO
         do i=n+1,2000
            y(i)=0
         end do
 
         return
         end

C        ---------------------------------------------------------------
C          REALIZA UN TEXT SOBRE LA AMPLITUD POSIT. Y NEGAT. DE LA SEQAL
C        ---------------------------------------------------------------  

         subroutine test(if,x,inv)
         dimension x(100000)
         logical inv

C        inv dICE SI HE INVERTIDO LA SEQAL O NO

         senp=0
         senn=0

c        bUSCO EN LOS PRIMEROS SEGUNDOS
         do i=if,if*3
          if (x(i).lt.senn) senn=x(i)
          if (x(i).gt.senp) senp=x(i)
         end do

         inv=.false. 
         if (senp.lt.(-senn)) then
          inv=.true.
         end if
         return
         end
          

C        ---------------------------------------------------------------
C           INVIERTE LA SEQAL 
C        ---------------------------------------------------------------

         subroutine invertir(sen,n)
         dimension sen(100000)
         
         do i=1,n
          sen(i)=-sen(i)
         end do
         return
         end    

C        ---------------------------------------------------------------
C          REALIZA UN FILTRADO DERIVADA DE LA SEQAL
C        ---------------------------------------------------------------  

         subroutine der(n,if,x,y)
         dimension x(100000),y(100000)

c        aPLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UN FILTRO DERIVADA. lA 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if hZ.
c         ESTA DERIVADA SERA SERA TAL HASTA UNOS 30 hZ. DESPUES CAE LO CUAL
C         ES BUENO PARA NO ENFATIZAR FRECUNCIAS ALTAS
C         eL RETARDO DE LA DERIVADA ES DE l MUESTRAS.
C         lAS CONDICIONES INICIALES SUPONGOQUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR 0.
C         lA ECUACION SERIA y(Nt)=25*(x(Nt)+2x(Nt-l/2*t)-x(Nt-(l/2+l)t)
c                                 -x(Nt-(2*l)t)).
C         lA SEQAL DERIVADA LA DEVUELVE EN EL VECTOR y



          k=if/8
          y(3)=if*(x(2)-x(1))
          y(4)=(if/4)*(2*x(3)-2*x(1))
          do i=5,n+2
            y(i)=k*(x(i)+2*x(i-1)-2*x(i-3)-x(i-4))
          end do

C        QUITO EL RETARDO DE LA SEQAL
         do i=1,n
             y(i)=y(i+2)
         end do

C        PONGO EL RESTO A CERO
         do i=n+1,100000
         y(i)=0
         end do

         return
         end


C        ---------------------------------------------------------------
C          REALIZA LA FUNCION CUADRADA DE LA SEQAL
C        ---------------------------------------------------------------  

         subroutine quad(n,x,y)
         dimension x(100000),y(100000)

C        aPLICA A LA SEQAL QUE ENTRA EN EL VECTOR x EL OPERADOR ELEVER AL 
C        CUADRADO Y LA SACA EN EL VESTOR y


         do i=1,n
             y(i)=x(i)**2
         end do

c        do i=n+1,100000
c            y(i)=0
c        end do

         return
         end


C        ---------------------------------------------------------------
C          REALIZA LA INTEGRACION DE VENTANA MOVIL
C        ---------------------------------------------------------------  

         subroutine mwint(n,if,x,y)
         dimension x(100000),y(100000)

c        aPLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UNA INTEGRACION DE VENTANA MOVI
C        MOVIL DE UNA ANCHURA DE 70 MUESTRAS QUE CORRESPONDE A 70 MS., MAS O 
C        MENOS LA ANCHURA DE UN qrs. 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if
C         lAS CONDICIONES INICIALES SUPONGOQUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR x(1).
C         lA SEQAL INTEGRADA LA DEVUELVE EN EL VECTOR y


         l=nint(9.5*if/100.)
         do i=1,n
             if (i.lt.l)  then
C                La seguent instruccio tambe hi havia un sum=0  ???
C                 sum= (x(1)*(l-i))/l
                  sum=0        
                 do j=1,i
                       sum=sum+x(j)/l
                 end do 
             end if 
             if (i.ge.l)  then
                 sum=0
                 do j=i-l,i
                       sum=sum+x(j)/l
                 end do 
             end if 
             y(i)=sum         
         end do

c         do i=n+1,100000
c             y(i)=0
c         end do

         return
         end

C        ---------------------------------------------------------------
C          REALIZA LA INTEGRACION DE VENTANA MOVIL
C        ---------------------------------------------------------------  

         subroutine mwint_p(n,if,x,y,z,iqrs)
         dimension x(100000),y(100000),z(100000)

c        aPLICA A LA SEQAL QUE ENTRA EN EL VECTOR x UNA INTEGRACION DE VENTANA MOVI
C        MOVIL DE UNA ANCHURA DE 70 MUESTRAS QUE CORRESPONDE A 70 MS., MAS O 
C        MENOS LA ANCHURA DE UN qrs. 
C        SEQAL QUE ENTRA LA SUPONGO MUESTREADA A if
C         lAS CONDICIONES INICIALES SUPONGOQUE LA SEQAL ES CONSTANTE ANTES DEL
C        INSTANTE INICIAL CON VALOR x(1).
C         lA SEQAL INTEGRADA LA DEVUELVE EN EL VECTOR y


         l=nint(30.5*if/100.)
         l2=nint(30.5*if/100./2)
         do i=1,n
             if (i.lt.l2)  then
C                La seguent instruccio tambe hi havia un sum=0  ???
C                 sum= (x(1)*(l-i))/l
                  sum=0        
                 do j=1,i+l2
                       sum=sum+x(j)*z(iqrs-i+j) /l
                 end do 
             end if 
             if ((i.ge.l2).and.(i.lt.(n-l2)))  then
                 sum=0
                 do j=i-l2,i+l2
                       sum=sum+x(j)*z(iqrs-i+j)/l
                 end do 
             end if 
             if (i.ge.(n-l2))  then
                 sum=0
                 do j=i-l2,n
                       sum=sum+x(j)*z(iqrs-i+j)/l
                 end do 
             end if 
             y(i)=sum         
         end do

c         do i=n+1,100000
c             y(i)=0
c         end do

         return
         end


C        ---------------------------------------------------------------
C          REALIZA UNA NORMALIZACION DE MODULO DE LA SEQAL
C        ---------------------------------------------------------------  

         subroutine normaliz(if,max,y)
         dimension y(100000)
    
C        NORMALIZO AL MAXIMO VALOR max
         rmax=y(1)
         do i=2,2*if
          if  (ABS(y(i)).gt.rmax) then 
           rmax=ABS(y(i))
          end if
         end do
         if (rmax.eq.0) rmax=1

C        NORMALIZO
         do i=1,100000
          y(i)=max*y(i)/rmax
         end do
         return
         end
C        ---------------------------------------------------------------
C          REALIZA LA NORMALIZACION INICIAL
C        ---------------------------------------------------------------  

         subroutine normaliz_i(if,max,rmax,y)
         dimension y(100000)


C        rmax es el factor de normalitzacio (parametre de sortida)   
C        NORMALIZO AL MAXIMO VALOR max
         rmax=y(1)
         do i=2,2*if
          if  (ABS(y(i)).gt.rmax) then 
           rmax=ABS(y(i))
          end if
         end do
         if (rmax.eq.0) rmax=1
 
C        NORMALIZO
         do i=1,100000
          y(i)=max*y(i)/rmax
         end do
         return
         end                                                      

C        ---------------------------------------------------------------
C          REALIZA LA NORMALIZACION "ciclica" con el factor RMAX
C        ---------------------------------------------------------------  

         subroutine normaliz_c(if,max,rmax,y)
         dimension y(100000)
    

C        NORMALIZO
         do i=1,100000
          y(i)=max*y(i)/rmax
         end do
         return
         end


C        ---------------------------------------------------------------
C          REALIZA UN CAMBIO EN LA FRECUENCIA DE MUESTREO DE LA SEQAL
C        ---------------------------------------------------------------  
         
         subroutine nuevafrecuencia(if,sen,senam)
         dimension sen(100000),senam(100000)

C        IFN ES LA NUEVA FRECUENCIA A LA QUE SALE LA SEQAL MUESTREADA
C        IFV ES LA FRECUENCIA A LA QUE ESTA MUESTREADA INICIALMENTE

         ifv=if
 5       write(6,10) ifv
 10      format(1x,/,'$ nueva frecuencia_muestreo ? (<',i5,') if= ')
         read(5,*,err=5) ifn
         icon=ifv/ifn
         if=ifv/icon
         j=1
         do i=1,100000,icon
           sen(j)=sen(i)                  
           senam(j)=senam(i)
           j=j+1
         end do
         do i=j,100000
          sen(i)=0
          senam(j)=0
         end do
         return
         end