การสุ่มตัวอย่างเสียง

สำหรับ 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)

สำหรับข้อมูลเพิ่มเติม

ส่วนนี้จะแสดงแหล่งข้อมูลเพิ่มเติมเกี่ยวกับการสุ่มตัวอย่างและจุดลอยตัว

ทดสอบผลิตภัณฑ์

อัตราการสุ่มตัวอย่าง

การสุ่มตัวอย่างซ้ำ

ประเด็นที่ถกเถียงกันเกี่ยวกับความลึกบิตสูงและ kHz ที่สูง

จุดลอยตัว

หน้า Wikipedia ต่อไปนี้มีประโยชน์ในการทำความเข้าใจเสียงที่มีจุดลอยตัว

บทความต่อไปนี้ให้ข้อมูลเกี่ยวกับแง่มุมต่างๆ ของจุดลอยตัวที่มี ผลกระทบโดยตรงต่อผู้ออกแบบระบบคอมพิวเตอร์: