Télécharger tfrinv.eso

Retour à la liste

Numérotation des lignes :

tfrinv
  1. C TFRINV SOURCE CB215821 19/07/30 21:18:14 10273
  2. SUBROUTINE TFRINV
  3. C
  4. C=======================================================================
  5. C = CALCUL DE LA TRANSFORMEE DE FOURIER INVERSE D'UN SIGNAL
  6. C =
  7. C = SYNTAXE : FFTR = TFRI EVOL ;
  8. C =
  9. C = EVOL : OBJET DE TYPE EVOLUTIO CONTENANT L'OBJET EVOLUTION
  10. C = =
  11. C = CREATION : 26/04/88 =
  12. C = F. ROULLIER
  13. C=======================================================================
  14. C
  15. IMPLICIT INTEGER(I-N)
  16. IMPLICIT REAL*8(A-H,O-Z)
  17. CHARACTER *72 TI
  18. CHARACTER *4 ITYP1
  19. c RLTOCX : fonction de conversion real*8 -> complex*16
  20. COMPLEX*16 RLTOCX
  21. LOGICAL INV
  22.  
  23. -INC PPARAM
  24. -INC CCOPTIO
  25. -INC SMEVOLL
  26. -INC SMLREEL
  27. -INC CCREEL
  28. C
  29. c SEGMENT COMPL
  30. c COMPLEX*16 XX(NPT),YY(NPT),W(NEXP)
  31. c REAL*8 AR(NPOIN),AI(NPOIN)
  32. c REAL*8 DM(NPTD),DP(NPTD)
  33. c ENDSEGMENT
  34.  
  35. c segment pour appel a fftpack5.1
  36. segment wfft51
  37. real*8 work(lenwrk)
  38. real*8 wsave(lensav)
  39. real*8 XX51(NCOU)
  40. endsegment
  41. C
  42. C==== LECTURES =========================================================
  43. c
  44. C LECTURE DE L'OBJET EVOLUTION COMPLEXE A TRANSFORMER
  45. C
  46. CALL LIROBJ('EVOLUTIO',IEV1,1,IRETOU)
  47. IF(IERR.NE.0) RETURN
  48. CALL ACTOBJ('EVOLUTIO',IEV1,1)
  49. C
  50. MEVOLL=IEV1
  51. IF (ITYEVO.NE.'COMPLEXE') THEN
  52. MOTERR(1:8)='EVOLUTION'
  53. CALL ERREUR (302)
  54. RETURN
  55. ENDIF
  56. KEVOL1=IEVOLL(1)
  57. KEVOL2=IEVOLL(2)
  58. ITYP1=KEVOL1.NUMEVY
  59. ICOU1=KEVOL1.NUMEVX
  60. MLREE3=KEVOL1.IPROGX
  61. MLREE1=KEVOL1.IPROGY
  62. MLREE2=KEVOL2.IPROGY
  63. C
  64. c on recupere le pas en frequence, la dimension et les ordonnees
  65. L1=MLREE3.PROG(/1)
  66. DF=MLREE3.PROG(2)-MLREE3.PROG(1)
  67. C
  68. c on verifie le nombre de points
  69. NPT=(L1-1)*2
  70. NP=NPT
  71. NN=0
  72. DO 1 I=1,1000
  73. NP=NP/2
  74. NN=NN+1
  75. IF (NP.LE.1) GO TO 2
  76. 1 CONTINUE
  77. 2 NP=2**NN
  78. IF (NP.NE.NPT) THEN
  79. MOTERR(1:8)='EVOLUTIO'
  80. CALL ERREUR (1083)
  81. RETURN
  82. ENDIF
  83. c on verifie -que la 1ere frequence soit 0,
  84. IF(MLREE3.PROG(1).NE.0.D0) THEN
  85. c La premiere frequence doit etre egale a 0.
  86. REAERR(1)=0.d0
  87. CALL ERREUR (1084)
  88. RETURN
  89. ENDIF
  90. C -que la partie imag de la 1ere soit 0 ...
  91. IF(ITYP1.EQ.'PREE') THEN
  92. DR=MLREE1.PROG(1)
  93. DI=MLREE2.PROG(1)
  94. DM=SQRT(DR**2+DI**2)
  95. ELSE
  96. DM = MLREE1.PROG(1)
  97. DP = MLREE2.PROG(1) * XPI/180.
  98. DI = DM*SIN(DP)
  99. ENDIF
  100. IF(ABS(DI).GT.(XZPREC*DM)) THEN
  101. c La 1 eme valeur imaginaire doit etre egale a 0.
  102. INTERR(1)=1
  103. REAERR(1)=0.d0
  104. CALL ERREUR (1086)
  105. RETURN
  106. ENDIF
  107. C
  108. c NEXP=NPT/2
  109. c NPOIN=L1
  110. c IF (ITYP1.NE.'PREE') THEN
  111. c NPTD=L1
  112. c ELSE
  113. c NPTD=0
  114. c ENDIF
  115. c SEGINI COMPL
  116. c write(*,*) 'TFR en entree de dim:',L1
  117. c write(*,*) 'nombre de point en sortie',NPT,NEXP
  118. c write(*,*) 'dim des tableaux de travail',DM(/1),AR(/1),W(/1)
  119.  
  120. C creation du tableau de travail pour FFTPACK5.1
  121. NCOU=NPT
  122. lenwrk = 2 * NPT
  123. lensav = NPT + int(log ( real (NPT) ) / log (2.0) ) + 4
  124. segini,wfft51
  125. C
  126. C==== CHARGEMENT DES TABLEAUX DE TRAVAIL ===============================
  127. C
  128. c - cas Reel,Imag :
  129. IF (ITYP1.EQ.'PREE') THEN
  130.  
  131. c on a forcement le terme constant (f=0Hz)
  132. XX51(1) = MLREE1.PROG(1)
  133. c la suite par paire
  134. ITY=1
  135. DO 10 I=2,L1-1
  136. ITY=ITY+1
  137. XX51(2*I-2)=2. * (-1)**(2*I) * MLREE1.PROG(ITY)
  138. XX51(2*I-1)=2. * (-1)**(2*I+1) * MLREE2.PROG(ITY)
  139. 10 CONTINUE
  140. c dernier terme : on suppose que la TF n'a pas ete tronquee
  141. XX51(NPT) = MLREE1.PROG(L1)
  142.  
  143. c - cas Module, Phase :
  144. ELSE
  145.  
  146. RAP=XPI/180.
  147. c on a forcement le terme constant (f=0Hz)
  148. c XX51(1) = MLREE1.PROG(1)
  149. DM = MLREE1.PROG(1)
  150. DP = MLREE2.PROG(1) * RAP
  151. DR = DM*COS(DP)
  152. DI = DM*SIN(DP)
  153. c write(*,*) '1: DM,DP,DR,DI=',DM,DP,DR,DI
  154. XX51(1) = DR
  155. c la suite par paire
  156. ITY=1
  157. DO 11 I=2,L1-1
  158. ITY=ITY+1
  159. c MODULE , PHASE -> REEL, IMAG
  160. DM = MLREE1.PROG(ITY)
  161. DP = MLREE2.PROG(ITY) * RAP
  162. DR = DM*COS(DP)
  163. DI = DM*SIN(DP)
  164. c write(*,*) ITY,I,': DM,DP,DR,DI=',DM,DP,DR,DI
  165. XX51(2*I-2)=2.0 * (-1)**(2*I) * DR
  166. XX51(2*I-1)=2.0 * (-1)**(2*I+1) * DI
  167. 11 CONTINUE
  168. c dernier terme : on suppose que la TF n'a pas ete tronquee
  169. c XX51(NPT) = 0.25d0 * MLREE1.PROG(L1)
  170. DM = MLREE1.PROG(L1)
  171. DP = MLREE2.PROG(L1) * RAP
  172. DR = DM*COS(DP)
  173. DI = DM*SIN(DP)
  174. XX51(NPT) = DR
  175.  
  176. c c si la TF est fournie sous la forme (module,phase), conversion
  177. c DO 8 I=1,L1
  178. c DM(I)=MLREE1.PROG(I)
  179. c DP(I)=MLREE2.PROG(I)
  180. c 8 CONTINUE
  181. c CALL CONVCP(AR,AI,DM,DP,L1,-1)
  182. c ELSE
  183. c c sinon on recupere directement la TF (Re,Im)
  184. c DO 9 I=1,L1
  185. c AR(I)=MLREE1.PROG(I)
  186. c AI(I)=MLREE2.PROG(I)
  187. c 9 CONTINUE
  188.  
  189. ENDIF
  190.  
  191.  
  192. C==== CALCUL DE LA FFT inverse =========================================
  193.  
  194. c +++ via FFTPACK5.1 +++
  195.  
  196. c Initialize the WSAVE array.
  197. call rfft1i (NPT,wsave,lensav,ier)
  198. IF (IERR.ne.0) RETURN
  199. c
  200. c Compute inverse FFT of coefficients. Should get back the
  201. c original data.
  202. inc = 1
  203. lenr = NPT
  204. call rfft1b(NPT,inc,XX51,lenr,wsave,lensav,work,lenwrk,ier)
  205. IF (IERR.ne.0) RETURN
  206.  
  207. 19 IF(IIMPI.EQ.1) WRITE(IOIMP,*)' FFT INVERSE CALCULEE '
  208.  
  209. C
  210. C==== CREATION ET CALCUL DES LISTES DE LA FFT ==========================
  211. C
  212. JG=NPT
  213. SEGINI MLREE1
  214. SEGINI MLREE2
  215. FMAX=DF*REAL(NPT)
  216. DTEMP=1.D0/FMAX
  217. C
  218. DO 20 I=1,NPT
  219. TEMP=REAL(I-1)*DTEMP
  220. MLREE1.PROG(I)=TEMP
  221. MLREE2.PROG(I)=DF*XX51(I)
  222. 20 CONTINUE
  223. SEGSUP wfft51
  224. C
  225. C CREATION DE L'OBJET EVOLUTION REEL FFT INVERSE
  226. C
  227. N=1
  228. SEGINI MEVOLL
  229. IPVO=MEVOLL
  230. IEVTEX=TITREE
  231. ITYEVO='REEL '
  232. C
  233. SEGINI KEVOLL
  234. c KEVTEX=TITREE
  235. KEVTEX='TF^{-1}'
  236. TYPX='LISTREEL'
  237. TYPY='LISTREEL'
  238. IEVOLL(1)=KEVOLL
  239. IPROGX=MLREE1
  240. NOMEVX='TEMPS SEC'
  241. IPROGY=MLREE2
  242. NOMEVY='TF INVERSE '
  243. NUMEVX=ICOU1
  244. NUMEVY='REEL'
  245. C
  246. CALL ACTOBJ('EVOLUTIO',IPVO,1)
  247. CALL ECROBJ('EVOLUTIO',IPVO)
  248. 666 CONTINUE
  249.  
  250. END
  251.  
  252.  
  253.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales