Il primo passo è verificare che sia la frequenza di campionamento iniziale sia la frequenza di campionamento target siano numeri razionali . Poiché sono numeri interi sono automaticamente numeri razionali. Se uno di loro non fosse un numero razionale, sarebbe comunque possibile modificare la frequenza di campionamento, ma è un processo molto diverso e più difficile.
Il prossimo passo è di fattorizzare le due frequenze di campionamento. La frequenza di campionamento iniziale, in questo caso, è 44100, che varia in . La frequenza di campionamento target, 16000, viene calcolata su . Pertanto, per convertire dalla frequenza di campionamento iniziale alla frequenza target dobbiamo decimare di e interpolare di .2 7 ∗ 5 3 3 2 ∗ 7 2 2 5 ∗ 522∗ 32∗ 52∗ 7227∗ 5332∗ 7225∗ 5
I passaggi precedenti devono essere eseguiti indipendentemente da come si desidera ricampionare i dati. Ora parliamo di come farlo con FFT. Il trucco per ricampionare con FFT è quello di scegliere lunghezze FFT che fanno funzionare tutto bene. Ciò significa scegliere una lunghezza FFT che è un multiplo della velocità di decimazione (441, in questo caso). Per l'esempio, scegliamo una lunghezza FFT di 441, sebbene avremmo potuto scegliere 882, o 1323, o qualsiasi altro multiplo positivo di 441.
Capire come funziona aiuta a visualizzarlo. Si inizia con un segnale audio che assomiglia, nel dominio della frequenza, a qualcosa di simile alla figura seguente.
Al termine dell'elaborazione, si desidera ridurre la frequenza di campionamento a 16 kHz, ma si desidera la minima distorsione possibile. In altre parole, vuoi semplicemente mantenere tutto dall'immagine sopra da -8 kHz a +8 kHz e rilasciare tutto il resto. Ciò si traduce nella foto qui sotto.
Si noti che le frequenze di campionamento non sono in scala, sono solo lì per illustrare i concetti.
Il bello di scegliere una lunghezza FFT che è un multiplo del fattore di decimazione è che puoi ricampionare semplicemente facendo cadere porzioni del risultato FFT e quindi invertendo FFT ciò che rimane. Nel caso del nostro esempio hai 441 campioni di dati FFT, che ti danno 441 campioni complessi nel dominio della frequenza. Vogliamo decimare di 441 e interpolare di 160 ( ), quindi manteniamo i 160 campioni che rappresentano le frequenze da -8 kHz a +8 kHz. Quindi invertiamo FFT quei campioni e presto! Hai 160 campioni di dominio del tempo che sono campionati a 16 kHz.25∗ 5
Come potresti sospettare, ci sono un paio di potenziali problemi. Esaminerò ciascuno di essi e spiegherò come superarli.
Cosa fai se i tuoi dati non sono un bel multiplo del fattore di decimazione? Puoi facilmente superarlo riempiendo la fine dei tuoi dati con abbastanza zeri da renderli un multiplo del fattore di decimazione. I dati sono imbottiti PRIMA di essere FFT.
Anche se il metodo che ho spiegato è molto semplice, è anche non ideale in quanto può introdurre squilli e altri cattivi artefatti nel dominio del tempo. Puoi evitarlo filtrando i dati del dominio di frequenza prima di eliminare i dati ad alta frequenza. Puoi farlo FFT con il filtro di lunghezza , riempiendo i tuoi dati (prima di farlo con FFT) con almenol - 1ll - 1zeri (si noti che il numero di campioni di dati e il numero di campioni di riempimento devono ENTRAMBI essere un multiplo positivo del fattore di decimazione; è possibile aumentare la lunghezza del riempimento per soddisfare questo vincolo), FFT''informando i dati imbottiti, moltiplicando il dominio della frequenza dati e filtri, quindi alias dei risultati ad alta frequenza (> 8 kHz) verso il basso nei risultati a bassa frequenza (<8 kHz) prima di far cadere i risultati ad alta frequenza. Sfortunatamente, dal momento che il filtraggio nel dominio della frequenza è un argomento importante a sé stante, non sarò in grado di approfondire in questa risposta. Dirò, tuttavia, che se si filtrano e si elaborano i dati in più di un blocco, sarà necessario implementare Overlap-and-Add o Overlap-and-Save per rendere il filtro continuo.
Spero che questo possa essere d'aiuto.
EDIT: la differenza tra il numero iniziale di campioni di dominio di frequenza e il numero target di campioni di dominio di frequenza deve essere pari in modo da poter rimuovere lo stesso numero di campioni dal lato positivo dei risultati come il lato negativo dei risultati. Nel caso del nostro esempio, il numero iniziale di campioni era il tasso di decimazione, o 441, e il numero target di campioni era il tasso di interpolazione, o 160. La differenza è 279, che non è pari. La soluzione è raddoppiare la lunghezza della FFT a 882, il che fa raddoppiare anche il numero target di campioni a 320. Ora la differenza è uniforme e puoi rilasciare i campioni di dominio di frequenza appropriati senza problemi.