Computation of the Real Cepstrum and Minimum-Phase Reconstruction
Return to Main Software Page
C
C-------------------------------------------------------------------
C MAIN PROGRAM: MAIN LINE PROGRAM TO COMPUTE THE REAL CEPSTRUM
C AND THE MINIMUM-PHASE RECONSTRUCTION OF AN
C ARBITRARY-PHASE, REAL SEQUENCE X(N)
C AUTHORS: THOMAS F. QUATIERI
C M.I.T., CAMBRIDGE MASS. 02139
C JOSE M. TRIBOLET
C INSTITUTO SUPERIOR TECNICO, LISBON, PORTUGAL
C-------------------------------------------------------------------
C
DIMENSION X(512), CX(1026)
REAL ICX(1026)
C
C DIMENSION REQUIREMENTS:
C
C (SEE SUBROUTINES RCEPS AND ICEPS)
C
C
C DESCRIPTION OF ARRAYS:
C
C X = ARRAY CONTAINING THE SEQUENCE X(N)
C CX = ARRAY CONTAINING THE ZERO-PHASE(REAL)
C OR MINIMUM-PHASE CEPSTRUM OF X(N)
C ICX = ARRAY CONTAINING THE INVERSE CEPSTRUM
C (MINIMUM-PHASE RECONSTRUCTION OF X(N))
C
C
C DESCRIPTION OF VARIABLES:
C
C NX = LENGTH OF THE SEQUENCE X(N)
C NFFTF = LENGTH OF THE FFTS IN FORWARD CEPSTRUM
C NFFTI = LENGTH OF THE FFTS IN INVERSE CEPSTRUM
C (INVERSE LENGTH NEED NOT EQUAL FORWARD LENGTH)
C
C
C SUBROUTINES CALLED:
C
C RCEPS = SUBROUTINE TO COMPUTE THE REAL CEPSTRUM OF A
C REAL SEQUENCE
C
C ICCEPS = SUBROUTINE TO COMPUTE THE INVERSE COMPLEX CEPSTRUM
C (NOTE THAT "COMPLEX" REFERS TO AN ARBITRARY,BUT
C REAL-VALUED SEQUENCE)
C
C
C SET FFT LENGTHS AND DEFINE OUTPUT DEVICE IODEV
C
NFFTF = 1024
NFFTI = 1024
IODEV = I1MACH(2)
C
C GENERATE THE TEST SIGNAL WITH Z-TRANSFORM:
C
C X(Z)=1.0+(1.0/.99)*Z**(-1) ---ONE ZERO AT 1.01010101
C
NX = 2
X(1) = 1.0
X(2) = 1.01010101
C
C PAD X(N) WITH ZEROS:STORE IN CX
C
DO 10 I=1,NX
CX(I) = X(I)
10 CONTINUE
INITL = NX + 1
IEND = NFFTF + 2
DO 20 I=INITL,IEND
CX(I) = 0.0
20 CONTINUE
C
C COMPUTE THE REAL CEPSTRUM
C
CALL RCEPS(NFFTF, CX)
C
C WRITE LAST AND FIRST 32 VALUES OF THE REAL CEPSTRUM
C
WRITE (IODEV,9999)
9999 FORMAT (1X, 10X, 35H*** RCPCIP- TEST PROGRAM OUTPUT ***//)
INITL = NFFTF - 31
WRITE (IODEV,9998)
9998 FORMAT (1X, 15H REAL CEPSTRUM //)
WRITE (IODEV,9997) (I,CX(I),I=INITL,NFFTF)
WRITE (IODEV,9997) (I,CX(I),I=1,32)
9997 FORMAT (1X/4(5H CX(, I4, 2H)=, F7.3))
C
C FIND THE MINIMUM-PHASE COUNTERPART OF THE ZERO-PHASE(REAL)
C CEPSTRUM AND PAD WITH ZEROS:STORE IN ICX (NOTE THAT THE FORWARD
C FFT LENGTH EQUALS THE INVERSE FFT LENGTH IN THIS EXAMPLE.
C IN GENERAL,THE FOLLOWING PROCEDURE SHOULD BE TAILORED TO THE
C PARTICULAR FFT LENGTHS).
C
ICX(1) = CX(1)
IEND = NFFTF/2 + 1
DO 30 I=2,IEND
ICX(I) = 2.0*CX(I)
30 CONTINUE
INITL = IEND + 1
IEND = NFFTI + 2
DO 40 I=INITL,IEND
ICX(I) = 0.0
40 CONTINUE
C
C COMPUTE THE INVERSE CEPSTRUM
C
CALL ICCEPS(NFFTI, ICX)
C
C WRITE LAST AND FIRST 32 VALUES OF THE MINIMUM-PHASE RECONSTRUCTION
C
INITL = NFFTI - 31
WRITE (IODEV,9996)
9996 FORMAT (///29H MINIMUM-PHASE RECONSTRUCTION//)
WRITE (IODEV,9995) (I,ICX(I),I=INITL,NFFTI)
WRITE (IODEV,9995) (I,ICX(I),I=1,32)
9995 FORMAT (1X/4(5H ICX(, I4, 2H)=, F7.3))
STOP
END
C
C-----------------------------------------------------------------------
C SUBROUTINE: RCEPS
C COMPUTE THE REAL CEPSTRUM OF A REAL SEQUENCE X(N)
C-----------------------------------------------------------------------
C
SUBROUTINE RCEPS(NFFT, CX)
C
C DESCRIPTION OF ARGUMENTS:
C
C NFFT = LENGTH OF THE FFT
C CX = ARRAY CONTAINING THE REAL CEPSTRUM
C (ALSO USED AS AN AUXILIARY ARRAY)
C
DIMENSION CX(1)
C
C DIMENSION REQUIREMENTS:
C
C DIM(CX) .GE. NFFT+2
C
C
C SUBROUTINES CALLED:
C
C FFA,FFS-SUBROUTINES TO COMPUTE THE FFT AND IFFT (RADIX 2)
C
C FUNCTIONS CALLED:
C
C AMODSQ = FUNCTION TO COMPUTE THE MODULUS SQUARED
C OF A COMPLEX NUMBER
C
C
C
C
C TRANSFORM X(N):FFT
C
CALL FFA(CX, NFFT)
C
C COMPUTE THE LOGMAGNITUDE OF THE SPECTRUM:STORE IN THE
C ODD-INDEXED VALUES OF CX;CLEAR THE EVEN-INDEXED VALUES OF CX
C
IEND = NFFT/2 + 1
IO = -1
DO 10 I=1,IEND
IO = IO + 2
IE = IO + 1
AMAGSQ = AMODSQ(CX(IO),CX(IE))
CX(IO) = .5*ALOG(AMAGSQ)
CX(IE) = 0.0
10 CONTINUE
C
C COMPUTE THE REAL CEPSTRUM:IFFT
C
CALL FFS(CX, NFFT)
RETURN
END
C
C-----------------------------------------------------------------------
C SUBROUTINE: ICCEPS
C COMPUTE THE INVERSE COMPLEX CEPSTRUM (NOTE THAT "COMPLEX" REFERS
C TO AN ARBITRARY, BUT REAL-VALUED CEPSTRAL SEQUENCE)
C-----------------------------------------------------------------------
C
SUBROUTINE ICCEPS(NFFT, ICX)
C
C DESCRIPTION OF ARGUMENTS:
C
C NFFT = LENGTH OF THE FFT
C ICX = ARRAY CONTAINING THE INVERSE CEPSTRUM
C (ALSO USED AS AN AUXILIARY ARRAY)
C
REAL ICX(1)
C
C DIMENSION REQUIREMENTS:
C
C DIM(ICX) .GE. NFFT+2
C
C
C SUBROUTINES CALLED:
C
C FFA,FFS-SUBROUTINES TO COMPUTE THE FFT AND IFFT (RADIX 2)
C
C
C
C TRANSFORM CX(N):FFT
C
CALL FFA(ICX, NFFT)
C
C EXPONENTIATE:STORE THE REAL AND IMAGINARY VALUES IN THE
C ODD-INDEXED AND EVEN-INDEXED LOCATIONS OF ICX, RESPECTIVELY
C
IEND = NFFT/2 + 1
IO = -1
DO 10 I=1,IEND
IO = IO + 2
IE = IO + 1
RMAG = EXP(ICX(IO))
ICX(IO) = RMAG*COS(ICX(IE))
ICX(IE) = RMAG*SIN(ICX(IE))
10 CONTINUE
C
C INVERSE TRANSFORM:IFFT
C
CALL FFS(ICX, NFFT)
RETURN
END
C
C-----------------------------------------------------------------------
C FUNCTION: AMODSQ
C COMPUTE THE SQUARE OF THE MODULUS OF A COMPLEX NUMBER
C-----------------------------------------------------------------------
C
FUNCTION AMODSQ(ZR, ZI)
C
C DESCRIPTION OF ARGUMENTS:
C
C ZR = REAL PART OF THE COMPLEX NUMBER
C ZI = IMAGINARY PART OF THE COMPLEX NUMBER
C
AMODSQ = SNGL(DBLE(ZR)*DBLE(ZR)+DBLE(ZI)*DBLE(ZI))
RETURN
END
Return to Main Software Page