สำหรับ Android 5.0 (Lollipop) ขณะนี้เครื่องมือสุ่มเสียงจะยึดตาม บนตัวกรอง FIR ที่ได้จากฟังก์ชัน Kaiser แบบมีหน้าต่าง sinc ไกเซอร์ที่มีหน้าต่างแบบซิงก์ เสนอที่พักดังต่อไปนี้
- การคำนวณหาพารามิเตอร์การออกแบบทำได้ง่ายๆ (แถบสัญญาณรบกวน) คลื่น Google+ แบนด์วิดท์การเปลี่ยน ความถี่การตัดออก ความยาวตัวกรอง)
- เหมาะสมที่สุดในการลดพลังงานแถบจับเวลาเมื่อเปรียบเทียบกับโดยรวม พลังงาน
ดู P.P. ไวยานาธาน ระบบแบบหลายอัตราและคลังตัวกรอง หน้า 50 สำหรับการสนทนาเกี่ยวกับ หน้าต่าง Kaiser และความมีประสิทธิภาพและความสัมพันธ์กับ Prolate Spheroidal Windows
ระบบจะคำนวณพารามิเตอร์การออกแบบโดยอัตโนมัติตามภายใน การกำหนดคุณภาพและอัตราส่วนการสุ่มตัวอย่างที่ต้องการ อิงตาม ระบบจะสร้างตัวกรอง sinc ในโหมดหน้าต่าง สำหรับการฟังเพลง ตัวสุ่มตัวอย่างสำหรับ 44.1 ถึง 48 kHz และในทางกลับกันจะสร้างขึ้นด้วยอัตราที่สูงขึ้น มากกว่าการเปลี่ยนความถี่ที่กำหนดเอง
ตัวอย่างเสียงช่วยเพิ่มคุณภาพและความเร็ว เพื่อให้ได้คุณภาพนั้น แต่เครื่องมือสุ่มตัวอย่างอาจสร้างปริมาณ Conversion น้อย คลื่นความถี่สูงและคลื่นเสียงฮาร์มอนิกที่เป็นนามแฝง และอาจทำให้เกิด การสูญเสียความถี่ในช่วงเปลี่ยนผ่าน ดังนั้นโปรดหลีกเลี่ยงการใช้โดยไม่จำเป็น
แนวทางปฏิบัติแนะนำสำหรับการสุ่มตัวอย่างและการสุ่มตัวอย่าง
ส่วนนี้จะอธิบายแนวทางปฏิบัติที่ดีที่สุดเพื่อช่วยให้คุณหลีกเลี่ยงปัญหาเกี่ยวกับอัตราการสุ่มตัวอย่าง
เลือกอัตราการสุ่มตัวอย่างให้เหมาะกับอุปกรณ์
โดยทั่วไป การเลือกอัตราการสุ่มตัวอย่างให้เหมาะกับอุปกรณ์เป็นการดีที่สุด โดยปกติจะเป็น 44.1 kHz หรือ 48 kHz การใช้อัตราการสุ่มตัวอย่างมากกว่า โดยทั่วไปแล้ว 48 kHz จะทำให้คุณภาพลดลงเนื่องจากเครื่องสุ่มตัวอย่างต้อง ที่ใช้เล่นไฟล์
ใช้การสุ่มตัวอย่างแบบง่าย อัตราส่วน (โพลีเฟสคงที่เทียบกับโพลีเฟสแบบประมาณค่า)
ตัวสุ่มตัวอย่างจะทำงานในโหมดใดโหมดหนึ่งต่อไปนี้
- โหมดโพลีเฟสคงที่ ค่าสัมประสิทธิ์ตัวกรองสําหรับแต่ละโพลีเฟสจะคำนวณล่วงหน้า
- โหมดโพลีเฟสแทรกสลับ ค่าสัมประสิทธิ์ตัวกรองของโพลีเฟสแต่ละต้นต้อง จะถูกประมาณจากโพลีเฟสที่คำนวณไว้ล่วงหน้า 2 ช่วงที่ใกล้ที่สุด
เครื่องสุ่มตัวอย่างจะทํางานเร็วที่สุดในโหมดโพลีเฟสคงที่เมื่ออัตราส่วนของอินพุต อัตราสูงกว่าอัตราเอาต์พุต L/M (เอาตัวหารร่วมมาก) มี M น้อยกว่า 256 เช่น สำหรับ Conversion 44,100 ถึง 48,000 รายการ L = 147 M = 160
ในโหมดโพลีเฟสคงที่ อัตราการสุ่มตัวอย่างจะถูกล็อกและไม่เปลี่ยนแปลง ในช่วง อัตราการสุ่มตัวอย่างเป็นค่าโดยประมาณ อัตราการสุ่มตัวอย่างเมื่อเล่นบนอุปกรณ์ 48 kHz โดยทั่วไป Drift จะสำหรับกลุ่มตัวอย่าง 1 ตัวอย่างในช่วงไม่กี่ชั่วโมง ซึ่งโดยปกติแล้วจะไม่น่าเป็นห่วงเนื่องจาก ข้อผิดพลาดในการประมาณค่าน้อยกว่าข้อผิดพลาดของความถี่ที่เกิดจากควอตซ์ภายในมาก ออสซิลเลเตอร์ การกระจายความร้อน หรือเสียงรบกวน (โดยทั่วไปคิดเป็น 10 ppm)
เลือกอัตราสุ่มอัตราส่วนแบบง่าย เช่น 24 kHz (1:2) และ 32 kHz (2:3) เมื่อเล่น บนอุปกรณ์ 48 kHz แม้ว่าการสุ่มตัวอย่างอื่นๆ ก็ตาม อัตราและอัตราส่วนอาจได้รับอนุญาตผ่าน AudioTrack
ใช้การเพิ่มแซมปลิงแทน การสุ่มตัวอย่างเพื่อเปลี่ยนอัตราการสุ่มตัวอย่าง
อัตราการสุ่มตัวอย่างสามารถเปลี่ยนแปลงได้แบบเรียลไทม์ รายละเอียดของ การเปลี่ยนแปลงดังกล่าวขึ้นอยู่กับบัฟเฟอร์ภายใน ตัวอย่าง) ไม่ได้อิงตามกลุ่มตัวอย่าง ซึ่งใช้สำหรับเอฟเฟกต์ได้
ไม่ต้องเปลี่ยนอัตราการสุ่มตัวอย่างแบบไดนามิกเมื่อ การดาวน์แซมปลิง เมื่อเปลี่ยนอัตราการสุ่มตัวอย่างหลังจากแทร็กเสียง ความแตกต่างประมาณ 5 ถึง 10 เปอร์เซ็นต์จากอัตราเดิม ทริกเกอร์การคำนวณตัวกรองซ้ำเมื่อสุ่มตัวอย่าง (เพื่อระงับอย่างเหมาะสม การใช้นามแฝง) การดำเนินการนี้อาจใช้ทรัพยากรการคำนวณและอาจทำให้เกิดการคลิกที่มีเสียง หากมีการแทนที่ตัวกรองแบบเรียลไทม์
จำกัดการสุ่มตัวอย่างขั้นต่ำไม่เกิน 6:1
โดยทั่วไปแล้ว การลดการสุ่มตัวอย่างจะทริกเกอร์โดยข้อกำหนดของอุปกรณ์ฮาร์ดแวร์ เมื่อ ตัวแปลงอัตราการสุ่มตัวอย่างใช้สำหรับการลดจำนวนตัวอย่าง พยายามจำกัดอัตราส่วนการลดลงให้เหลือไม่เกิน 6:1 เพื่อให้ได้นามแฝงที่ดี การยับยั้ง (เช่น ไม่มีตัวอย่างที่ต่ำลงมากกว่า 48,000 ถึง 8,000) ตัวกรอง ความยาวจะปรับให้ตรงกับอัตราส่วนการลดลง แต่ก็ต้องเสียสละมากกว่า การเปลี่ยนแบนด์วิดท์ในอัตราส่วนการสุ่มเสียงสูงขึ้นเพื่อหลีกเลี่ยงมากเกินไป การเพิ่มความยาวฟิลเตอร์ ไม่มีข้อกังวลเกี่ยวกับชื่อแทนที่คล้ายกันสำหรับ การเพิ่มความละเอียด โปรดทราบว่าบางส่วนของไปป์ไลน์เสียง อาจป้องกันการสุ่มตัวอย่างที่มากกว่า 2:1
หากคุณกังวลเกี่ยวกับเวลาในการตอบสนอง อย่าสุ่มตัวอย่างซ้ำ
การสุ่มตัวอย่างใหม่จะป้องกันไม่ให้แทร็กถูกวางใน FastMixer ซึ่งหมายความว่าเวลาในการตอบสนองจะสูงขึ้นอย่างมากเนื่องจาก บัฟเฟอร์ที่ใหญ่กว่าในเส้นทาง Mixer ปกติ นอกจากนี้ เกิดความล่าช้าโดยนัยจากความยาวของตัวกรอง ของเครื่องมือสุ่มตัวอย่าง แต่โดยทั่วไป จะเรียงลำดับตาม 1 มิลลิวินาทีหรือน้อยกว่า ซึ่งไม่ได้มีขนาดใหญ่เท่ากับการบัฟเฟอร์เพิ่มเติมสำหรับเส้นทางเครื่องผสมแบบธรรมดา (โดยปกติคือ 20 มิลลิวินาที)
การใช้จุดลอยตัว
การใช้จำนวนลอยตัวเพื่อแสดงข้อมูลเสียงจะช่วยเพิ่มคุณภาพของเสียงได้อย่างมาก คุณภาพในแอปพลิเคชันเสียงประสิทธิภาพสูง จุดลอยตัวมีสิ่งต่อไปนี้ ข้อดี:
- ช่วงไดนามิกกว้างขึ้น
- ความแม่นยำสม่ำเสมอในช่วงไดนามิก
- ช่องว่างที่มากขึ้นเพื่อหลีกเลี่ยงการตัดให้สั้นลงระหว่างการคำนวณช่วงกลางและชั่วคราว
แม้ว่าจุดลอยตัวจะช่วยเพิ่มคุณภาพเสียงได้ แต่ก็มีข้อเสียบางอย่างดังนี้
- ตัวเลขที่เป็นจุดลอยตัวจะใช้หน่วยความจำมากกว่า
- การดำเนินการจุดลอยตัวจะใช้คุณสมบัติที่ไม่คาดคิด ตัวอย่างเช่น การบวก ไม่ได้เชื่อมโยงกัน
- การคำนวณจุดลอยตัวอาจสูญเสียความแม่นยำทางคณิตศาสตร์เนื่องจากการปัดเศษหรือ ของอัลกอริทึมที่ไม่เสถียร
- การใช้จุดทศนิยมอย่างมีประสิทธิภาพจำเป็นต้องมีความเข้าใจที่มากขึ้น เพื่อให้ได้ข้อมูลที่แม่นยํา และผลลัพธ์ที่ทำซ้ำได้
ก่อนหน้านี้ จุดลอยตัวเป็นที่รู้จักกันดีว่าใช้งานไม่ได้หรือทำงานช้า นี่คือ ยังคงใช้ได้กับโปรเซสเซอร์ระดับโลว์เอนด์และแบบฝัง แต่โปรเซสเซอร์ที่ทันสมัย ตอนนี้อุปกรณ์เคลื่อนที่มีจุดลอยตัวของฮาร์ดแวร์ ซึ่งมีประสิทธิภาพคือ คล้ายกัน (หรือในบางกรณีอาจเร็วกว่านั้นด้วยซ้ำ) จำนวนเต็ม CPU รุ่นใหม่ๆ ยังรองรับ SIMD (คำสั่งเดียว หลายข้อมูล) ซึ่งสามารถปรับปรุงประสิทธิภาพให้ดีขึ้นได้
แนวทางปฏิบัติแนะนำสำหรับเสียงแบบลอย
แนวทางปฏิบัติแนะนำต่อไปนี้จะช่วยให้คุณหลีกเลี่ยงปัญหาในการคํานวณจุดลอยตัวได้
- ใช้จุดทศนิยมแบบสองจุดสำหรับการคำนวณที่เกิดขึ้นไม่บ่อยนัก เช่น ค่าสัมประสิทธิ์ตัวกรองของการประมวลผล
- ตรวจสอบลำดับการดำเนินการ
- ประกาศตัวแปรที่ชัดแจ้งสำหรับค่ากลาง
- ใช้วงเล็บอย่างอิสระ
- หากคุณได้รับผลการค้นหา NaN หรือค่าอนันต์ ให้ใช้การค้นหาไบนารีเพื่อค้นหา ที่ได้เปิดตัวไป
สำหรับเสียงแบบจุดลอยตัว การเข้ารหัสรูปแบบเสียง
AudioFormat.ENCODING_PCM_FLOAT
ถูกใช้ในลักษณะเดียวกับ
ENCODING_PCM_16_BIT
หรือ ENCODING_PCM_8_BIT
สำหรับการระบุ
ข้อมูล AudioTrack
รูปแบบ เมธอด AudioTrack.write()
ที่เกี่ยวข้องกับงานโอเวอร์โหลดที่เกี่ยวข้อง
จะใช้อาร์เรย์ลอยตัวในการส่งข้อมูล
Kotlin
fun write( audioData: FloatArray, offsetInFloats: Int, sizeInFloats: Int, writeMode: Int ): Int
Java
public int write(float[] audioData, int offsetInFloats, int sizeInFloats, int writeMode)
สำหรับข้อมูลเพิ่มเติม
ส่วนนี้จะแสดงแหล่งข้อมูลเพิ่มเติมเกี่ยวกับการสุ่มตัวอย่างและจุดลอยตัว
ทดสอบผลิตภัณฑ์
อัตราการสุ่มตัวอย่าง
- การสุ่มตัวอย่าง (การประมวลผลสัญญาณ) จาก Wikipedia
การสุ่มตัวอย่างซ้ำ
- การแปลงอัตราตัวอย่างจาก Wikipedia
- อัตราการสุ่มตัวอย่าง Conversion ที่ source.android.com
ประเด็นที่ถกเถียงกันเกี่ยวกับความลึกบิตสูงและ kHz ที่สูง
- D/A และ A/D | รายการดิจิทัลที่บอกกับผู้ชม วิดีโอโดย Christopher "Monty" มอนต์โกเมอรีแห่ง Xiph.Org
- วิทยาศาสตร์ของอัตราการสุ่มตัวอย่าง (เมื่อยิ่งดีกว่า ยิ่งดี - แล้วยิ่งไม่ได้)
- ความเชื่อผิดๆ เกี่ยวกับเสียงและ สงคราม DAW
- 192kHz/24bit กับ "debate" 96kHz/24bit - การเปิดเผยที่น่าสนใจ
จุดลอยตัว
หน้า Wikipedia ต่อไปนี้มีประโยชน์ในการทำความเข้าใจเสียงที่มีจุดลอยตัว
- ความลึกของบิตเสียง
- เลขคณิตของจุดลอย
- จุดลอยตัว IEEE 754
- การไม่สําคัญ (การยกเลิกที่ร้ายแรง)
- ความเสถียรของตัวเลข
บทความต่อไปนี้ให้ข้อมูลเกี่ยวกับแง่มุมต่างๆ ของจุดลอยตัวที่มี ผลกระทบโดยตรงต่อผู้ออกแบบระบบคอมพิวเตอร์:
- สิ่งที่ นักวิทยาการคอมพิวเตอร์ควรรู้เรื่องเลขคณิตแบบจุดลอยตัว โดย David Goldberg, Xerox PARC (ฉบับพิมพ์ซ้ำ)