เมื่อใดที่ต้องพิจารณาจุดลอยตัวคู่ (64 บิต) สำหรับเสียง


12

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

สมมติว่า:

  • CPU / DSP มีจุดลอยฮาร์ดแวร์รองรับทั้งความแม่นยำเดี่ยวและคู่
  • ลำดับความสำคัญคือเสียงที่มีคุณภาพไม่ได้ประสิทธิภาพสูง ตัวอย่างเช่นความแม่นยำสองเท่าจะได้รับการพิจารณาหากนำเสนอคุณภาพที่ดีขึ้น (การรับรู้)

คำตอบ:


9

ซิงเกิ้ลโฟลว์ของ IEEE มีเพียง mantissa ประมาณ 24 บิตเท่านั้น แต่อัลกอริธึม DSP / การกรองจำนวนมาก (IIR biquads ที่มีเสา / ศูนย์ใกล้กับวงเวียนหน่วย ฯลฯ ) ต้องการ mantissa มากกว่า 24 บิตสำหรับผลิตภัณฑ์คอมพิวเตอร์ระดับกลาง (สะสม ฯลฯ ) เพื่อให้ได้ผลลัพธ์สุดท้ายที่แม่นยำใกล้ถึง 16 หรือ 24 บิต สำหรับอัลกอริธึมประเภทนี้ตัวสะสมจำนวนเต็มขนาด 32, 40 และ 48 บิตมักใช้กับ DSP ที่ไม่มี FPU

แต่สำหรับการใช้งานโปรเซสเซอร์ในปัจจุบัน (สำหรับพีซีสมาร์ทโฟนและอื่น ๆ ) FPU ความแม่นยำสองเท่านั้นเร็วกว่าการพยายามใช้จำนวนเต็มขนาด 32 หรือ 64 บิตเมื่ออัลกอริทึมของคุณต้องการผลิตภัณฑ์ระดับกลางมากกว่า 24 บิต

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


นี่คือประเภทของข้อมูลที่ฉันเป็นหลังจากนั้น ฉันจะยอมรับคำตอบนี้ถ้าคุณกรุณาจะให้เป็นตัวอย่างที่เป็นรูปธรรมของกรณีที่แม่นยำสองถูกต้องที่จะทำให้การทำงานของตัวกรองคือมันจะฟังดูไม่ดี (หรืออย่างน้อยเป็นธรรมสามัญ) ที่มีความแม่นยำเดียว แต่เรียบเนย ด้วยความแม่นยำสองเท่า
user1849104

นอกจากนี้คุณหมายถึงอะไรโดยการกำจัดแคช? คุณหมายถึงว่าการมีข้อมูลมากเป็นสองเท่าที่จะทำให้สิ่งต่าง ๆ ช้าลงอย่างน่ากลัว?
user1849104

ตัวอย่างได้รับ IIR ที่มีเสา / ศูนย์ใกล้กับหน่วยวงกลม หากมีแคชอัลกอริทึมและชุดข้อมูลการทำงานที่เหมาะสมกับแคชนี้อาจเร็วกว่าชุดที่ไม่ได้ทำ
hotpaw2

9

CPU / DSP มีจุดลอยฮาร์ดแวร์รองรับทั้งความแม่นยำเดี่ยวและคู่

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

แต่เมื่อใช้คำแนะนำ SIMD คุณสามารถทำงานได้อีกสองครั้งโดยใช้แบบลอย 32 บิตมากกว่าแบบ 64 บิต นั่นเป็นเรื่องใหญ่

อีกสิ่งที่ควรคำนึงถึงก็คือหน่วยความจำการใช้ความแม่นยำสองเท่าจะแบ่งเป็นสองเท่าของปริมาณข้อมูลที่เหมาะกับหน่วยความจำแคชในระดับที่เร็วที่สุด

เมื่อทำการสังเคราะห์และประมวลผลเสียงบนโปรเซสเซอร์ที่ทันสมัย

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

ไม่ว่าในกรณีใดมันเป็นปัญหาความแม่นยำเชิงตัวเลข - ในแง่ของคุณภาพจะไม่มีความแตกต่างในการรับรู้ โปรดจำไว้ว่ามันค่อนข้างไร้สาระที่จะคาดหวังว่าสายสัญญาณเสียงของฮาร์ดแวร์จะมีความแม่นยำมากกว่า 20 บิต (สมมติว่าบอร์ดนั้นมีเส้นทางที่ไร้ที่ติและชิ้นส่วนทุกชิ้นนั้นสมบูรณ์แบบเรายังคงวิ่งไปจนถึงขีด จำกัด ของเสียงรบกวนของ Johnson!) - ความแม่นยำนี้ครอบคลุมไปด้วยความแม่นยำสูง เส้นทางสัญญาณบนโต๊ะผสมระดับไฮเอนด์มี op-amps 50 วินาทีซึ่งแต่ละคำสั่งมีขนาดที่บิดเบือนมากขึ้นกว่าเสียงควอนตัมของการดำเนินการทางคณิตศาสตร์บนโฟลว์ที่มีความแม่นยำเดี่ยว


จะปลอดภัยหรือไม่ที่จะบอกว่าการใช้ความแม่นยำเดี่ยวด้วยคำสั่ง SIMD จะให้ประสิทธิภาพมากกว่าความแม่นยำสองเท่าโดยประมาณเสมอ?
user1849104

เนื่องจากฉันไม่สามารถแก้ไขความคิดเห็นก่อนหน้านี้อีกต่อไป: ฉันไม่เคยมีโอกาสที่จะใช้ชุดคำสั่ง SIMD ใด ๆ (โดยตรง) เป็นไปได้หรือไม่ที่จะใช้ความแม่นยำเดี่ยวและเพิ่มประสิทธิภาพเป็นสองเท่า? หรือความจริงเข้ามาขวางทาง?
user1849104

6

คุณจำเป็นต้องรู้ข้อกำหนดเชิงตัวเลขของอัลกอริทึมของคุณและเลือกความแม่นยำตามนั้น

ลองทำคณิตศาสตร์ตรงนี้: จุดลอยตัว 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 หรือราว ๆ นั้นดังนั้นปัญหาความไม่ตรงกันของขนาดจะไม่เกิดขึ้นตั้งแต่แรก


2

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

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


2

หากคุณทำงานกับเสียงสังเคราะห์ที่ผ่านการประมวลผลจำนวนมากระหว่างการสร้างและการเรนเดอร์ (แปลงเป็นจำนวนเต็ม 16/24 บิต) คุณจะได้รับประโยชน์จากการทำงานในความแม่นยำเชิงตัวเลขที่ดีที่สุดที่เครื่องของคุณมี

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

ฉันไม่แน่ใจทั้งหมดเกี่ยวกับเรื่องนี้ แต่ถ้าคุณสร้างเสียงของคุณแล้วในจุดลอยตัวสิ่งประดิษฐ์ที่พบบ่อยที่สุดส่วนใหญ่จะไม่ปรากฏตามคำจำกัดความและคุณสามารถประมวลผลด้วย "คุณภาพเสียง" ได้อีกมาก บางทีคุณสามารถสร้างตัวอย่างเสียงได้เฉพาะหลังจากที่คุณใช้เอฟเฟกต์บางอย่างกับเครื่องกำเนิดไฟฟ้าแล้ว ช่วงเวลาเดียวที่คุณจะแนะนำสิ่งประดิษฐ์ที่เป็นไปได้จริง ๆ ก็คือเมื่อคุณแปลงเป็นเอาต์พุตในรูปแบบไฟล์จำนวนเต็มเช่น. WAV

ที่จริงแล้วเนื่องจากเครื่องจักรส่วนใหญ่มีความแม่นยำแบบ "double" (64 บิต) ในปัจจุบันฉันไม่เห็นเหตุผลที่จะทำงานกับ 32 บิตอีกต่อไป ...

หวังว่าจะช่วย!


3
"ฉันไม่เห็นเหตุผลที่จะทำงานกับ 32 บิตอีกต่อไป ... " เว้นแต่คุณจะใช้ SIMD!
pichenettes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.