@@ -19,8 +19,8 @@ MODULE SIGNAL
1919
2020 PRIVATE
2121
22- INTEGER ,PARAMETER :: RK= REAL64 ! REAL KIND
23- INTEGER ,PARAMETER :: NUM= 1024 ! SIGNAL LENGTH (POWER OF TWO)
22+ INTEGER ,PARAMETER :: RK= REAL64 ! REAL KIND
23+ INTEGER ,PARAMETER :: NUM= 4096 ! SIGNAL LENGTH (POWER OF TWO)
2424 INTEGER ,PARAMETER :: FLA= 1 ! COMPLEX SIGNAL FLAG (0/1 FOR REAL/COMPLEX INPUT)
2525 REAL (RK),PARAMETER :: PI= 3.141592653589793238460_RK ! PI
2626 REAL (RK),PARAMETER :: TWO_PI= 2.0_RK * PI ! 2*PI
@@ -38,6 +38,7 @@ MODULE SIGNAL
3838 PUBLIC :: TWO_PI
3939 PUBLIC :: WINDOW_
4040 PUBLIC :: FREQUENCY_
41+ PUBLIC :: DECOMPOSITION_
4142
4243 PUBLIC :: BRENT_MAX
4344 PUBLIC :: BRENT_TOL
@@ -247,6 +248,38 @@ PURE REAL(RK) FUNCTION FREQUENCY_(WINDOW_TOTAL,WINDOW,SIGNAL)
247248 FREQUENCY_= (REAL (FST,RK)- 2._RK+2._RK * (FREQUENCY_-1._RK )/ REAL (NUM,RK))/ REAL (NUM,RK)
248249 END FUNCTION FREQUENCY_
249250
251+ PURE SUBROUTINE DECOMPOSITION_ (AVE ,WIN ,SIG ,ITR ,FRE ,COS_AMP ,SIN_AMP )
252+ ! $ACC ROUTINE SEQ
253+ REAL (RK),INTENT (IN ) :: AVE
254+ REAL (RK),DIMENSION (NUM),INTENT (IN ) :: WIN
255+ REAL (RK),DIMENSION (2 * NUM),INTENT (IN ) :: SIG
256+ INTEGER ,INTENT (IN ) :: ITR
257+ REAL (RK),DIMENSION (ITR),INTENT (OUT ) :: FRE
258+ REAL (RK),DIMENSION (ITR),INTENT (OUT ) :: COS_AMP
259+ REAL (RK),DIMENSION (ITR),INTENT (OUT ) :: SIN_AMP
260+ INTEGER :: I
261+ REAL (RK),DIMENSION (2 * NUM) :: ORB
262+ REAL (RK),DIMENSION (NUM) :: RAN
263+ REAL (RK),DIMENSION (2 * NUM) :: DEL
264+ ORB= SIG- AVE
265+ RAN= REAL ([(I,I= 1 ,NUM,1 )],RK)
266+ DO I= 1 ,ITR,1
267+ FRE(I)= FREQUENCY_(AVE,WIN,ORB)
268+ DEL(1 :2 * NUM:2 )=+ COS (TWO_PI* FRE(I)* RAN)
269+ DEL(2 :2 * NUM:2 )=- SIN (TWO_PI* FRE(I)* RAN)
270+ COS_AMP(I)= SUM (SIG(1 :2 * NUM:2 )* DEL(1 :2 * NUM:2 )* WIN)+ SUM (SIG(2 :2 * NUM:2 )* DEL(2 :2 * NUM:2 )* WIN)
271+ SIN_AMP(I)= SUM (SIG(2 :2 * NUM:2 )* DEL(1 :2 * NUM:2 )* WIN)- SUM (SIG(1 :2 * NUM:2 )* DEL(2 :2 * NUM:2 )* WIN)
272+ COS_AMP(I)= COS_AMP(I)/ REAL (NUM,RK)
273+ SIN_AMP(I)= SIN_AMP(I)/ REAL (NUM,RK)
274+ ORB(1 :2 * NUM:2 )= ORB(1 :2 * NUM:2 )- COS_AMP(I)* DEL(1 :2 * NUM:2 )+ SIN_AMP(I)* DEL(2 :2 * NUM:2 )
275+ ORB(2 :2 * NUM:2 )= ORB(2 :2 * NUM:2 )- COS_AMP(I)* DEL(2 :2 * NUM:2 )- SIN_AMP(I)* DEL(1 :2 * NUM:2 )
276+ END DO
277+ IF (FLA== 0 )THEN
278+ COS_AMP = 2.0_RK * COS_AMP
279+ SIN_AMP = 2.0_RK * SIN_AMP
280+ END IF
281+ END SUBROUTINE DECOMPOSITION_
282+
250283 ! POLINT (NRF90)
251284 PURE SUBROUTINE POLINT_ (XA ,YA ,X ,Y ,DY )
252285 REAL (RK),DIMENSION (:),INTENT (IN ) :: XA
@@ -559,3 +592,92 @@ END MODULE SIGNAL
559592! !$ACC END DATA
560593! WRITE(*,*) OUT(1)-FRE
561594! END PROGRAM EXAMPLE
595+
596+ ! ! EXAMPLE (NUM=2**12,FLA=0)
597+ ! ! Real signal decomposition
598+ ! ! gfortran -o example -O3 -ffast-math -march=native signal.f90 example.f90
599+ ! ! example.f90:
600+ ! PROGRAM EXAMPLE
601+ ! USE SIGNAL
602+ ! IMPLICIT NONE
603+ ! REAL(RK),PARAMETER :: F1=1._RK*0.123456789_RK
604+ ! REAL(RK),PARAMETER :: F2=2._RK*0.123456789_RK
605+ ! REAL(RK),PARAMETER :: F3=3._RK*0.123456789_RK
606+ ! REAL(RK),PARAMETER :: F4=4._RK*0.123456789_RK
607+ ! REAL(RK),PARAMETER :: A1=1.0_RK
608+ ! REAL(RK),PARAMETER :: B1=1.E-1_RK
609+ ! REAL(RK),PARAMETER :: A2=1.E-1_RK
610+ ! REAL(RK),PARAMETER :: B2=5.E-2_RK
611+ ! REAL(RK),PARAMETER :: A3=1.E-3_RK
612+ ! REAL(RK),PARAMETER :: B3=0.0_RK
613+ ! REAL(RK),PARAMETER :: A4=0.0_RK
614+ ! REAL(RK),PARAMETER :: B4=1.E-4_RK
615+ ! REAL(RK),DIMENSION(2*NUM) :: SIG
616+ ! REAL(RK),DIMENSION(NUM) :: WIN
617+ ! REAL(RK) :: AVE
618+ ! INTEGER :: I
619+ ! REAL(RK),DIMENSION(4) :: FRE, COS_AMP, SIN_AMP
620+ ! SIG(1:2*NUM:2)=REAL([(I,I=1,NUM,1)],RK)
621+ ! SIG(1:2*NUM:2)=A1*COS(TWO_PI*F1*SIG(1:2*NUM:2))+B1*SIN(TWO_PI*F1*SIG(1:2*NUM:2)) + &
622+ ! A2*COS(TWO_PI*F2*SIG(1:2*NUM:2))+B2*SIN(TWO_PI*F2*SIG(1:2*NUM:2)) + &
623+ ! A3*COS(TWO_PI*F3*SIG(1:2*NUM:2))+B3*SIN(TWO_PI*F3*SIG(1:2*NUM:2)) + &
624+ ! A4*COS(TWO_PI*F4*SIG(1:2*NUM:2))+B4*SIN(TWO_PI*F4*SIG(1:2*NUM:2))
625+ ! SIG(2:2*NUM:2)=0.0_RK
626+ ! CALL WINDOW_(4,WIN)
627+ ! AVE = SUM(WIN)
628+ ! FRE = 0.0_RK
629+ ! COS_AMP=0.0_RK
630+ ! SIN_AMP=0.0_RK
631+ ! CALL DECOMPOSITION_(AVE,WIN,SIG,4,FRE,COS_AMP,SIN_AMP)
632+ ! DO I=1,4,1
633+ ! WRITE(*,*) FRE(I),COS_AMP(I),SIN_AMP(I)
634+ ! END DO
635+ ! END PROGRAM EXAMPLE
636+
637+
638+ ! ! EXAMPLE (NUM=2**12,FLA=1)
639+ ! ! Complex signal decomposition
640+ ! ! gfortran -o example -O3 -ffast-math -march=native signal.f90 example.f90
641+ ! ! example.f90:
642+ ! PROGRAM EXAMPLE
643+ ! USE SIGNAL
644+ ! IMPLICIT NONE
645+ ! REAL(RK),PARAMETER :: F1=1._RK*0.123456789_RK
646+ ! REAL(RK),PARAMETER :: F2=2._RK*0.123456789_RK
647+ ! REAL(RK),PARAMETER :: F3=3._RK*0.123456789_RK
648+ ! REAL(RK),PARAMETER :: F4=4._RK*0.123456789_RK
649+ ! REAL(RK),PARAMETER :: A1=1.0_RK
650+ ! REAL(RK),PARAMETER :: B1=1.E-1_RK
651+ ! REAL(RK),PARAMETER :: A2=1.E-1_RK
652+ ! REAL(RK),PARAMETER :: B2=5.E-2_RK
653+ ! REAL(RK),PARAMETER :: A3=1.E-3_RK
654+ ! REAL(RK),PARAMETER :: B3=0.0_RK
655+ ! REAL(RK),PARAMETER :: A4=0.0_RK
656+ ! REAL(RK),PARAMETER :: B4=1.E-4_RK
657+ ! REAL(RK),DIMENSION(2*NUM) :: SIG
658+ ! REAL(RK),DIMENSION(NUM) :: WIN
659+ ! REAL(RK) :: AVE
660+ ! INTEGER :: I
661+ ! REAL(RK),DIMENSION(4) :: FRE, COS_AMP, SIN_AMP
662+ ! SIG(1:2*NUM:2)=REAL([(I,I=1,NUM,1)],RK)
663+ ! SIG(1:2*NUM:2)=A1*COS(TWO_PI*F1*SIG(1:2*NUM:2))+B1*SIN(TWO_PI*F1*SIG(1:2*NUM:2)) + &
664+ ! A2*COS(TWO_PI*F2*SIG(1:2*NUM:2))+B2*SIN(TWO_PI*F2*SIG(1:2*NUM:2)) + &
665+ ! A3*COS(TWO_PI*F3*SIG(1:2*NUM:2))+B3*SIN(TWO_PI*F3*SIG(1:2*NUM:2)) + &
666+ ! A4*COS(TWO_PI*F4*SIG(1:2*NUM:2))+B4*SIN(TWO_PI*F4*SIG(1:2*NUM:2))
667+ !
668+ ! SIG(2:2*NUM:2)=REAL([(I,I=1,NUM,1)],RK)
669+ ! SIG(2:2*NUM:2)=B1*COS(TWO_PI*F1*SIG(2:2*NUM:2))-A1*SIN(TWO_PI*F1*SIG(2:2*NUM:2)) + &
670+ ! B2*COS(TWO_PI*F2*SIG(2:2*NUM:2))-A2*SIN(TWO_PI*F2*SIG(2:2*NUM:2)) + &
671+ ! B3*COS(TWO_PI*F3*SIG(2:2*NUM:2))-A3*SIN(TWO_PI*F3*SIG(2:2*NUM:2)) + &
672+ ! B4*COS(TWO_PI*F4*SIG(2:2*NUM:2))-A4*SIN(TWO_PI*F4*SIG(2:2*NUM:2))
673+ ! CALL WINDOW_(4,WIN)
674+ ! AVE = SUM(WIN)
675+ ! FRE = 0.0_RK
676+ ! COS_AMP=0.0_RK
677+ ! SIN_AMP=0.0_RK
678+ ! CALL DECOMPOSITION_(AVE,WIN,SIG,4,FRE,COS_AMP,SIN_AMP)
679+ ! DO I=1,4,1
680+ ! WRITE(*,*) FRE(I),COS_AMP(I),SIN_AMP(I)
681+ ! END DO
682+ ! END PROGRAM EXAMPLE
683+
0 commit comments