【问题标题】:How to convert signal from Time domain to Frequency domain with Java如何使用 Java 将信号从时域转换为频域
【发布时间】:2017-10-02 08:26:31
【问题描述】:

我有一个信号 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 转换为频域信号的后续步骤。

【问题讨论】:

    标签: java signal-processing fft


    【解决方案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]);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2012-08-15
      • 1970-01-01
      • 2014-08-29
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多