2017-10-02 8 views
1

J'ai un signal y. Le signal obtient des valeurs de 0 à 1. Le signal est en fait dérivé du canal rouge (de RGB) de la caméra d'un smartphone, normalisé en mappant toutes les valeurs de l'espace [0,1, ... 255] à l'espace [0 - 1] en divisant par 255. J'ai un autre tableau x pour stocker les images de caméra 0,1,2,3, ... Ce que je veux faire est de convertir le signal y du domaine temporel en utilisant le domaine fréquentiel en utilisant Java. J'ai essayé d'utiliser la classe fournie here.Comment faire pour convertir le signal du domaine temporel au domaine de fréquence avec Java

Mon code est

fftsize = powtwo(y.size()); //keep samples of a size of power of 2 
Float[] rp = new Float[fftsize]; //rp is real part of signal (= y) 
for(int i=0; i<fftsize; i++){ 
    rp[i]=y.get(i); 
} 

Float[] ip = new Float[fftsize]; //ip is the imaginary part of signal = 0 
for(int i=0; i<fftsize;i++){ 
    ip[i]=0.0f; 
} 
fft(rp,ip); 

public int powtwo(int size){ //this function estimates the next power of 2 (below the given int value). 
while(!(Math.sqrt((double)size)-(int)Math.sqrt((double)size) == 0)){ 
    size--; 
} 
return size; 
} 

Je ne sais pas si je fais bien et je ne sais pas les prochaines étapes pour transformer FFT à la fréquence signal de domaine .

Répondre

1

Vous semblez avoir commencé OK, en dehors du fait que powtwo est horriblement inefficace. (Voir this question pour diverses alternatives qui sont beaucoup plus efficaces.)

La FFT que vous utilisez est "in-situ", de sorte que les parties réelles/imaginaires du domaine fréquentiel sont renvoyées dans les matrices d'entrée. Ce que vous faites avec ces données dépend de vos besoins spécifiques, par ex. Si vous voulez générer un spectre de puissance (l'une des utilisations les plus courantes d'une FFT), vous devriez faire quelque chose comme ceci:

// ... 

fft(rp,ip); 

Float[] spectrum = new Float[fftsize/2]; 

for (int i = 0; i < fftsize/2; i++) 
{ 
    spectrum[i] = Math.sqrt(rp[i] * rp[i] + ip[i] * ip[i]); 
}