2009-03-11 5 views
32

Mi piacerebbe calcolare la densità spettrale di potenza delle serie temporali; eseguire alcuni filtri passa-banda, passa-basso e passa-alto; forse qualche altra roba di base.Libreria di elaborazione del segnale in Java?

C'è una buona libreria Java open source per fare questo?

Ho cacciato un po 'senza successo (ad esempio, utilizzando Googling "power spectral density java" o "signal processing java" e facendo clic sui collegamenti, cercando in Apache Commons, Sourceforge, java.net, ecc.).

Ci sono molte applet, libri, tutorial, prodotti commerciali, ecc. Che non soddisfano le mie esigenze.

Aggiornamento: Ho trovato org.apache.commons.math.transform per trasformate di Fourier. Questo non implementa la densità spettrale di potenza, il passa-banda, ecc., Ma è qualcosa.

+1

Qualcuno sa di eventuali librerie simili per C/C++? – devin

+1

fftw, http://www.fftw.org/ – basszero

+1

Per prima cosa, questa domanda riguarda Java, non C. :) In secondo luogo, FFTW sembra avere FFT. Che dire di bandpass, passa-basso, filtraggio passa-alto, densità spettrale di potenza, ecc.? Chiaramente FFT costituisce la base, ma non è un'interfaccia di alto livello per quelle operazioni. – dfrankow

risposta

3

Sembra piuttosto scarso. Prova Signalgo o jein o Intel Signal Processing Library, anche se penso che l'ultimo sia solo un wrapper JNI.

Ho visto molte di quelle applet di cui stavi parlando. Penso che potresti essere in grado di ottenere i JAR per loro e usare le API di classe all'interno. Potrebbe essere necessario utilizzare eclipse e jad per decompilare e capire cosa fanno, tuttavia, a causa della mancanza di documentazione. Prova la fonte su this page per esempio.

+0

Grazie per gli arbitri. Onestamente, li apprezzo. signalgo è "alfa (cioè non testato affatto !!)" jein non ha codice sorgente che possa trovare. Intel non sarà open source. – dfrankow

8

Ho trovato il libro Java Digital Signal Processing e il suo example source code. Potresti consultare il codice per vedere se soddisfa le tue esigenze.

È inoltre possibile controllare DSP Laboratory.

Come duffymo e basszero menzionati nei commenti, sono state apportate modifiche a Java dalla pubblicazione di DSP Java che potrebbe influire su alcuni esempi di codice. In particolare, il (relativamente) nuovo Concurrency Utilties package potrebbe rivelarsi utile.

+0

Wow, questo libro è vintage 1997. Non sono sicuro di raccomandarlo. Le idee di elaborazione del segnale non sono cambiate, ma Java ha sicuramente. – duffymo

+0

Quali modifiche sono state apportate che pensate abbiano un effetto sull'elaborazione del segnale digitale? –

+0

@duffymo: L'UNICO anticipo in Java da allora è alcuni dei primitivi della concorrenza (dal dsp BEGS per il multithreading). Generalmente dsp è matematico su matrici primitive. Sono w/Bill. – basszero

2

Ho trovato un'altra risorsa, anche se non è una libreria: http://www.dickbaldwin.com/tocdsp.htm. È solo una discussione di base sull'elaborazione del segnale e sulla trasformazione di Fourier, con alcuni esempi Java. Vedere ad esempio le esercitazioni 1478, 1482, 1486. ​​Non si sa quale sia la licenza sul codice.

21

Il mio primo suggerimento è di non eseguire l'implementazione DSP in Java. Il mio secondo suggerimento sarebbe quello di implementare le tue stesse implementazioni DSP in Java.


Perché non usare Java:

ho un sacco di esperienza di scrittura di codice DSP nel corso degli ultimi 10 anni ... e quasi nessuno di codice DSP è in Java ... quindi perdonami quando sono riluttante a leggere di qualcuno che vuole implementare DSP in Java.

Se si sta andando a fare non-banale DSP allora non si dovrebbe usare Java. La ragione per cui DSP è così doloroso da implementare in Java è perché tutte le buone implementazioni di DSP usano trucchi di gestione della memoria di basso livello, puntatori (quantità pazzesche di puntatori), grandi array di dati grezzi, ecc.

perché utilizzare Java:

Se si sta facendo semplice roba DSP rotolare il proprio implementazione Java. Semplici elementi DSP come PSD e filtri sono entrambi relativamente facili da implementare (implementazione semplice ma non veloce) perché ci sono molti esempi di implementazione e una teoria ben documentata online.

Nel mio caso ho implementato una funzione PSD in Java una volta perché stavo diagrammi il PSD in una GUI Java, quindi era più facile prendere il colpo di prestazioni in Java e avere il PSD calcolato nella GUI java e quindi tracciarlo .


Come implementare un PSD:

Il PSD è di solito solo la grandezza della FFT visualizzato in dB. Ci sono molti esempi accademici, commerciali e open source che mostrano come calcolare la grandezza della FFT in dB. Ad esempio l'output Apache has a Java implementation that gives you the FFT e quindi è sufficiente convertire in magnitudine e dB. Qualsiasi cosa dopo la FFT dovrebbe essere adattata a ciò che è necessario/desidera.


Come implementare passa-basso, il filtraggio passa-banda:

Il metodo più semplice implementazione (non il più efficiente computazionalmente) sarebbe a mio avviso essere usando un filtro FIR e fare il tempo del dominio convoluzione.

Convolution è molto facile da implementare, è due cicli nidificati per loop e ci sono letteralmente milioni di codice di esempio sulla rete.

Il filtro FIR sarà la parte difficile se non si conosce nulla sulla progettazione del filtro. Il metodo più semplice sarebbe utilizzare Matlab per generare il filtro FIR e quindi copiare i coefficenti in java. Suggerisco di usare firpmord() e firpm() da Matlab. Scatta con un'attenuazione da -30 a -50 dB nella banda di arresto e un'increspatura di 3 dB nella banda passante.

+6

Non ci sto più lavorando, ma non sarebbe appropriato iniziare da Numerical Recipes per un'applicazione commerciale. Apache Commons Math ha una FFT: http://commons.apache.org/math/userguide/transform.html. – dfrankow

+1

@dfrankow https://github.com/JorenSix/TarsosDSP dovrebbe essere un inizio migliore – kervin

+0

Mi chiedo sulla dichiarazione che "non farlo in Java". Java è un ottimo modo per gestire qualsiasi attività di gestione della memoria, compresi i sorprendenti file mappati in memoria. Sebbene Java non sia in grado di utilizzare i puntatori grezzi, fornisce tutti i costrutti di alto livello e più sicuri per gestire i buffer di memoria. banalmente, un semplice array può essere utilizzato come buffer circolare. Semplicemente accedi ad un elemento dell'array, invece di usare l'aritmetica puntatore disordinato per capire dove viene effettivamente memorizzato. –

9

Ho scritto una raccolta di alcune classi DSP Java, ad es. filtri IIR:

Java DSP collection

+0

Sebbene gli esempi siano minimi, l'API sembra essere molto flessibile. Grazie! – Charlie