我正在玩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之后数组中的输出非常不同。 如何获取原始信号?
答案 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();
}