Java 用联合变换法反演原始信号
我正在使用JTransforms realForwardFull和realReverse来测试它们是如何工作的。 我的理解是,在您将音频信号传递给realForwardFull,然后应用RealReverse之后,您应该返回相同的信号。 这就是我正在做的Java 用联合变换法反演原始信号,java,signal-processing,fft,Java,Signal Processing,Fft,我正在使用JTransforms realForwardFull和realReverse来测试它们是如何工作的。 我的理解是,在您将音频信号传递给realForwardFull,然后应用RealReverse之后,您应该返回相同的信号。 这就是我正在做的 double[] a1 = getAudioSignal(); DoubleDDT_1D fft = new DoubleFFT_1D(a1.length); double[] fftData = new double[a1.length *
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);
double[]a1=getAudioSignal();
DoubleDDT_1D fft=新的DoubleFFT_1D(a1.长度);
double[]fftData=新的双精度[a1.长度*2];
对于(int i=0;i根据的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();
}
for(int k=0;kYou的代码中似乎有一些错误,这将阻止它编译。您是指DoubleFFT\u 1D fft
而不是DoubleDDT\u 1D fft
?循环也应该使用a1.length
。
for(int k=0; k<a1.length; k++) {
if(Math.abs(a1[k] - fftData[2*k]) < 1e-6) {
printSame();
} else {
printDiff();
}