gpt4 book ai didi

java - 使用 JTransform 方法 realInverse 取回原始信号

转载 作者:行者123 更新时间:2023-11-30 03:34:55 25 4
gpt4 key购买 nike

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

最佳答案

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

关于java - 使用 JTransform 方法 realInverse 取回原始信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com