java 使用JTransform方法realInverse恢复原始信号

pb3skfrl  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(122)

我正在使用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之后数组中的输出非常不同。如何恢复原始信号?

r1wp621o

r1wp621o1#

根据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();
}
3phpmpom

3phpmpom2#

fun transformAndInvert() {
    var input = audioData.toFloatArray()

    val fft = FloatFFT_1D(minBuffer.toLong())
    val fftData = FloatArray(minBuffer * 2) { 0.0f }
    for (i in input.indices) {
        fftData[2*i] = input[i] // real part & img will be 0
    }
    fft.realForward(fftData)

    fft.realInverse(fftData, true)

    val output = FloatArray(minBuffer) { 0.0f }

    for (i in output.indices) {
        output[i] = fftData[2*i]
    }

    return output
}

相关问题