มันถูกต้องหรือไม่ที่จะเพิ่มแอมพลิจูด (และคาดว่าจะมีคุณภาพ FFT) โดยเพียงแค่ปรับขนาดข้อมูลหรือไม่


10

ฉันใช้รุ่น "KISS FFT" โดย Mark Borgerding ยอมรับอาร์เรย์ของค่าอินพุตแบบคงที่ 16 บิตและสร้างอาร์เรย์ผลลัพธ์แบบ 32 บิต

ฉันได้ค้นพบว่าถ้าแอมพลิจูดอินพุทมีค่าต่ำมากค่าผลลัพธ์แบบลอยออกมาเป็นศูนย์ แต่ถ้าฉันเพียงแค่ปรับอินพุต (โดยการพูดปัจจัยที่ 16) ดังนั้นค่าเอาท์พุตที่น้อยกว่าจึงเป็นศูนย์ รายละเอียดเพิ่มเติม. (ไม่ใช่ว่ามันมีความสำคัญมากสำหรับวัตถุประสงค์ของฉัน แต่เพื่อความมั่นคงฉันจะหารค่าลอยตัวที่เกิดขึ้นโดยใช้ตัวคูณสเกลเดียวกัน)

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

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


"ฉันเกือบจะสงสัยว่าควรฉีดเสียงรบกวนระดับต่ำเพื่อแทนที่ค่าศูนย์ในอินพุตหรือไม่" = en.wikipedia.org/wiki/Dither
endolith

คำตอบ:


7

นี่อาจเป็นวิธีที่ถูกต้อง คุณกำลังสังเกตเห็นปัญหาในทางปฏิบัติที่เกิดขึ้นบ่อยครั้งเมื่อใช้เลขคณิตจำนวนเต็ม (เช่นจำนวนเต็ม) (แม้ว่ามันจะเกิดขึ้นในจุดลอยตัวก็ได้) เมื่อรูปแบบตัวเลขที่คุณใช้ในการคำนวณไม่มีความแม่นยำเพียงพอที่จะแสดงค่าทั้งหมดที่อาจเกิดขึ้นจากการคำนวณของคุณจำเป็นต้องใช้รูปแบบการปัดเศษบางรูปแบบ (เช่นการตัดปลายปัดเศษใกล้ที่สุดเป็นต้น) บน). นี่มักจะเป็นแบบจำลองเป็นข้อผิดพลาดในการเพิ่มปริมาณสัญญาณของคุณ

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

ดังนั้นคุณสามารถรับรอบนี้โดยการปรับขนาดข้อมูลได้หรือไม่ บางครั้ง (มีเทคนิคน้อยมากที่ทำงานตลอดเวลา!) หากสัญญาณอินพุตของคุณถูก จำกัด ขอบเขตให้มีขนาดต่ำกว่าเต็มรูปแบบของรูปแบบตัวเลข (จำนวนเต็ม 16 บิตที่เซ็นชื่อเรียกใช้จาก -32768 ถึง +32767) จากนั้นคุณสามารถปรับขนาดสัญญาณอินพุตได้อย่างเต็มที่เพื่อใช้ช่วงที่มี มัน. สิ่งนี้สามารถช่วยลดผลกระทบของข้อผิดพลาดของการปัดเศษได้เนื่องจากขนาดของข้อผิดพลาดของการปัดเศษใด ๆ จะเล็กลงเมื่อเปรียบเทียบกับสัญญาณที่น่าสนใจ ดังนั้นในกรณีที่ผลลัพธ์ทั้งหมดของคุณถูกปัดเศษเป็นศูนย์ภายในอัลกอริทึมสิ่งนี้อาจช่วยได้

เมื่อไรที่เทคนิคดังกล่าวทำร้ายคุณ? ขึ้นอยู่กับโครงสร้างของการคำนวณของอัลกอริทึมการปรับขนาดสัญญาณอินพุทอาจทำให้คุณมีตัวเลขล้น นอกจากนี้หากสัญญาณมีสัญญาณรบกวนพื้นหลังหรือสัญญาณรบกวนที่มีขนาดใหญ่กว่าข้อผิดพลาดของการปัดเศษของอัลกอริทึมดังนั้นคุณภาพของสิ่งที่คุณได้รับจากเอาต์พุตจะถูก จำกัด โดยสภาพแวดล้อมโดยทั่วไปจะไม่เกิดข้อผิดพลาดในการคำนวณ


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

1

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


ฉันถูกเสนอโครงการนี้ด้วยอัลกอริทึม FFT ปัจจุบันที่มีอยู่แล้วและฉันลังเลที่จะโคลนกับมันในตอนนี้ และทั้งหมดนี้เกิดขึ้นในโทรศัพท์แบบเรียลไทม์ดังนั้นประสิทธิภาพจึงเป็นปัญหาอย่างแน่นอน
Daniel R Hicks

เข้าใจ คุณรู้หรือไม่ว่า FFT ภายในได้รับการแก้ไขหรือเป็นจุดลอยตัว หากได้รับการแก้ไขแล้วคุณจำเป็นต้องกังวลเกี่ยวกับการตัดการล้นและการไหลออกใต้น้ำ
Hilmar

เอกสารและคำวิจารณ์นั้นยอดเยี่ยมหากไม่มี แต่ฉันเห็น ints จำนวนมากในโค้ดและมีค่าไม่กี่ค่าที่ลอยและเป็นสองเท่า ดูเหมือนว่าจะรวมเฟรมเวิร์ก #ifdef สำหรับการสลับจาก 16 บิตเป็น 32 บิตหรือลอยตัว แต่เฟรมเวิร์กนั้นถูกปิดใช้งานมานาน
Daniel R Hicks

iPhone (ARM + NEON CPU) สามารถทำ float FFT ได้เร็วขึ้น (ผ่านเฟรมเวิร์ก Accelerate) กว่า FFT จำนวนเต็มใน C
hotpaw2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.