ฉันควรใช้ข้อมูลใดเพื่อทดสอบการใช้งาน FFT และฉันควรคาดหวังความแม่นยำใด


14

ฉันมีส่วนร่วมกับความพยายามในการใช้อัลกอริทึม FFT และอยากรู้ว่าคำแนะนำที่แนะนำสำหรับข้อมูลการทดสอบการใช้งานคืออะไรและเพราะเหตุใด! - และความแม่นยำที่คาดหวัง

ในอินพุตทดสอบฉันพบคำแนะนำเล็กน้อยในโพสต์ Usenet เก่าที่ฉันโพสต์เป็นคำตอบ แต่เป็นเพียงคำแนะนำของบุคคลหนึ่งโดยไม่มีเหตุผลมากมาย - ฉันไม่พบสิ่งใดที่ดูเหมือนคำตอบที่ชัดเจน

ในความแม่นยำ Wikipedia บอกว่าข้อผิดพลาดควรเป็น O (e log N) แต่ความคาดหวังที่สมเหตุสมผลในแง่ที่สมบูรณ์คืออะไร?

แก้ไขเพื่อเพิ่ม: การทดสอบจริงอยู่ในรูปแบบที่ฉันได้จัดเก็บอาร์เรย์ของข้อมูลอินพุตและข้อมูลเอาต์พุต "อ้างอิง" ที่คำนวณล่วงหน้าเพื่อเปรียบเทียบกับดังนั้นฉันจึงไม่จำเป็นต้องใช้โซลูชันที่มีรูปแบบปิด

คำตอบ:


12

หากคุณต้องการตรวจสอบอัลกอริทึม FFT เพื่อความถูกต้องในแง่ที่ว่ามันทำหน้าที่ที่ต้องการซึ่งมีคุณสมบัติเป็นที่รู้จักของการแปลงฟูริเยร์โดยสิ้นเชิงคุณสามารถใช้วิธีที่เสนอใน:

Ergün, Funda (1995 มิถุนายน) การทดสอบฟังก์ชั่นเชิงเส้นหลายตัวแปร: การเอาชนะคอขวดของเครื่องกำเนิดไฟฟ้า ในพรอ. แอนยี่สิบเจ็ด ACM Symp ทฤษฎีการคำนวณ (หน้า 407–416)

บทความข้างต้นได้รับการอ้างอิงโดยผู้ผลิตFFTWว่าเป็นวิธีการเลือกของพวกเขาสำหรับการตรวจสอบว่าการดำเนินการ FFT โดยเฉพาะนั้นเป็นสิ่งที่ควรทำ เทคนิคที่นำเสนอกลั่นฟังก์ชันเป็นสามองค์ประกอบหลักที่ตรวจสอบด้วยการทดสอบแยก:

  • เส้นตรงผิวเผิน (พร้อมกับการแปลงญาติคนอื่น ๆ ในครอบครัวฟูริเยร์) เป็นผู้ประกอบการเชิงเส้นดังนั้นสำหรับค่าทั้งหมดของ1 , 2 , x 1 [ n ] , x 2 [ n ]สมการต่อไปนี้ต้องถือ:a1,a2,x1[n],x2[n]

FFT(a1x1[n]+a2x2[n])=a1FFT(x1[n])+a2FFT(x2[n])
  • DFT ของแรงกระตุ้นยูนิต:สัญญาณโดเมนเวลาเท่ากับฟังก์ชัน Kronecker delta ถูกนำไปใช้กับอินพุตของอัลกอริทึม FFT และเอาต์พุตจะถูกตรวจสอบกับ DFT ที่รู้จักของฟังก์ชันอิมพัลยูนิต (ซึ่งแปลงเป็นค่าคงที่ในเอาต์พุตทั้งหมด ถังขยะ) หากอัลกอริทึม FFT ให้ IFFT มันสามารถทดสอบในสิ่งที่ตรงกันข้ามเพื่อแสดงว่ามันให้ผลการทำงานของหน่วยแรงกระตุ้นอีกครั้ง

  • การเลื่อนเวลา:มีการใช้ข้อมูลสองชุดกับอินพุตของอัลกอริทึม FFT ความแตกต่างเพียงอย่างเดียวระหว่างสองในโดเมนเวลาคือการเปลี่ยนเวลาคงที่ ขึ้นอยู่กับคุณสมบัติที่รู้จักของ DFT สิ่งนี้จะส่งผลต่อการเลื่อนเฟสแบบเชิงเส้นที่รู้จักระหว่างการแทนโดเมนความถี่ของสัญญาณทั้งสองซึ่งความชันของการเลื่อนเฟสนั้นแปรผันตามการเลื่อนเวลา

ผู้เขียนบทความยืนยันว่าการทดสอบเหล่านี้เพียงพอที่จะตรวจสอบความถูกต้องของการนำ FFT ไปใช้ ฉันไม่ได้ใช้เทคนิคนี้ในอดีต แต่ดูเหมือนจะสมเหตุสมผลและฉันจะเชื่อถือผู้เขียนของ FFTW (ผู้ผลิตซอฟต์แวร์ฟรีชิ้นใหญ่) ในฐานะหน่วยงานที่น่าเชื่อถือในแนวทางการแก้ไขปัญหาที่น่าเชื่อถือ


ขอบคุณ! ผู้เขียนมีข้อเสนอแนะใด ๆ สำหรับค่า a1, a2, x1 [n] และ x2 [n] เพื่อใช้ในการทดสอบลิเนียริตี้ (หรือพวกเขายืนยันว่าสิ่งนี้ไม่สำคัญ) และสำหรับเรื่องนั้นชุดข้อมูลที่จะใช้สำหรับการทดสอบการเลื่อนเวลา?
Brooks Moses

3
เมื่ออ่านกระดาษจริง ๆ แล้วฉันสามารถตอบคำถามของฉันเองได้: ผู้เขียนไม่ได้อธิบายว่าคน ๆ หนึ่งทำการทดสอบลิเนียริตี้ได้ แต่กลับคิดว่ามีเพียงพอที่จะพิสูจน์ว่ามันเป็นจริงสำหรับ "อินพุตส่วนใหญ่" นอกจากนี้บทความนี้ยังอธิบายถึงการพิสูจน์ความถูกต้องที่แน่นอนโดยใช้เลขคณิตที่แน่นอน มันไม่ได้อธิบายถึงวิธีการในการหาลักษณะข้อผิดพลาดที่เป็นตัวเลขในโปรแกรมโดยประมาณ
Brooks Moses

ฉันจะไปข้างหน้าและทำเครื่องหมายว่าเป็นที่ยอมรับเพราะเป็นคำตอบที่ดีที่สุด แต่ฉันยังสนใจคำตอบอื่น ๆ ที่ครอบคลุมชุดข้อมูลอินพุตการทดสอบที่จะใช้ (และทำไม) หรือรายละเอียดของความแม่นยำที่คาดหวัง . ขอบคุณ!
Brooks Moses

2
คำถามของคุณมีสององค์ประกอบจริง ๆ ในการตรวจสอบอัลกอริทึม FFT: การตรวจสอบความถูกต้องและการวัดความแม่นยำของตัวเลข คำตอบของฉันพูดถึงเรื่องแรกเท่านั้น มันยากที่จะสร้างข้อความใด ๆ เกี่ยวกับความแม่นยำเชิงตัวเลขที่คาดหวังเพราะมันขึ้นอยู่กับการใช้งานโดยเนื้อแท้ ประเภทของเลขคณิต (เช่นจุดคงที่เทียบกับจุดลอยตัว) โครงสร้างที่ใช้ในการใช้อัลกอริทึมความยาว FFT (เช่นจำนวนขั้นตอนที่ใช้ในการย่อยสลายปัญหา) ทางลัดใด ๆ ที่ใช้เพื่อเพิ่มความเร็วในการประมวลผลเป็นต้น ปัจจัยและยากที่จะพูดคุย
Jason R

จุดดี; ฉันน่าจะถามพวกเขาเป็นคำถามแยกต่างหาก
บรูคส์โมเสส

5

ตามที่กล่าวไว้ในคำถามฉันพบคำแนะนำหนึ่งชุดในโพสต์ที่เก็บถาวรของ comp.dsp Usenet ( http://www.dsprelated.com/showmessage/71595/1.phpโพสต์โดย "tdillon"):

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

เธรดยังแนะนำให้ทำสองไซน์หนึ่งอันที่มีแอมพลิจูดขนาดใหญ่และอีกอันที่มีแอมพลิจูดขนาดเล็ก

อย่างที่ฉันพูดในคำถามหลักฉันไม่แน่ใจว่านี่เป็นคำตอบที่ดีโดยเฉพาะหรือถ้ามันสมบูรณ์มาก แต่ฉันใส่ที่นี่เพื่อให้ผู้คนสามารถลงคะแนนและแสดงความคิดเห็นได้


1
สิ่งที่ "1. ข้อมูลสุ่มป้อนเข้า" จะเปิดเผย?
Dilip Sarwate

1
@DilipSarwate: การทดสอบ Fuzz อาจมีประโยชน์ในการเปิดเผยข้อขัดข้อง และขึ้นอยู่กับประเภทของสัญญาณเสียง (เช่นเสียงสีชมพูหรือเสียงสีขาว) อาจมีประโยชน์ในการตรวจสอบว่าการกระจายพลังงานโดยรวมเป็นไปตามที่คาดไว้
smokris

2
@Dilip - "การทดสอบควัน" fft ของฉันคือ ifft (fft (random_stuff)) ~ = random_stuff
hotpaw2

ยังไม่มีข้อความยังไม่มีข้อความ(0,1)99%ยังไม่มีข้อความ ยังไม่มีข้อความ(0,1)

2
@Dilip: ฉันเป็นคนที่แต่งตัวประหลาดฮาร์ดแวร์ ฉันต้องการบางสิ่งที่อาจสลับเปอร์เซ็นต์ของบิตทั้งหมดในตัวคูณและ CSAs ทั้งหมด
hotpaw2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.