如何使用Java

时间:2017-10-02 08:26:31

标签: java signal-processing fft

我有一个信号y。信号从0到1获得值。信号实际上来自智能手机相机的红色通道(来自RGB),通过将所有值从空间[0,1,... 255]映射到空格[0-1]除以255。 我有另一个数组x用于存储相机帧0,1,2,3,... 我想要做的是使用Java将信号y从时域转换到频域。我试图使用提供的here类。

我的代码是

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;
}

我不确定我是否做得对,而且我不知道将FFT转换为频域信号的后续步骤。

1 个答案:

答案 0 :(得分:1)

除了powtwo非常低效的事实之外,你似乎已经开始了。 (参见this question了解更有效的各种替代方案。)

您正在使用的FFT是“就地”,因此在输入数组中返回频域实/虚部分。您对此数据的处理方式取决于您的具体要求,例如:如果你想生成功率谱(FFT的最常见用途之一),你可以这样做:

// ...

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]);
}