title: Algoritmo di Karplus-Strong
text: # Algoritmo di Karplus-Strong
  
  L'algoritmo di Karplus-Strong è un metodo usato nel campo dell'acustica che manipola una forma d'onda attraverso una linea di delay con dei filtri per simulare suoni di corde plettrate (chitarra) o soggette a percussione (pianoforte). È una tecnica di sintesi sottrattiva basata sulla retroazione (feedback loop) simile a quella di un filtro comb.
  
  ## Come funziona
  
  * viene generata una breve forma d'onda (di lunghezza di L campioni) di eccitazione. Nell'algoritmo originale era un rumore bianco, ma può essere qualsiasi segnale a banda estesa.
  * questa eccitazione è portata in output e simultaneamente in retroazione in una catena di ritardi (delay line) lunga L campioni.
  * l'uscita della catena di ritardi è portata ad un filtro. Il guadagno del filtro deve essere minore di 1 a tutte le frequenze. Di solito si tratta di un filtro passa basso del primo ordine.
  * l'output filtrato è simultaneamente mixato in output e all'indietro in retroazione nella catena dei ritardi.
  
  Di seguito i maggiori dettagli:
  
  La parte fondamentale dell'algoritmo di Karplus-Strong è l'utilizzo di un filtro comb del tipo a retroazione settato in modo da sfruttare la capacità intrinseca dell'algoritmo di essere strutturalmente identico al più semplice modello fisico a guida d'onda.
  
  L'$\alpha$ della formula seguente per un filtro comb a retroazione (feedback):
  
      $\ y[n]=x[n]+\alpha y[n-K]\,$
  
  assume il valore di resistenza $R^{L}$ che quindi diventa:
  
      $\ y[n]=x[n]+R^{L}y[n-L]\,$
  
  con funzione di trasferimento:
  
      $\ H(z)={\frac {Y(z)}{X(z)}}={\frac {1}{1-R^{L}z^{-L}}}\,$
  
  I poli di $H(z)$ si ricavano da $z^{-L}=R^{L}$ e quindi il filtro ha L poli $z=Re^{(j2l\pi )/L}$ per $l=0,...,L-1$ equispaziati attorno al cerchio (nel piano complesso) di raggio R. Il filtro produce uno spettro armonico con picchi in corrispondenza di multipli interi della frequenza fondamentale
  
      $f_{0}={\frac {F_{s}}{L}}\$ Hz
  
  Un'onda, considerata come una perturbazione, si propaga attraverso il mezzo (confinato ad essere di lunghezza L) e rimbalza avanti e indietro in base alle condizioni al contorno che la regolano. Ad ogni passaggio attraverso $R^{L}$ nel ramo della retroazione viene dissipata energia. Se il segno dell'onda è invertito ad ogni riflessione $R^{L}$ ha segno negativo e le formule risultanti sono:
  
      $\ y[n]=x[n]-R^{L}y[n-L]\,$
      $\ H(z)={\frac {Y(z)}{X(z)}}={\frac {1}{1+R^{L}z^{-L}}}\,$
  
  In questo caso i poli saranno $z=Re^{(j(2l+1)\pi )/L}$ per $l=0,...,L-1$. Questo significa che i corrispondenti picchi saranno tutti shiftati di un angolo pari a $\pi /L$. In questo modo le frequenze dei picchi saranno interi multipli dispari della frequenza fondamentale
  
      $f_{0}={\frac {F_{s}}{2L}}\$ Hz
  
  ### Ridefinizione del filtro comb
  
  Julius O. Smith III ed altri hanno osservato che l'algoritmo di Karplus-Strong era analogo dal punto di vista fisico all'approccio a guida d'onda di un segnale. La retroazione rappresentava la perdita totale di un'onda (prodotta ad esempio da una corda) in un periodo. Grazie a questa intuizione è possibile modellare a onde acustiche perché l'algoritmo di Karplus-Strong è strutturalmente identico ai più semplici modelli a guida d'onda.
  
  Alla luce di quanto argomentato la struttura del filtro comb può essere ridefinita per sintetizzare suoni di tipo armonico come quelli prodotti da una chitarra. Le modifiche che andranno fatte dovranno implementare un decadimento dipendente dalla frequenza delle singole armoniche. In altre parole il modulo delle armoniche dovrà decadere man mano che le frequenze aumentano in modo che le armoniche più basse durino di più di quelle più alte. Questo si ottiene inserendo in diretta (non in retroazione) un filtro passa basso $H_{lp}$ creando un filtro comb passa-basso. Intuitivamente ad ogni passaggio le componenti ad alta frequenza sono attenuate in maniera più marcata di quelle a bassa frequenza. Considerando un filtro FIR del primo ordine le formule diventeranno le seguenti:
  
      $\ y[n]={\frac {1}{2}}\cdot [x[n]+x[n-1]]\,$
      $\ H_{lp}(z)={\frac {1}{2}}\cdot [1+z^{-1}]\,$
  
  La risposta in frequenza corrispondente è:
  
      $H_{lp}(f)=cos(\pi f)\cdot e^{-j\pi f}$
  
  Da notare che la fase del filtro passa basso aggiunge un ulteriore ritardo di mezzo campione. Come conseguenza la nuova frequenza fondamentale generata sarà:
  
      $f_{0}={\frac {F_{s}}{L+1/2}}\$
  
  Queste piccole deviazioni in frequenza risultano insignificanti se si considera un valore di resistenza R vicino a 1.
  
  ## Accordatura della corda
  
  Il delay richiesto D per una frequenza fondamentale data $F_1$ è calcolato in base alla formula D = $F_s/F_1$ dove $F_s$ è la frequenza di campionamento. La lunghezza della delay line è un numero multiplo del periodo di campionamento. Per ottenere un ritardo (delay) frazionario si usano dei filtri di interpolazione. Possono essere usati sia filtri di tipo FIR sia di tipo IIR. Con i filtri FIR si ha il vantaggio che i transitori si concludono in un numero finito di passi.
  
  Mantenendo il periodo (= lunghezza della linea di ritardi) costante si ottengono vibrazioni simili a quelle di una corda o una campana. Aumentando il periodo velocemente subito dopo il transitorio si producono suoni di tipo percussivo (tamburi).
  
  