Sound design e programmazione

maxpiano69 07-03-22 12.39
@ ilviandante
innanzitutto grazie per il benvenuto.
Ho letto le risposte e se non ricordo male, tu hai scritto che con la FFT non si va veloci in temini di computazione realtime (seno e coseno pesano), meglio scegliere la strada della wavetable una volta individuata la matematicanecessaria.

Dicendo "sintesi a modelli fisici" mi cogli impreparato.
Però se ho capito bene: con la FFT riesci ad avvicinarti in modo più preciso al suono che vuoi "clonare", con quello a modelli fisici ti accontenti di una approssimazione, ma per la seconda soluzione, si guadagna in termini computazionali.
Non esattamente ovvero li non si parlava di FFT bensì di algoritmi per generare le singole sinusoidi (da codice = programma scritto in un qualche linguaggio) ed il suggerimento riguardava il fatto di non usare una funzione sin(x), computazionalmente pesante, ma piuttosto una sinusoide tabellata.

Per la sintesi a modelli fisici se cerchi con Google "physical modeling synthesis" trovi già nei primi risultati un bel po' di materiale, da Wikipedia (buon intro) ad articoli su SoundOnSOund o video.
ilviandante 07-03-22 12.41
@ maxpiano69
Non esattamente ovvero li non si parlava di FFT bensì di algoritmi per generare le singole sinusoidi (da codice = programma scritto in un qualche linguaggio) ed il suggerimento riguardava il fatto di non usare una funzione sin(x), computazionalmente pesante, ma piuttosto una sinusoide tabellata.

Per la sintesi a modelli fisici se cerchi con Google "physical modeling synthesis" trovi già nei primi risultati un bel po' di materiale, da Wikipedia (buon intro) ad articoli su SoundOnSOund o video.
grazie per la precisazione
paolo_b3 07-03-22 14.06
@ ilviandante
ciao,
dicesi sincronicità per chi sa cosa intendo e mi sono iscritto per questo motivo emo

Sto studiando la FFT e mi è parso di capire che le incognite sono ampiezza e frequenza quindi, se voglio risalire alla matematica di un certo suono devo:
1) spostarmi dal dominio del tempo al dominio delle frequenze
2) da questo nuovo dominio si determina ampiezza e frequenza utili a scoprire i parametri delle 'n' sinusoidi che copongono il suono di interesse
3) trovata la matematica (le formule o sinusoidi che creano quel suono complesso) si può generare i suoni desiderati a piacimento

emo
Benvenuto anche da parte mia!
ilviandante 07-03-22 17.05
@ paolo_b3
Benvenuto anche da parte mia!
grazie
Benis67 08-03-22 08.40
@ maxpiano69
Non esattamente ovvero li non si parlava di FFT bensì di algoritmi per generare le singole sinusoidi (da codice = programma scritto in un qualche linguaggio) ed il suggerimento riguardava il fatto di non usare una funzione sin(x), computazionalmente pesante, ma piuttosto una sinusoide tabellata.

Per la sintesi a modelli fisici se cerchi con Google "physical modeling synthesis" trovi già nei primi risultati un bel po' di materiale, da Wikipedia (buon intro) ad articoli su SoundOnSOund o video.
Maxpiano69
Quando si utilizza la FFT per la sintesi, si incorporano routine superottimizzate dove non solo non si calcolano i valori di sin(x) che è una operazione inutilmente onerosa (si usano vettori con valori precalcolati) e in più vengono utilizzati algoritmi che sono superottimizzati sia dal punto di vista matematico (sono noti da anni) e sia dal punto di vista informatico (linguaggio macchina nei punti più critici).
UN computer di ultima generazione é in grado di gestire in tempo reale migliaia di FFT e FFT inverse, tanto che esistono dei virtual synth che per molte routine sono passati dalla classica elaborazione nel tempo a quella nelle frequenze (con FFT).
Il più famoso è VPS Avenger https://www.vengeance-sound.com dove in tempo reale si opera tramite FFT su oscillatori
In molti altri casi la FFT viene utilizzata per precalcolare delle tabelle che poi verranno utilizzate nella sintesi. In questa famiglia ci sono molti virtual Wavetables.
In più con la FFT è possibile implementare delle forme semplificate di additiva dove i coefficienti della FFT corrispondono ai volumi delle singole armoniche, tutti scalabili nel tempo con degli env. Arturia Pigment ad esempio ne ha implementata recentemente una variante nel modulo additiva
maxpiano69 08-03-22 08.44
@ Benis67
Maxpiano69
Quando si utilizza la FFT per la sintesi, si incorporano routine superottimizzate dove non solo non si calcolano i valori di sin(x) che è una operazione inutilmente onerosa (si usano vettori con valori precalcolati) e in più vengono utilizzati algoritmi che sono superottimizzati sia dal punto di vista matematico (sono noti da anni) e sia dal punto di vista informatico (linguaggio macchina nei punti più critici).
UN computer di ultima generazione é in grado di gestire in tempo reale migliaia di FFT e FFT inverse, tanto che esistono dei virtual synth che per molte routine sono passati dalla classica elaborazione nel tempo a quella nelle frequenze (con FFT).
Il più famoso è VPS Avenger https://www.vengeance-sound.com dove in tempo reale si opera tramite FFT su oscillatori
In molti altri casi la FFT viene utilizzata per precalcolare delle tabelle che poi verranno utilizzate nella sintesi. In questa famiglia ci sono molti virtual Wavetables.
In più con la FFT è possibile implementare delle forme semplificate di additiva dove i coefficienti della FFT corrispondono ai volumi delle singole armoniche, tutti scalabili nel tempo con degli env. Arturia Pigment ad esempio ne ha implementata recentemente una variante nel modulo additiva
Certamente ma siamo d'accordo che la FFT in se per definizione è uno strumento di analisi (di una forma d'onda) non di sintesi, dato che "trasforma" una forma d'onda esistente (in una serie di coefficienti), ma non la genera?

Inoltre il mio suggerimento riguardava il problema di "Noname" che aveva tempi di calcolo alti, chiaro che con l'HW adatto si fa di meglio anche usando le funzioni native, ma l'uso di sinusoidi tabellate è un'alternativa valida e molto usata (storicamente vedi DX7 e anche dopo), chiaramente non è l'unica.
Benis67 08-03-22 09.05
@ maxpiano69
Certamente ma siamo d'accordo che la FFT in se per definizione è uno strumento di analisi (di una forma d'onda) non di sintesi, dato che "trasforma" una forma d'onda esistente (in una serie di coefficienti), ma non la genera?

Inoltre il mio suggerimento riguardava il problema di "Noname" che aveva tempi di calcolo alti, chiaro che con l'HW adatto si fa di meglio anche usando le funzioni native, ma l'uso di sinusoidi tabellate è un'alternativa valida e molto usata (storicamente vedi DX7 e anche dopo), chiaramente non è l'unica.
Con la FFT parti da una onda e fai l’analisi trovando i coefficienti; con la iFFT generi un’onda partendo dai coefficienti della FFT che sono le ampiezze delle armoniche.
Sono due operazioni matematicamente simili e colloquialmente si parla di FFT in entrambi i casi.
Se vedi l’algoritmo della FFT ti accorgi che le funzioni sin(x) vengono ripetute in un numero elevatissimo: non ha alcun senso non tabellarle, a meno ovviamente di scopi didattici e per FFT dove le performance non hanno alcun interesse
ilviandante 08-03-22 10.01
edit
ilviandante 14-03-22 19.57
mima85 ha scritto:
esegui la trasformata di ogni segmento e poi, mettendo per così dire "in fila" i risultati delle FFT di ogni segmento


ciao, in merito al tuo intervento: quando fai l'la FFT ti ritrovi con un vettore vec(re,im), come determini la frequenza/ampiezza?

Leggevo che per un campionamento a 44100 Hz e segmenti (o finestre) da 2048 campioni si calcola:

frequenza=numerosegmento*44100/2048
dove numerosegmento 0,1,2,3,4,5,6,7 fino a 44100:2048=21 segmenti
mima85 14-03-22 21.39
@ ilviandante
mima85 ha scritto:
esegui la trasformata di ogni segmento e poi, mettendo per così dire "in fila" i risultati delle FFT di ogni segmento


ciao, in merito al tuo intervento: quando fai l'la FFT ti ritrovi con un vettore vec(re,im), come determini la frequenza/ampiezza?

Leggevo che per un campionamento a 44100 Hz e segmenti (o finestre) da 2048 campioni si calcola:

frequenza=numerosegmento*44100/2048
dove numerosegmento 0,1,2,3,4,5,6,7 fino a 44100:2048=21 segmenti
Data una frequenza di campionamento di 44'100 Hz, i 2048 punti del tuo vettore in uscita dalla FFT rappresentano le frequenze da 0 fino a fcampionamento / 2, quindi nel nostro caso fino a 22'050 Hz, come da teorema di Nyquist.

Per calcolare la frequenza rappresentata da ogni punto del vettore, si ha f = n * 22'050 / 2048, dove n è l'indice di ognuno dei 2048 punti del tuo vettore e non il numero di segmento. Il valore di ognuno dei 2048 punti invece è l'intensità di quella banda di frequenza, dove nel nostro caso ogni banda avrà una larghezza di circa 10.7 Hz. Quindi il primo punto rappresenta la banda tra 0 e 10.7 Hz, il secondo la banda tra 10.7 Hz e 21.4 Hz, il terzo la banda tra 21.4 Hz e 32.1 Hz e via dicendo, fino ad arrivare ai 22.05 KHz della 2048esima banda.

Se tu prendi quei 2048 punti e ne fai un grafico in Excel, otterrai il grafico dello spettro di frequenze di quello spezzone di campione.
ilviandante 15-03-22 16.00
@ mima85
Data una frequenza di campionamento di 44'100 Hz, i 2048 punti del tuo vettore in uscita dalla FFT rappresentano le frequenze da 0 fino a fcampionamento / 2, quindi nel nostro caso fino a 22'050 Hz, come da teorema di Nyquist.

Per calcolare la frequenza rappresentata da ogni punto del vettore, si ha f = n * 22'050 / 2048, dove n è l'indice di ognuno dei 2048 punti del tuo vettore e non il numero di segmento. Il valore di ognuno dei 2048 punti invece è l'intensità di quella banda di frequenza, dove nel nostro caso ogni banda avrà una larghezza di circa 10.7 Hz. Quindi il primo punto rappresenta la banda tra 0 e 10.7 Hz, il secondo la banda tra 10.7 Hz e 21.4 Hz, il terzo la banda tra 21.4 Hz e 32.1 Hz e via dicendo, fino ad arrivare ai 22.05 KHz della 2048esima banda.

Se tu prendi quei 2048 punti e ne fai un grafico in Excel, otterrai il grafico dello spettro di frequenze di quello spezzone di campione.
grazie per la correzione.
mima85 15-03-22 16.03
@ ilviandante
grazie per la correzione.
Di niente.
ilviandante 19-03-22 10.28
@ mima85
Di niente.
ti è mai capitato di analizzare un buffer non campionato a 44100 Hz ma a 2048 Hz?
paolo_b3 19-03-22 11.18
@ ilviandante
ti è mai capitato di analizzare un buffer non campionato a 44100 Hz ma a 2048 Hz?
Se venite al raduno forumers facciamo l'antipasto a buffèr emo
mima85 19-03-22 12.58
@ ilviandante
ti è mai capitato di analizzare un buffer non campionato a 44100 Hz ma a 2048 Hz?
No, ma a livello di procedimento non cambia nulla. Semplicemente a quella frequenza di campionamento avrai una banda - e di conseguenza una risoluzione - estremamente limitata, che sempre per teorema di Nyquist (fmax = fcampionamento / 2) non andrà oltre i 1024 Hz.
mima85 19-03-22 12.59
@ paolo_b3
Se venite al raduno forumers facciamo l'antipasto a buffèr emo
Ma ci sarà un assaggio di campioni di cucina romagnola?
ilviandante 19-03-22 14.35
@ paolo_b3
Se venite al raduno forumers facciamo l'antipasto a buffèr emo
magari in un momento più sereno emo
ilviandante 24-03-22 08.37
qui 2048 campioni, se qualcuno ha un programma di analisi FFT e può dirmi che frequenze/ampiezze contiente

Grazie 1000 emo
maxpiano69 24-03-22 09.28
@ ilviandante
qui 2048 campioni, se qualcuno ha un programma di analisi FFT e può dirmi che frequenze/ampiezze contiente

Grazie 1000 emo
Ho visto che ci sono dei tool online per questo, prova ad esempio https://leventozturk.com/engineering/fft/ (puoi caricare il tuo file e specificare la freq. di campionamento che hai usato ecc...), così sei autonomo e puoi fare tutti i test che vuoi senza dover aspettare.
ilviandante 13-04-22 12.30
@ mima85
Devi prendere il tuo campione e farne la trasformata di Fourier. Spezza il tuo campione in segmenti di tot punti (per esempio 2048 punti), esegui la trasformata di ogni segmento e poi, mettendo per così dire "in fila" i risultati delle FFT di ogni segmento, analizza le variazioni dell'intensità di ogni parziale del suono (in parole povere, di quanto e come oscilla nel tempo l'ampiezza dei picchi di ogni parziale).

Per farti capire visivamente cosa intendo, guarda questo video. Nel grafico tridimensionale che viene generato, sull'asse X si ha la frequenza, sull'Y l'intensità e sullo Z sono allineati uno dietro l'altro i segmenti risultanti dalle analisi FFT di ogni spezzone del campione, a rappresentare come il suono cambia nel tempo. Quello che devi ricavare è il movimento di ogni parziale del tuo suono.

Ipotizzando che il tuo suono abbia 10 parziali, dovrai poi costruirti una tabella con 10 colonne (una per ogni parziale) e tante righe tanti quanti sono i segmenti in cui hai diviso il tuo campione. Ammettendo che tuo campione duri 5 secondi, abbia una frequenza di campionamento di 44'100 Hz e la lunghezza di segmento che hai scelto è di 2048 campioni, il numero di segmenti, e di conseguenza il numero di righe che la tua tabella dovrà avere, è: 44'100 Hz * 5 secondi / 2048 campioni =~ 108 (arrotondato per eccesso). Nelle 10 celle di ognuna di queste righe devi inserire l'ampiezza di ogni armonica che hai ricavato analizzando il risultato della FFT di ogni segmento.

Per rigenerare il suono, devi ricostruire questi 108 segmenti di campione eseguendo per ognuno una serie di Fourier composta da 10 termini, uno per ogni armonica, dove l'ampiezza di ogni armonica (cioè il coefficiente con cui moltiplicare il risultato di ogni funzione seno) la ricaverai dalla relativa riga della tabella fatta in precedenza. Quindi per la serie del primo segmento andrai a ricavare le ampiezze dalla prima riga, per il secondo segmento dalla seconda, e via fino al 108esimo segmento. Mano a mano che generi i segmenti li metti in fila, e alla fine avrai il tuo campione ri-sintetizzato.

Va da se che questo è un concetto generale buono per fare un po' di esperimenti, ma non credo sia adeguato per dissezionare e ricostruire un suono in tempo reale, posto che fare questa cosa abbia una qualche utilità al di fuori dello smanettare un po' con audio e matematica. Per procedure più ottimizzate e più intelligenti devo cedere per forza il passo a chi ne sa più di me in matematica (e non ci vuole molto, sono abbastanza una frana in matematica). Come d_phatt per esempio, che è un matematico. D_phatt, se leggi questo thread, se la cosa ti interessa batti un colpo emo
stavo leggendo questa risposta: cosa intendi per parziale?
Forse le singole componenti (sinusoidi) che formano l'onda che stai analizzando?

Grazie