簡體   English   中英

對離散傅立葉變換進行單元測試

[英]Unit testing a discrete Fourier transformation

幾個月前,我不得不用Java實現二維傅立葉變換。 盡管對於一些手動檢查結果似乎理智,但我想知道一種好的測試驅動方法會是什么樣子。

基本上,我所做的就是查看直流分量的合理值,並比較交流分量(如果它們與Mathematica輸出大致匹配)。

我的問題是:對於離散傅立葉變換,您將實施哪些單元測試? 您將如何驗證計算返回的結果?

至於其他單元測試,則應考慮使用較小的固定輸入測試向量,可以輕松手動計算結果並進行比較。 對於更復雜的輸入測試向量,直接DFT實現應該足夠容易實現並用於交叉驗證結果(可能在您自己的手動計算之上)。

至於用於一維FFT的特定測試向量,您可以從dsprelated開始 ,他們選擇了以下這些來解決常見的缺陷:

  • 單次FFT測試-N個輸入和N個輸出
    • 輸入隨機數據
    • 輸入全為零
    • 輸入全為1(或其他一些非零值)
    • 輸入在+1和-1之間交替。
    • 當i = 0,1,2,...,N-1時,輸入為e ^(8 * j * 2 * pi * i / N)。 (j = sqrt(-1))
    • 當i = 0,1,2,...,N-1時,輸入為cos(8 * 2 * pi * i / N)。
    • 當i = 0,1,2,...,N-1時,輸入為e ^((43/7)* j * 2 * pi * i / N)。 (j sqrt(-1))
    • 輸入為cos((43/7)* 2 * pi * i / N),其中i = 0,1,2,...,N-1。
  • 多重FFT測試-運行連續的隨機數據集
    • 數據集從時間0,N,2N,3N,4N等開始。
    • 數據集從時間0,N + 1、2N + 2、3N + 3、4N + 4等開始。

對於二維FFT,您可以在上面進行構建。 前三種情況仍然直接適用(隨機數據,全零,全一)。 其他一些則需要更多的工作,但對於較小的輸入量仍可進行管理。 最后,谷歌搜索應生成一些參考圖像(轉換前后),以用於一些常見情況,例如黑白正方形,矩形,圓形等可用作參考(例如,請參見http://www.fmwconcepts.com/ misc_tests / FFT_tests / )。

通過使用隨機復數向量進行測試,並與直接DFT比較浮點精度級別的公差,可以發現99.9%的數字和編碼問題。

零,恆定或正弦矢量可以使您的眼睛捕捉到初始化,裁剪,折疊,縮放等問題,從而有助於理解故障。 但是他們通常不會找到隨機情況無法找到的任何東西。

我的kissfft庫針對定點問題進行了一些額外的測試-如果您使用的是浮點運算,則不是問題。

暫無
暫無

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

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