วิธีการคำนวณอย่างมีประสิทธิภาพเฉพาะค่าสัมประสิทธิ์ต่ำของ FFT ที่ไม่มีเบาะรอง


14

ฉันมีอัลกอริทึมที่ zero pad เรียงลำดับไปที่ 4N ทำ FFT และใช้ความถี่ต่ำสุด N ที่ชี้จาก 4N ที่สร้างขึ้นเท่านั้น

ดูเหมือนว่าจะมีงานที่ต้องสูญเปล่ามากมายความคิดใด ๆ ที่สามารถทำได้เร็วกว่านี้


@Dilip ฉันจะใช้ห้องสมุด FFTW หรือ IMKL แน่นอนฉันสามารถใช้ห้องสมุด kissfft ของฉัน แต่มันเริ่มต้นที่ข้อเสียความเร็วเทียบกับคนอื่น ๆ
Mark Borgerding

2
ฉันลบความคิดเห็นที่คุณตอบกลับเนื่องจากฉันต้องการจะพูดว่าการลดทอนความถี่ใน แต่การเขียนการทำลายล้างในเวลาแทน แต่ดูแผนภาพผีเสื้อที่นี่ หากคุณเขียนโค้ดบางส่วนสำหรับสองขั้นตอนแรกเพื่อให้ -FFT คำนึงถึงเลขศูนย์จำนวนมากและข้ามการคูณที่สอดคล้องกันคุณสามารถเรียกรูทีนย่อยไลบรารี FFTครั้งสำหรับ -FFTs ซึ่งเวกเตอร์อินพุตเป็น "เต็ม". แน่นอนคุณต้องการเพียงของเอาต์พุตจากการเรียกรูทีนย่อยแต่ละครั้ง 4N4NN/4
Dilip Sarwate

คำตอบ:


2

หากคุณเพียงไม่กี่ถังขยะต่อไปนี้อาจมีประสิทธิภาพมากสำหรับคุณ:
1. ทำ DFT ที่ความถี่แต่ละครั้งที่คุณต้องการ
2. ใช้อัลกอริทึม Goertzel สำหรับแต่ละความถี่ที่มีปัญหา


มาร์คกล่าวว่าเขาต้องการถังขยะออกจากดังนั้น 1) ดูเหมือนจะไม่ใช่ตัวเลือกที่สมเหตุสมผล อัลกอริทึม Goertzel มีข้อได้เปรียบเช่นการคำนวณออนไลน์ที่ได้รับข้อมูลที่เก็บข้อมูลขนาดเล็ก ฯลฯ แต่ต้องการการคูณต่อถังในขณะที่ถังแต่ละเครื่องคำนวณเป็นการประเมินพหุนามผ่านกฎของ Horner ต้องการเพียงการคูณเท่านั้น ดังนั้น 2) ไม่ปรากฏว่าเป็นตัวเลือกที่เหมาะสมอย่างยิ่งเช่นกัน 4 NN4N2N+4ยังไม่มีข้อความ
Dilip Sarwate

คุณพูดถูกในขณะที่อ่านคำถามฉันคิดถึงรายละเอียด ในขณะที่ฉันตอบฉันกำลังคิดว่า "Gee มันคงจะดีถ้ารู้ว่าถังขยะที่เขาต้องการ ... " เดาฉันควรอ่านคำถามอีกครั้งก่อนตอบ
จาค็อบ

2

การเว้นระยะห่างจากศูนย์เป็น 4X ยาวคำนวณ FFT ที่ยาวขึ้นแล้วใช้เฉพาะถังขยะล่างที่ 1/4 ก่อให้เกิดผลลัพธ์ที่เหมือนกันเกือบเท่ากับการแก้ไขแบบ Sinc ของความยาวดั้งเดิม FFT

ดังนั้นเพียงแค่ใช้ความยาว FFT ดั้งเดิมและสอดแทรกโดยใช้เคอร์เนลการแก้ไข 3 เฟส Sinc พร้อมความกว้างของหน้าต่างที่เหมาะสม


0

การเติมเต็มศูนย์ในโดเมนเวลาให้โซลูชันความถี่สูงขึ้น แต่ไม่มีข้อมูลใหม่ดังนั้นจึงให้การแก้ไขในโดเมนความถี่เป็นหลัก ขึ้นอยู่กับลักษณะของสัญญาณและความแม่นยำที่คุณต้องการคุณอาจได้รับคะแนนความถี่เพิ่มเติมด้วย FFT ปกติที่มี N จุดและทำการแก้ไขที่เหมาะสม (เชิงเส้น, เส้นโค้ง, pchip, sinc ฯลฯ )


ให้เป็นพหุนาม (อาจมีค่าสัมประสิทธิ์ซับซ้อนx ผม ) ของการศึกษาระดับปริญญาN - 1 เราประเมินค่ามันที่จุดN α n , 0 n N - 1โดยที่α = exp ( - j 2 π / N )คือNx(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)Nราก -th ของความสามัคคีที่จะได้รับหมายเลขX n = x ( α n ) นี่คือค่าของx ( z )ที่Nจุดที่เว้นระยะเท่ากันบนวงกลมหน่วย สิ่งที่เราจริงๆต้องการคือค่าของx ( Z )ที่β n , 0 n N - 1ที่β = ประสบการณ์( - J 2 π / 4 N )ซึ่งเป็นNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N) points บนจตุภาคแรกของวงกลมหน่วย ฉันไม่เห็นว่าการประมาณค่าเชิงเส้นเส้นโค้ง ฯลฯ จะทำงานอย่างไร กรุณาอธิบาย. N
Dilip Sarwate

ขออภัยประโยคถัดจากนั้นในความคิดเห็นก่อนหน้าของฉันควรจะกล่าวถึงจตุภาคที่สี่ของวงกลม ตั้งแต่ทุกสี่ต้องการค่าx ( β 4 k )ได้รับการคำนวณโดย FFT: x ( β 4 k ) = x ( α k ) β4=αx(β4k)x(β4k)=x(αk)
Dilip Sarwate

ฉันสงสัยว่ามันจะเป็นการยากที่จะทำการแก้ไขที่เหมาะสมได้เร็วกว่าการทำ FFT ที่ใหญ่
Mark Borgerding

สมมติว่าคุณมีอัตราตัวอย่าง 128 FFT และ 12800Hz 128 FFTs ให้ค่าที่ 0Hz, 100Hz, 200 Hz, 300Hz และอื่น ๆ สิ่งที่เป็นศูนย์รองคือการเพิ่มความละเอียดความถี่เป็น 0 Hz, 25Hz, 50 Hz, 100Hz ฯลฯ ซึ่งสามารถดูได้ว่าเป็นปัญหาการแก้ไข สำหรับฉันแล้วคุณต้องทำการคำนวณทางคณิตศาสตร์แบบวงกลมของลำดับที่ 128 แน่นอนว่าจะไม่คุ้มค่ารำคาญ แต่ขึ้นอยู่กับการประยุกต์ใช้และความแม่นยำต้องมีการแก้ไขคำสั่งซื้อที่ต่ำกว่ามากจะดีพอ
Hilmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.