2011-08-21 53 views
2

幾個星期以來,我一直在試圖實現一個DFT,它接收任意字節的集合並將它們視爲一個信號。然後它將它們轉換到頻域。之後它將它們轉換回來。它最初只是試圖使用一些組件來重建原始信號。當這失敗時,我嘗試使用所有組件,但仍然失敗。如何將時域的離散信號傳輸到頻域而不丟失數據?

我一直在關注Wikipedia's Equations至於如何做到這一點的指導,我的代碼似乎符合給定這個代碼表示(在我心中)的公式:

DFT:

for (int k = 0; k < frequency_domain_magnitude.length; k++) { 
    for (int n = 0; n < data.length; n++) { 
     double val = (-2.0 * Math.PI * n * k/data.length); 
     freq_imag[k] += data[n] * -Math.sin(val); 
     freq_real[k] += data[n] * Math.cos(val); 
    } 
    frequency_domain_magnitude[k] = Math.sqrt(freq_imag[k] * freq_imag[k] + freq_real[k] * freq_real[k]); 
} 

IDFT:

for (int n = 0; n < data.length; n++) { 
    doubleValue[n] = 0; 
    for (int k = 0; k < freqUsed.length; k++) { 
     double val = (2.0 * Math.PI * n * k/data.length); 
     doubleValue[n] = freq_real[k] * Math.cos(val) - freq_imag[k] * Math.sin(val); 
    } 
    time_real[n] = (byte) (Math.floor(doubleValue[n])); 
} 

任何人都可以幫助我確定問題是什麼?

我問了一個關於同一個項目的問題,但它的措辭非常糟糕,編輯可能造成更多混亂,而不是更少。而且,雖然這個問題可能已經得到解答,但我仍然有更多的想法。可以發現here

+1

可能的重複[如何將一組離散的數據轉移到頻域並返回(最好是無損地)](http://stackoverflow.com/questions/6876159/how-can-i-transfer-a-離散數據到頻率域和後退前) –

+1

在我看來,第一個問題實際上更清晰,無論哪種方式,如果您對問題的措辭不滿意,然後編輯,不要重複。 –

+1

請考慮在[DSP.SE](dsp.stackexchange.com)上詢問這些問題! :-) –

回答

3

至少有三樣東西是錯誤的:

首先,你是不是所有的頻率上求和在IDFT。這是一個很大的問題,基本上相當於只採用一個離散頻率的IDFT而不是整個頻域數據。 其次,你的IDFT中有一個標誌翻轉過來。

行更改片段2的5至

doubleValue[n] += freq_real[k] * Math.cos(val) + freq_imag[k] * Math.sin(val); 

,並確保你初始化的doubleValue爲零。

第三,您需要添加標準化步驟;

行更改片段2的7

time_real[n] = (byte) (Math.floor(doubleValue[n]/data.length)) 

四,爲自己的方便,使用浮點輸入和輸出測試這個浮點算法您截斷爲整數數據類型之前,不要假設你會得到完全正確的答案做整數數據往返 - 浮點錯誤是非常真實的。

它也可能有助於抓住其他人的DFT和IDFT的實現,並通過一些非常簡單的輸入將行爲與您的實現進行比較以捕獲其他錯誤。由於DFT是線性代數,因此您可能會得到的結果並不完全正確,並且仍然可以看到質量好的答案。

1

從數字意義上講,由於舍入和/或量化誤差在往返過程中幾乎總是會產生細微的差異或信息損失,因此您不能這樣做。

但是,如果您正確完整地實施DFT和IDFT,則可以在此數值錯誤內重新創建時域數據。 FFT/IFFT對可能會產生比DFT/IDFT對小的數值誤差。

如果拋棄任何條件(複雜的虛構術語或頻率倉或其他),結果將離原始的更遠。例如,如果您的frequency_domain_magnitude.length或您的freqUsed.length小於您的數據長度,那麼您將丟掉術語(除非使用稍微不同的算法和/或比例因子)。

您的IDFT中至少有1或2個致命錯字,正如@ellisbben所述。

相關問題