phs
Prev | Orchestra Opcodes and Operators | Next

## phs

phs — Obtains the phases of a complex-number array

## Description

This opcode returns the phases of a complex-number array, as a real-valued array with half the size of its input plus one. The reason for the extra point is to keep the array size equivalent to the output of the mags opcode (which is often used alongside this one).

## Syntax

    kout[] phs kin[]

## Performance

kout[] -- output array containing the phases. It will be created if it does not exist.

kin[] -- input array containing the complex-valued real-imaginary input.

## Examples

Here is an example of the phs opcode. It uses the file phs.csd.

Example 762. Example of the phs opcode.

See the sections Real-time Audio and Command Line Flags for more information on using command line flags.

    <CsoundSynthesizer>
    <CsOptions>
    -d -o dac
    </CsOptions>
    <CsInstruments>
    /* ksmps needs to be an integer div of
       hopsize */
    ksmps = 64
    0dbfs=1
    nchnls=2

    opcode PVA,k[]k[]k,aii
     asig,isize,ihop xin
     iolaps init isize/ihop
     kcnt init 0
     krow init 1
     kIn[] init isize
     kOlph[] init isize/2 + 1
     ifac = (sr/(ihop*2*$M_PI))
     iscal = (2*$M_PI*ihop/isize)
     kfl = 0
     kIn shiftin asig
     if kcnt == ihop then
       kWin[] window kIn,krow*ihop
       kSpec[] rfft kWin
       kMags[] mags kSpec
       kPha[] phs kSpec
       kDelta[] = kPha - kOlph
       kOlph = kPha
       kk = 0
       kDelta unwrap kDelta
       while kk < isize/2 do
        kPha[kk] = (kDelta[kk] + kk*iscal)*ifac
        kk += 1
       od
       krow = (krow+1)%iolaps
       kcnt = 0
       kfl = 1
     endif
     xout kMags,kPha,kfl
     kcnt += ksmps
    endop

    opcode PVS,a,k[]k[]kii
     kMags[],kFr[],kfl,isize,ihop xin
     iolaps init isize/ihop
     ifac = ihop*2*$M_PI/sr;
     iscal = sr/isize
     krow init 0
     kOla[] init isize
     kOut[][] init iolaps,isize
     kPhs[] init isize/2+1
     if kfl == 1 then
      kk = 0
      while kk < isize/2 do
        kFr[kk] = (kFr[kk] - kk*iscal)*ifac
        kk += 1
      od
      kPhs = kFr + kPhs
      kSpec[] pol2rect kMags,kPhs
      kRow[] rifft kSpec
      kWin[] window kRow, krow*ihop
      kOut setrow kWin, krow
      kOla = 0
      kk = 0
      until kk == iolaps do
       kRow getrow kOut, kk
       kOla = kOla + kRow
       kk += 1
      od
      krow = (krow+1)%iolaps
     endif
     xout shiftout(kOla)/iolaps
    endop

    instr 1

     ihopsize = 256  ; hopsize
     ifftsize = 2048 ; FFT size
     kFreqsOut[] init ifftsize/2+1 ; synthesis freqs
     kMagsOut[] init ifftsize/2+1 ; synthesis mags

     a1 diskin2 "fox.wav",1,0,1

     kMags[],kFreqs[],kflg PVA a1,ifftsize,ihopsize

     if kflg == 1 then
     ki = 0
       kMagsOut = 0
      kFreqsOut = 0
      iscal = 1.5
     until ki == ifftsize/2 do
       if ki*iscal < ifftsize/2 then
         kFreqsOut[ki*iscal] = kFreqs[ki]*iscal
         kMagsOut[ki*iscal] = kMags[ki]
       endif
        ki += 1
      od
     endif

     a2 PVS kMagsOut,kFreqsOut,kflg,ifftsize,ihopsize

     a1 delay a1, (ifftsize+ihopsize)/sr
        outs a1, a2
    endin

    </CsInstruments>
    <CsScore>
    i1 0 10
    </CsScore>
    </CsoundSynthesizer>

## See Also

Vectorial opcodes

array opcodes

Array-based spectral opcodes

## Credits

Author: Victor Lazzarini
NUI Maynooth
2014

New in version 6.04

Prev | Up | Next
phasorbnk | Home | pindex