FFT per un intervallo di frequenza specifico.


11

Vorrei convertire un segnale in dominio di frequenza. La gamma di frequenza desiderata è 0.1 Hzdi 1 Hze la risoluzione di frequenza è 0.01 Hz.

Con la frequenza di campionamento di 30 Hz, FFT fornisce i componenti di frequenza fino a 15 Hz. Aumentando la frequenza di campionamento si ottiene una migliore risoluzione della frequenza. Tuttavia, FFT offre una gamma di frequenza più ampia. Nel mio caso, voglio solo 0.1 Hzper 1 Hz, FFT dà fino a 15 Hz(calcolo Extra).

La mia domanda è: esiste un modo standard per calcolare un dominio di frequenza di un segnale con un intervallo di frequenza specifico e un'alta risoluzione?


2
Sembra che si desidera Zoom FFT arc.id.au/ZoomFFT.html
endolith

Se esegui semplicemente un DFT standard con frequenza di campionamento 2 Hz e durata 100 s, otterrai una banda di frequenza da 0 a 1 Hz con una risoluzione di 0,01 Hz. Solo il 10% dei tuoi campioni sarà al di fuori della banda a cui sei interessato. Vale davvero la pena di elaborare i dettagli di un algoritmo "non così standard" per migliorare l'efficienza di questo calcolo relativamente piccolo?
Il fotone

Il vincolo è che la durata deve essere il più breve possibile. 100s è troppo lungo. Abbiamo bisogno di circa 10+ s
NcJie

Risposte:


5

Penso che la migliore soluzione al tuo problema sia usare il chirp-DFT. È come una lente d'ingrandimento per un certo intervallo di frequenza. È più efficiente dell'implementazione diretta del DFT (senza FFT), poiché un algoritmo FFT può essere utilizzato con alcuni pre e post-processamenti appropriati. Fondamentalmente devi modulare il tuo segnale con un segnale di chirp, quindi filtrare usando un FFT, e poi ancora modulare di chirp il tuo segnale per ottenere la risposta in frequenza desiderata. Vedi qui e qui per i dettagli su come implementare il chirp-DFT.


2

Esiste anche la possibilità di utilizzare il warping di frequenza (funziona anche come una lente d'ingrandimento in quanto ottieni una risoluzione migliorata nel tuo intervallo di frequenza di frequenza per la stessa dimensione FFT a spese di una risoluzione inferiore a frequenze più alte). Tuttavia, non si salva alcun MIPS in quanto la dimensione FFT non viene ridotta e il warping di frequenza è tutt'altro che economico.

Se vuoi solo calcolare determinati bin nell'FFT (e quindi salvare MIPS) ci sono un paio di metodi per farlo. Ad esempio il DFT scorrevole. I riferimenti in questo documento danno una spiegazione molto piacevole http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf . Penso anche che l'algoritmo di Goertzel faccia qualcosa di simile ma non lo so.

Quindi c'è la possibilità di effettuare il downsampling prima dell'FFT. Ciò probabilmente salverà anche alcuni MIPS.

Modifica: solo per chiarire che il commento sull'algoritmo di Goertzel non è utile. Inserendo direttamente i valori nell'espressione che si trova in fondo a questa pagina della wiki http://en.wikipedia.org/wiki/Goertzel_algorithm, l'approccio Goertzel sarà più complesso di un FFT quando la dimensione dell'FFT richiesta è maggiore di 128 (supponendo che la dimensione FFT sia un fattore 2 e un'implementazione di radix-2).

Tuttavia, ci sono altri fattori che dovrebbero essere presi in considerazione a favore del Goertzel. Solo per citare la pagina wiki: "Le implementazioni FFT e le piattaforme di elaborazione hanno un impatto significativo sulle prestazioni relative. Alcune implementazioni FFT [9] eseguono calcoli interni con numeri complessi per generare coefficienti al volo, aumentando significativamente il loro" costo K per unità di lavoro ". Gli algoritmi FFT e DFT possono utilizzare tabelle di valori di coefficienti precalcolati per una migliore efficienza numerica, ma ciò richiede maggiori accessi ai valori di coefficiente bufferizzati nella memoria esterna, il che può portare a una maggiore contesa della cache che contrasta alcuni dei vantaggi numerici ".

"Entrambi gli algoritmi ottengono circa un fattore di efficienza 2 quando si utilizzano dati di input con valori reali anziché con valori complessi. Tuttavia, questi guadagni sono naturali per l'algoritmo Goertzel ma non saranno raggiunti per la FFT senza l'utilizzo di alcune varianti di algoritmo specializzate per la trasformazione reale dati valutati ".


1
Il DFT a scorrimento è effettivamente utile nel contesto dell'analisi dello spettro in tempo reale, in cui la sequenza di input è molto lunga e lo spettro deve essere ricalcolato ad intervalli regolari. L'algoritmo Goertzel è molto efficace se è necessario calcolare solo pochi valori DFT. Non sarebbe utile per risolvere il problema dato perché il numero desiderato di punti di frequenza è troppo grande.
Matt L.,

Grazie @MattL. per aver sottolineato la debolezza dell'algoritmo di Goertzel.
NcJie,

1

La risoluzione della frequenza è dove è la frequenza di campionamento e è la dimensione FFT. Quindi aumentare la frequenza di campionamento aumenta infatti la risoluzione della frequenza (suppongo che per "migliore" intendi più basso). Pertanto, è necessario aumentare la dimensione della FFT , ovvero il numero di campioni che vengono elaborati dalla FFT in un blocco di dati, al fine di ridurre la risoluzione della frequenza. Nel tuo esempio avrai bisogno di almeno 300 campioni per ottenere la risoluzione di frequenza desiderata.

Δf=fsN
fsNN

Se non può essere aumentato a causa della complessità computazionale, il segnale bandlimited può essere spostato in frequenza prima di FFT. Sia il segnale continuo, sua frequenza centrale e sua larghezza di banda. è la versione campionata di , ovvero . Quindi uno spostamento di frequenza può essere ottenuto da dove . La frequenza di campionamento ora può essere ridotta poiché il segnale ora ha una frequenza di taglio di in contrasto con la frequenza di taglioNs(t)fcfbx(n)s(t)x(n)=s(n/fs)

x~(n)=x(n)ej2πk0/N
k0=fc/fsfbfb+fc che aveva prima dello spostamento di frequenza. Secondo il teorema del campionamento la nuova frequenza di campionamento deve essere maggiore o uguale a e quindi può essere sottocampionata di un fattore di aumentando così la risoluzione della frequenza mantenendo costante.f~sfbx~(n)M=fs/fbN

Questo metodo funziona solo se è rigorosamente bandlimited. In caso contrario, il filtro passa-banda per filtrare la banda di frequenza desiderata deve essere applicato in anticipo. Si noti inoltre che il downsampling di un numero frazionario introdurrà anche un'ulteriore complessità computazionale.s(t)M

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.