| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 
 | C/MEMBR ADD NAME=CMPSE2,SSI=0
      subroutine cmpse2(m,n,mode,dgetx,dgety,xa,xr,xi,zr,zi,ierr)
c!
c     calcul de  correlations.
c
c authors:      l r rabiner
c               bell laboratories, murray hill, new jersey 07974
c               r w schafer and d dlugos
c
c ieee trans on audio and elect, vol 18, no 4, pp 439-442, 1970.
c
c input:        m is the section size(must be a power of 2)
c               n is the number of samples to be used is the analysis
c               mode is the data format type
c                   mode = 0   auto correlation
c                   mode = 1   cross correlation
c                   mode = 2   auto covariance
c                   mode = 3   cross covariance
c               fs is the sampling frequency in hz
c               iwin is the window type
c                   iwin = 1   rectangular window
c                   iwin = 2   hamming window
c
c     modifications scilab :
c
c        en sortie xa contient m/2+1 coeff de correlation
c        xr,xi,zr,zi sont des tableaux de travail
c        xa,xr,xi dimensionnes a m=puissance de 2
c        zr,zi dimensionnes a m/2+1
c        zr(1),zr(2) contient en sortie xmean et ymean
c!
      double precision xa(m),xr(m),xi(m),zr(*),zi(*)
      double precision xmean,ymean,xsum,ysum,xmnr,xmni
      double precision xir,xii,yir,yii,yirbis,fn
      external dgetx,dgety
c
c
      lshft=m/2
      mhlf1=lshft+1
      nsect=(dble(n)+dble(lshft)-1.0d+0)/dble(lshft)
      iss=1
      nrd=lshft
      xsum=0.0d+0
      ysum=0.0d+0
      do 70 k=1,nsect
      if(k.eq.nsect) nrd=n-(k-1)*nrd
      call dgetx(xa,nrd,iss)
      do 40 i=1,nrd
      xsum=xsum+xa(i)
 40   continue
      if(mode.eq.2) goto 60
      call dgety(xa,nrd,iss)
      do 50 i=1,nrd
      ysum=ysum+xa(i)
  50  continue
  60  iss=iss+nrd
  70  continue
      xmean=xsum/dble(n)
      ymean=ysum/dble(n)
      if(mode.eq.2) ymean=xmean
      xmnr=xmean
      xmni=ymean
      iss=1
      nrdy=m
      nrdx=lshft
      do 90 i=1,mhlf1
      zr(i)=0.0d+0
      zi(i)=0.0d+0
  90  continue
      do 190 k=1,nsect
      nsect1=nsect-1
      if(k.lt.nsect1) goto 110
      nrdy=n-(k-1)*lshft
      if(k.eq.nsect) nrdx=nrdy
      if(nrdy.eq.m) goto 110
      nrdy1=nrdy+1
      do 100 i=nrdy1,m
      xr(i)=0.0d+0
      xi(i)=0.0d+0
 100  continue
 110  call dgetx(xa,nrdy,iss)
      do 120 i=1,nrdy
      xr(i)=xa(i)
      xi(i)=xa(i)
 120  continue
      if(mode.eq.0..or.mode.eq.2) goto 140
      call dgety(xa,nrdy,iss)
      do 130 i=1,nrdy
      xi(i)=xa(i)
 130  continue
 140  if(mode.lt.2) goto 160
      do 150 i=1,nrdy
      xr(i)=xr(i)-xmnr
      xi(i)=xi(i)-xmni
 150  continue
 160  nrdx1=nrdx+1
      do 170 i=nrdx1,m
      xr(i)=0.0d+0
 170  continue
      call fft842(0,m,xr,xi,ierr)
      if(ierr.gt.0) return
      do 180 i=2,lshft
      j=m+2-i
      xir=0.50d+0*(xr(i)+xr(j))
      xii=0.50d+0*(xi(i)-xi(j))
      yir=0.50d+0*(xr(j)-xr(i))
      yii=0.50d+0*(xi(i)+xi(j))
      yirbis=yir
      yir=yii
      yii=yirbis
      zr(i)=zr(i)+xir*yir+xii*yii
      zi(i)=zi(i)+xir*yii-xii*yir
 180  continue
      zr(1)=zr(1)+xr(1)*xi(1)
      zr(mhlf1)=zr(mhlf1)+xr(mhlf1)*xi(mhlf1)
      iss=iss+lshft
 190  continue
      do 200 i=2,lshft
      j=m+2-i
      xr(i)=zr(i)
      xi(i)=zi(i)
      xr(j)=zr(i)
      xi(j)=-zi(i)
 200  continue
      xr(1)=zr(1)
      xi(1)=zi(1)
      xr(mhlf1)=zr(mhlf1)
      xi(mhlf1)=zi(mhlf1)
      call fft842(1,m,xr,xi,ierr)
      if(ierr.gt.0) return
      fn=dble(n)
      do 210 i=1,mhlf1
      xa(i)=xr(i)/fn
 210  continue
      xr(1)=xmean
      xr(2)=ymean
      return
      end
 |