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 692. 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

    instr 1

     ihopsize = 256  ; hopsize
     ifftsize = 2048 ; FFT size
     iolaps = ifftsize/ihopsize ; overlaps
     ibw = sr/ifftsize ; bin bandwidth
     kcnt init 0    ; counting vars
     krow init 0

     kOla[] init ifftsize ; overlap-add buffer
     kIn[] init ifftsize  ; input buffer
     kOlph[] init ifftsize/2+1 ; old phases
     kPhs[] init ifftsize/2+1 ; synthesis phases
     kDeltaOut[] init ifftsize/2+1 ; synthesis freqs
     kMagsOut[] init ifftsize/2+1 ; synthesis mags
     kOut[][] init iolaps, ifftsize ; output buffers

     a1 diskin2 "fox.wav",1,0,1 ; audio input

     /* every hopsize samples */
     if kcnt == ihopsize then
       /* window and take FFT */
       kWin[] window kIn,krow*ihopsize
       kSpec[] rfft kWin

      /* mags & phases */
      kMags[] mags kSpec
      kPha[] phs kSpec

      /* phase diffs */
      kDelta[] = kPha - kOlph
      kOlph = kPha

      /* pitch shift */
      ki = 0
      iscal = 1.25 ; maj 3rd up
      until ki == ifftsize/2 do
       if ki*iscal < ifftsize/2 then
         kDeltaOut[ki*iscal] = kDelta[ki]*iscal
         kMagsOut[ki*iscal] = kMags[ki]
       endif
        ki += 1
      od

      /* accum phases */
       kPhs = kDeltaOut + kPhs
       kSpec pol2rect kMagsOut,kPhs

       /* IFFT + window */
       kRow[] rifft kSpec
       kWin window kRow, krow*ihopsize
       /* place it on out buffer */
       kOut setrow kWin, krow

       /* zero the ola buffer */
       kOla = 0
       /* overlap-add */
       ki = 0
       until ki == iolaps do
         kRow getrow kOut, ki
         kOla = kOla + kRow
         ki += 1
       od

      /* update counters */
      krow = (krow+1)%iolaps
      kcnt = 0
     endif

     /* shift audio in/out of buffers */
     kIn shiftin a1
     a2 shiftout kOla
     a1 delay a1, (ifftsize+ihopsize)/sr
        out a1*0.3+a2/iolaps

     /* increment counter */
     kcnt += ksmps

    endin

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

## See Also

Vectorial opcodes, array opcodes

## Credits

Author: Victor Lazzarini
NUI Maynooth
2014

New in version 6.04

Prev | Up | Next
phasorbnk | Home | pindex