mags

mags — Retourne les modules d'un tableau de nombres complexes.

Description

Cet opcode retourne les modules d'un tableau de nombres complexes (en format rfft) dans un tableau de réels dont la taille est la moitié de celle du tableau d'entrée plus un. Le module pour la fréquence de Nyquist se trouve dans la dernière position du tableau.

Syntaxe

kout[] mags kin[]

Exécution

kout[] -- tableau contenant les modules (taille = taille d'entrée / 2). Créé s'il n'existe pas.

kin[] -- tableau contenant les valeurs complexes réelles-imaginaires d'entrée.

Exemples

Voici un exemple de l'opcode mags. Il utilise le fichier mags.csd.

Exemple 529. Exemple de l'opcode mags.

Voir les sections Audio en temps réel et Options de la ligne de commande pour plus d'information sur l'utilisation des options de la ligne de commande.

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

Voir aussi

Opcodes vectoriels, Opcodes de tableaux.

Crédits

Auteur : Victor Lazzarini
NUI Maynooth
2014

Nouveau dans la version 6.04