使用JTransform方法realInverse获取原始信号

时间:2015-01-30 20:08:41

标签: java signal-processing fft

我正在玩JTransforms realForwardFull和RealInverse来测试它们是如何工作的。 我的理解是,在你传递一个音频信号到realForwardFull然后应用RealInverse之后,你应该得到相同的信号。 所以这就是我正在做的事情。

double[] a1 = getAudioSignal();

DoubleDDT_1D fft = new DoubleFFT_1D(a1.length);
double[] fftData = new double[a1.length * 2];
for(int i=0; i<fftData.length; i++) {
        fftData[i] = a1[i]; // real part
        fftData[fftData.length+i] = 0; // imaginary parts
}
fft.realForwardFull(fftData);

//Do an inverse to get back the signal
fft.realInverse(fftData, false);

我的问题是反fft(realInverse)之后的fftData是否应该包含与原始音频信号a1相同的数据? 我测试了这个并检查了所有偶数索引(实部)fftData [2k]是否与a1中的索引相同,但事实并非如此。

for(int k=0; k<a1.length; k++) {
 if(a[k] == fftData[2k]) {
    printSame();
  } else {
    printDiff();
}

我看到realInverse之后数组中的输出非常不同。 如何获取原始信号?

1 个答案:

答案 0 :(得分:2)

根据realForwardFull的javadoc,您需要调用complexInverse来恢复原始信号。由于您需要原始点,因此应启用缩放,将值除以N

fft.realForwardFull(fftData);

//Do an inverse to get back the signal
fft.complexInverse(fftData, true);

你的检查逻辑也被打破了。由于舍入错误,您不能像这样检查双重相等。你应该使用epsilon容错来检查它:

for(int k=0; k<a1.length; k++) {
   if(Math.abs(a1[k] - fftData[2*k]) < 1e-6) {
      printSame();
   } else {
      printDiff();
}