簡體   English   中英

使用JTransform方法realInverse取回原始信號

[英]Getting back original signal using JTransform method realInverse

我正在使用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM