คุณจำเป็นต้องรู้ข้อกำหนดเชิงตัวเลขของอัลกอริทึมของคุณและเลือกความแม่นยำตามนั้น
ลองทำคณิตศาสตร์ตรงนี้: จุดลอยตัว 32 บิตมีแมนทิสซา 24 บิตและเลขชี้กำลัง 8 บิต สิ่งนี้จะช่วยให้คุณมีอัตราส่วนสัญญาณต่อสัญญาณรบกวน 150 เดซิเบลในช่วงไดนามิกที่ประมาณ 1540 เดซิเบล นั่นเป็นสิ่งที่ดีสำหรับเสียงส่วนใหญ่ ความแม่นยำสองเท่าจะช่วยให้คุณได้มากเป็นสองเท่า
แต่ละอัลกอริทึมมีข้อกำหนดบางอย่างสำหรับความแม่นยำเชิงตัวเลข หากการออกแบบอัลกอริธึมด้านเสียงทั้งหมดที่ฉันรู้นั้นทำได้ดีด้วยจุดลอยตัว 32 บิต "ออกแบบอย่างเหมาะสม" เป็นคำหลักที่นี่ ตัวอย่างเช่นวงลำดับที่ 6 จาก 40-200 Hz สุ่มตัวอย่างที่ 44.1kHz ที่นำมาใช้โดยตรงจากตัวกรอง bi-quad IIR II จะมีปัญหาเสียงรบกวนที่ 32 บิต อย่างไรก็ตามมันทำงานได้อย่างสมบูรณ์แบบในรูปแบบ transposed II หรือ direct form I filter
หากคุณพยายามที่จะขยายส่วนบางส่วนของตัวกรองผ่านแถบเดียวกันโดยใช้ฟังก์ชั่นตัวอย่างของ Matlab Residuez () คุณจะได้รับผลลัพธ์ที่ไม่ดีแม้จะมีความแม่นยำสองเท่า ข้อกำหนดตัวเลขของอัลกอริทึมสำหรับข้อมูลอินพุตนั้นอีกครั้งนั้นมีความแม่นยำมากกว่าความแม่นยำสองเท่า กุญแจสำคัญในการแก้ไขปัญหานี้ไม่ได้เป็นการเพิ่มความแม่นยำของการสุ่มตัวอย่าง แต่เป็นการใช้อัลกอริทึมที่ดีกว่าแทน
ในที่สุดลองมาดูสิ่งที่ทำให้มีความเสี่ยงแบบลอยตัว (32 บิตหรือ 64 บิต): คุณมีช่วงไดนามิกที่กว้างใหญ่เช่นคุณสามารถลดขนาดสัญญาณได้ถึง 200dB ขยาย 500dB ลดอีก 300dB และจบลงตรงจุดที่คุณเริ่ม เกือบจะไม่สูญเสียความแม่นยำใด ๆ ทั้งสิ้น นั่นไม่ใช่อย่างนั้น จุดลอยตัวมีปัญหาในการเพิ่มตัวเลขที่มีขนาดต่างกันอย่างมากมาย มีจุดที่การเพิ่มจำนวนน้อยไม่ได้สร้างความแตกต่างใด ๆ นั่นคือคุณจะได้รับ 1 + dx = 1 ตัวเลขนี้ "dx" ประมาณ 1.2e-7 สำหรับทศนิยม 32 บิตและ 2.2e-16 สำหรับ 64 บิต หากอัลกอริทึมของคุณรวมถึงการเพิ่มหรือลบตัวเลขที่อยู่ในระยะไกลคุณอาจพบปัญหา
ตัวอย่างที่ดีสำหรับสิ่งนี้คือตัวกรอง Direct Form II ที่กล่าวถึงก่อนหน้านี้: ตัวกรองโดยตรงจาก II (ดูเช่นhttps://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) โดยทั่วไปจะคำนวณตัวแปรสถานะโดยการกรองอินพุต ด้วยฟังก์ชั่นการถ่ายโอนเฉพาะขั้วก่อนแล้วจึงกรองด้วยศูนย์เพื่อสร้างเอาต์พุต ตอนนี้ถ้าเสานั้นอยู่ใกล้กับวงกลมหน่วยฟังก์ชันถ่ายโอนขั้วเดียวเท่านั้นจะใหญ่มาก ดังนั้นตัวแปรสถานะสามารถมีขนาดใหญ่กว่าอินพุต (80db ถึง 100dB ใหญ่กว่า) และการสรุปตัวแปรสถานะด้วยอินพุตทำให้เกิดเสียงดังมาก
วิธีแก้ปัญหาที่นี่คือไปที่ Transposed Form II หรือตัวกรอง Form I โดยตรง การวิเคราะห์แสดงให้เห็นว่าตัวแปรสถานะไม่สามารถมีขนาดใหญ่กว่าอินพุท / เอาท์พุทแล้วอาจจะเป็น 12dB หรือราว ๆ นั้นดังนั้นปัญหาความไม่ตรงกันของขนาดจะไม่เกิดขึ้นตั้งแต่แรก