我正在使用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之后数组中的输出非常不同。如何恢复原始信号?
2条答案
按热度按时间r1wp621o1#
根据
realForwardFull
的javadoc,您需要调用complexInverse
来恢复原始信号。由于您需要原始点,因此应启用缩放,将值除以N
:你的检查逻辑也被打破了。由于舍入错误,您不能像那样检查双重相等。您应该使用epsilon容错来检查它:
3phpmpom2#