La libreria si inserisce normalmente all'interno del progetto di NetBeans od Android
Per l'esempio non sono stati usati dati reali ma quelli calcolati dalla funzione
10sin(x)+5sin(x/2(
Grafici da WolframAlpha |
il codice Java (quello Android e' identico) e'
------------------------------
package javaapplication1;
import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;
/**
*
* @author l.innocenti
*/
public class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int k;
// numero dei dati
int N = 1002;
DoubleFFT_1D dfft = new DoubleFFT_1D(N);
double[] data = new double[N];
double[] outputData = new double[N];
//crea il segnale
for (k=0;k<N-1;k++) {
data[k] = 10*Math.sin(Math.toRadians(k))+5*Math.sin(Math.toRadians(k/2));
//System.out.println(k+";"+data[k]);
}
// si usa Real FFT perche' dati sono reali
dfft.realForward(data);
// il risultato viene messo nella matrice dei risultati secondo il formato
// data[0] = somma di tutti gli input
// se il numero di dati e' pari a partire dall'indice data[2] si ha la parte reale nell'indice pari e
// la parte immaginaria nell'indice dispari
// data[2*k] = Re[k], 0 <= k < n / 2
// data[2*k+1] = Im[k], 0 < k < n / 2
// altrimenti se i dati sono dispari
// data[2*k] = Re[k], 0 <= k < (n+1)/2
// data[2*k+1] = Im[k], 0 < k< (n-1)/2
// per calcolare il valore di frequenza di ogni array
// Fs = valore di campionamento in Hz
// N = numero di punti
// k = indice della matrice
// Frequenza = (k*Fs) / n
//
//La potenza dello spettro e' data da
//sqrt(parte_reale*parte_reale+parte_immaginaria*parte_immaginaria)
if(data.length%2==0){
for(int i = 0; i < data.length/2; i++){
outputData[i]= (float) Math.sqrt((Math.pow(data[2*i],2))+(Math.pow(data[2*(i)+1], 2)));
}
}else{
for(int i = 0; i < data.length/2-1; i++){
outputData[i]= (float) Math.sqrt((Math.pow(data[2*i],2))+(Math.pow(data[2*i+1], 2)));
}
}
}
}
-------------------------------------
Il risultato e' il seguente