La mia domanda però era: perchè se ritardo di x campioni, alcune frequenze vengono tagliate?
Nel mio esempio, di quanti campioni devo ritardare per tagliare le frequenze da 3000hz in su?
Il numero dei campioni non ha niente a che vedere con la frequenza di taglio, ma (approssimativamente) con la pendenza del filtro, con la sua precisione, diciamo. Avrai sicuramente sentito dire che un filtro di quarto ordine filtra "meglio" di uno di secondo ordine, questo significa che se usi un filtro di quarto ordine come passa-basso con frequenza di taglio 3000, le frequenze sopra i 3000 Hz (quelle da filtrare, appunto) saranno più attenuate di quanto sarebbero con un filtro di secondo ordine: ma il fatto che un filtro abbia un ritardo massimo di 4 campioni e l'altro di 2, non influisce sulla frequenza di taglio.
Che cosa determina la frequenza di taglio, quindi? I fattori di moltiplicazione (coefficienti) dei campioni ritardati e no, come avevo sommariamente detto in un messaggio precedente.
L'oggetto biquad~ è un filtro del secondo ordine, e quindi ha due campioni di ritardo; ma con biquad~ ci fai tutti i filtri che vuoi (passaalto, possabasso, risonanti e no, etc...) e con tutte le frequenze di taglio che vuoi.
Allora come si calcolano i coefficienti, ad esempio per una frequenza di taglio di 3000 Hz? Tramite calcoli abbastanza complicati, che ad esempio l'oggetto filtergraph~ realizza per noi. Filtergraph~ infatti produce una lista di 5 numeri ciascuno dei quali è un coefficiente di moltiplicazione che si applica al campione in entrata, ai due campioni entrati precedentemente e ai due campioni prodotti precedentemente dal filtro (per un totale, appunto, di 5 campioni). Vedi questa patch esemplificativa:
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 281 467 242 196617 e il risultato è il nuovo campione in uscita;
#P window setfont "Sans Serif" 10.;
#P comment 193 444 449 196618 y[n] = a0 * x[n] + a1 * x[n-1] + a2 * x[n-2] - b1 * y[n-1] - b2 * y[n-2];
#P window setfont "Sans Serif" 9.;
#P window linecount 4;
#P comment 505 315 71 196617 segnale in uscita ritardato di un campione;
#P comment 580 316 71 196617 segnale in uscita ritardato di 2 campioni;
#P comment 433 315 71 196617 segnale in entrata ritardato di 2 campioni;
#P comment 360 316 71 196617 segnale in entrata ritardato di un campione;
#P window linecount 1;
#P comment 82 275 205 196617 3) ...e filtergraph~ produce i coefficienti;
#P user umenu 235 54 70 196647 1 64 70 0;
#X add display;
#X add lowpass;
#X add highpass;
#X add bandpass;
#X add bandstop;
#X add peaknotch;
#X add lowshelf;
#X add highshelf;
#X add resonant;
#X add allpass;
#P flonum 295 296 47 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 366 297 47 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 437 296 47 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 508 296 47 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 580 298 47 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 295 273 296 196617 unpack 0. 0. 0. 0. 0.;
#P user filtergraph~ 295 101 255 124 3 9 0. 22050. 0.0625 16. 1 1 1 0 0 1 1;
#X frgb 193 193 255;
#X brgb 233 233 255;
#X rgb2 0 0 0;
#X rgb3 130 130 130;
#X rgb4 0 0 0;
#X rgb5 118 121 166;
#X rgb6 210 74 54;
#X rgb7 255 22 22;
#X linmarkers 5512.5 11025. 16537.5;
#X logmarkers 10. 100. 1000. 10000.;
#X nfilters 1;
#X setfilter 0 1 0 0 0 2086.222168 1. 3.028512 0.0001 22050. 0.0001 16. 0.5 25.;
#X done;
#P comment 194 33 137 196617 1) seleziona un tipo di filtro;
#P comment 107 159 190 196617 2 modifica frequenza e/o risonanza....;
#P window linecount 3;
#P comment 280 316 76 196617 segnale in entrata (non ritardato);
#P window linecount 1;
#P comment 14 326 263 196617 4) questi coefficienti moltiplicano i seguenti campioni:;
#P window linecount 4;
#P comment 281 384 242 196617 una volta moltiplicati per i rispettivi coefficienti i campioni in entrata vengono sommati tra loro e al risultato vengono sottratti i due campioni in uscita \, ovvero viene applicata l'equazione;
#P connect 6 4 7 0;
#P connect 6 3 8 0;
#P connect 6 2 9 0;
#P connect 6 1 10 0;
#P connect 6 0 11 0;
#P connect 5 0 6 0;
#P connect 12 1 5 0;
#P window clipboard copycount 20;