Skip to content

pol2rect

Converts an input array in magnitude-phase format to real-imaginary format.

Syntax

kout[] pol2rect kin[]
kout[] pol2rect kmags[], kphs[]

Performance

kout[] -- output array containing the complex-valued real-imaginary output. It will be created if it does not exist.

kin[] -- input array containing the complex-valued magnitude-phase input.

kmags[] -- input array containing the real-valued magnitude input. This is expected to contain only the non-negative spectrum (0 to Nyquist, inclusive).

kphs[] -- input array containing the real-valued phase input. This is expected to contain only the non-negative spectrum (0 to Nyquist, inclusive).

NB: the second version of the opcode with two inputs is designed to produce a "packed" real FFT spectrum where the two positions in the array contain the real parts of zero Hz and Nyquist frequency. Therefore the output array length will be 2*L - 2, where L is the length of the input arrays (which should match).

Examples

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

Example of the pol2rect opcode.
<CsoundSynthesizer>
<CsOptions>
-d -o dac
</CsOptions>
<CsInstruments>
/* ksmps needs to be an integer div of
   hopsize */
ksmps = 64

instr 1

 ihopsize = 256   ; hopsize
 ifftsize = 1024  ; 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
 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

   kSpec rect2pol kSpec 

   /* reduce mags between high and low freqs */
   ilow = 0
   ihigh = 1000
   ki = int(ilow/ibw)
   until ki >= int(ihigh/ibw) do
     kSpec[ki] = kSpec[ki]*0.1
     ki += 2
   od

   kSpec pol2rect kSpec

   /* 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
    out 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