ไมโครโฟนแบบ Phased Array (2023)
(benwang.dev)- ไมโครโฟนแบบ phased array 192 แชนเนลสามารถเปลี่ยนทิศทางการรับเสียงได้แม้หลังบันทึกแล้ว หรือโฟกัสพร้อมกันได้ที่จุดนับแสน ทำให้ระบุตำแหน่งแหล่งกำเนิดเสียงและแสดงผลเป็นภาพได้ ซึ่งไมโครโฟนแบบมีทิศทางทั่วไปทำได้ยาก
- ฮาร์ดแวร์ประกอบด้วยแขนไมโครโฟนแบบรัศมีและฮับกลาง ใช้ไมโครโฟน MEMS 192 ตัว, การ์ด FPGA Colorlight i5 และโครงสร้างส่งข้อมูลผ่าน Gigabit Ethernet ด้วยต้นทุนประมาณ $700
- FPGA เน้น การส่งข้อมูล PDM ดิบ มากกว่าการประมวลผลล่วงหน้าที่ซับซ้อน โดยประมวลผลอินพุต 3.125MHz และใช้แบนด์วิดท์ Gigabit Ethernet ประมาณ 70% ที่ราว 715Mbps
- ซอฟต์แวร์ผสาน CIC filter, การปรับเทียบด้วย FFT, การปรับแต่งให้เหมาะกับ GPU และ beamforming ด้วย Triton เพื่อ แสดงภาพแบบเรียลไทม์ ของตำแหน่งแหล่งกำเนิดเสียงทั้งระยะใกล้แบบ 3D และระยะไกลแบบ 2D
- แพ็กเก็ต UDP สามารถจับด้วย
tcpdumpแล้วนำมาเล่นซ้ำได้ แต่การจัดเก็บข้อมูลดิบมีอัตราสูงถึง 87.5MB/s ทำให้การบันทึก 1 ชั่วโมงต้องใช้พื้นที่ 315GB
การประกอบไมโครโฟน phased array 192 แชนเนล
- ผสาน ไมโครโฟนแบบ phased array 192 แชนเนล เข้ากับการเก็บข้อมูลด้วย FPGA และการทำ beamforming/visualization บน GPU
- ต่างจากไมโครโฟนแบบมีทิศทางทั่วไป phased array สามารถเปลี่ยนทิศทางการรับเสียงได้แม้หลังบันทึกแล้ว และสามารถโฟกัสพร้อมกันที่จุดนับแสนแบบเรียลไทม์ได้
- งานออกแบบทั้งหมดเผยแพร่เป็น โอเพนซอร์ส
การออกแบบฮาร์ดแวร์
-
โครงสร้างอาร์เรย์และต้นทุน
- สร้าง phased array โดยวางไมโครโฟนจำนวนมากด้วยการกระจายระยะห่างที่กว้าง
- ในอาร์เรย์เชิงเส้น เป็นที่ทราบกันว่า ระยะห่างแบบเลขชี้กำลัง ระหว่างไมโครโฟนเหมาะสมที่สุดสำหรับสัญญาณแถบกว้าง
- อาร์เรย์ 2D จัดวางแขนอาร์เรย์เชิงเส้นแบบสมมาตรเป็นแนวรัศมี เพื่อให้บอร์ดฮับกลางมีขนาดเล็ก
- ต้นทุนอาร์เรย์ทั้งหมดประมาณ $700
-
บอร์ดแขน
- ความยาวของแต่ละแขนถูกกำหนดให้สอดคล้องกับข้อจำกัดด้านการผลิตและประกอบ PCB โดยความยาวสูงสุดสำหรับการผลิต/ประกอบ PCB 4 ชั้นของ JLCPCB คือ 570mm
- ใช้ไมโครโฟน MEMS เอาต์พุตดิจิทัลราคาถูก ราคาประมาณ $0.5 ต่อตัว
- ในช่วงราคานี้ ประสิทธิภาพระหว่างไมโครโฟนไม่แตกต่างกันมาก
- ส่วนใหญ่ให้ประสิทธิภาพใช้ได้ถึง 10kHz แต่ไม่ได้ระบุ phase delay และการแมตช์ระดับเสียง
- ไมโครโฟนส่งข้อมูลด้วยรูปแบบ PDM(pulse density modulation)
- ให้เอาต์พุต 1 บิตที่ความถี่สูงสุด 4MHz ซึ่งสูงกว่าช่วงที่ได้ยินมาก
- ชดเชย quantization noise ด้วยอัตราสุ่มตัวอย่างที่สูง
- รองรับ DDR ที่ latch ข้อมูลบนขอบขาขึ้นและขาลงของสัญญาณนาฬิกา จึง multiplex ไมโครโฟนสองตัวบนสายเดียวได้
- แต่ละแขนมีไมโครโฟน 8 ตัวและสายเอาต์พุต 4 เส้น โดยมี output buffer บนสายอินพุต clock
- ออกแบบให้ rise time ยังอยู่ในระดับสมเหตุสมผล แม้ไมโครโฟนหลายร้อยตัวใช้สัญญาณ clock เดียวกัน
- yield ของ PCB แขนไม่ดีนัก และบอร์ดที่ทำงานได้ตั้งแต่ต้นมีประมาณ 50%
- ความเสียหายที่พบบ่อยที่สุดคือสาย clock ลัดวงจรไปยัง 3V3 หรือ GND
- การแก้ short ต้องทดลองถอดไมโครโฟนทีละตัว
- ไมโครโฟนบางตัวยังส่งข้อมูลผิดหลัง rework แล้ว และโค้ดจะ mask ไมโครโฟนเหล่านั้นออก
- ในการออกแบบถัดไป สามารถลดงาน rework ได้ด้วยตัวต้านทานอนุกรมบนสาย clock, การปรับปรุง panelization และการปรับปรุง solder paste stencil
-
บอร์ดฮับ
- การเก็บข้อมูลใช้ FPGA ซึ่งต้องการ I/O latency ต่ำจำนวนมากและอินเทอร์เฟซความเร็วสูงอย่าง Gigabit Ethernet
- เลือกใช้การ์ด Colorlight i5
- เหตุผลคือมี I/O เพียงพอ ราคาต่ำ หาได้ง่าย และมี Ethernet PHY ในตัว 2 ตัว
- ในโปรเจกต์นี้ใช้ Ethernet PHY เพียงตัวเดียว
- เดิมการ์ดนี้เป็นอินเทอร์เฟซ Ethernet สำหรับแผง LED แต่ถูก reverse engineer อย่างสมบูรณ์ แล้ว
- GPIO ประมาณ 100 ขาถูกนำออกมาผ่านคอนเนกเตอร์ DDR2 ทำให้ fan-out ง่ายกว่า BGA ของ FPGA เดิม
- นอกจาก FPGA แล้ว ฮับยังมีวงจรจัดการพลังงานแบบง่าย คอนเนกเตอร์สำหรับบอร์ดแขน และคอนเนกเตอร์ Ethernet ที่มี magnetics ในตัว
-
การออกแบบเชิงกล
- แขนยึดกับฮับด้วย PCB mounting standoff/nut และสกรู M3
- การเชื่อมต่อระหว่างแขนกับฮับทำผ่าน คอนเนกเตอร์ 8 พิน pitch 2mm
- แบบแรกใช้สล็อตบน PCB แขนเข้ากับ PCB โครงสร้างตามแนวเส้นรอบวง แต่แขนมีความแข็งต่อการบิดต่ำ ทำให้โครงสร้างทั้งหมดเสียรูปได้ง่าย
- แบบสุดท้ายวางชิ้น MDF หนา 1/4 นิ้ว ที่ตัดด้วยเลเซอร์ไว้รอบนอกอาร์เรย์ แล้วรัดแขนแต่ละข้างกับ MDF ด้วย cable tie
- อาร์เรย์ไมโครโฟนติดตั้งบนผนังจึงไวต่อเสียงสะท้อน จึงลดเสียงสะท้อนด้วย โฟมดูดซับเสียง เพื่อให้ปรับเทียบได้ง่ายขึ้น
FPGA gateware
-
เป้าหมายการออกแบบ
- เป้าหมายหลักของ gateware คือส่งข้อมูลดิบที่เก็บได้ไปยังคอมพิวเตอร์อย่างเสถียรโดยไม่สูญหาย
- หากทำ decimation และ filtering บน FPGA จะลดอัตราข้อมูลได้ แต่ข้อมูล PDM ดิบ ก็สามารถส่งผ่าน Gigabit Ethernet ได้เช่นกัน
- การส่งข้อมูลดิบช่วยลดความซับซ้อนของโค้ด FPGA และทำให้พัฒนาแบบวนซ้ำได้เร็วขึ้น
- การคอมไพล์โค้ดเร็วกว่า place-and-route และการใช้ debugger ในโค้ดทั่วไปก็ง่ายกว่าการดีบัก gateware
-
อินเทอร์เฟซ PDM
- โมดูลอินพุต PDM แบ่ง system clock 50MHz ด้วย 16 แล้วส่งออกเป็น PDM clock 3.125MHz
- หลังแต่ละขอบ clock จะ latch ขาอินพุต 96 ขา และ shift ข้อมูล 32 บิตในแต่ละ clock cycle
- เพิ่ม header เป็นจำนวนเต็ม 32 บิตที่เพิ่มขึ้นให้กับข้อมูลแต่ละ chunk ขนาด 192 บิต
- อัตราข้อมูลอินพุตของอินเทอร์เฟซ PDM คือ 3.125MHz × ขาอินพุต 96 ขา × DDR 2 = 600Mbps
- อัตราข้อมูลเอาต์พุตรวม header คือ 700Mbps และ utilization ของ data path เอาต์พุต 32 บิตอยู่ที่ประมาณ 40%
-
การทำ packetization และส่งผ่าน UDP
- โมดูล packetization คล้าย FIFO buffer ที่มีอินเทอร์เฟซอินพุตแบบพิเศษ
- เนื่องจากอินเทอร์เฟซ Ethernet เร็วกว่าเอาต์พุต PDM หากทำเหมือน FIFO มาตรฐาน แค่มี item เดียวก็อาจส่งออกจนเกิดแพ็กเก็ตที่เล็กกว่าที่ต้องการ
- โมดูล packetization จะรอจนกว่าข้อมูลครบหนึ่งแพ็กเก็ตสะสมในคิวแล้วค่อยเริ่มส่ง เพื่อรับประกัน แพ็กเก็ตขนาดคงที่
- แต่ละแพ็กเก็ตมีบล็อกเอาต์พุต PDM ขนาด 224 บิตจำนวน 48 บล็อก
- หนึ่งบล็อกประกอบด้วยข้อมูล 192 บิตและ header 32 บิต
- ข้อมูลต่อแพ็กเก็ตคือ 1344 ไบต์
- เพิ่ม IPv4 header 20 ไบต์และ UDP header 8 ไบต์
- อัตราแพ็กเก็ตประมาณ 65kpps ส่งผลให้ line rate เป็น 715Mbps และ utilization ของ Gigabit Ethernet ประมาณ 70%
- ใช้ LiteEth สำหรับ UDP streaming
- abstractions ความซับซ้อนระดับล่าง เช่น UDP/IP encapsulation และ ARP table
- มีอินเทอร์เฟซที่เชื่อม FIFO กับ UDP stream ได้ง่าย
- latency เป็นครั้งคราวถูกดูดซับด้วย buffer headroom ของ packetization FIFO
-
การใช้ทรัพยากร FPGA
- FPGA ของ Colorlight i5 คือ
LFE5U-25F-6BG381Cและมี 25k LUT - ออกแบบและ route ด้วยโอเพนซอร์ส toolchain Project Trellis
- ด้วยการรักษา gateware ให้เรียบง่าย การใช้ทรัพยากรจึงต่ำ และเหลือพื้นที่มากสำหรับเพิ่มฟีเจอร์
- DP16KD: 16/56, 28%
- TRELLIS_FF: 1950/24288, 8%
- TRELLIS_COMB: 3701/24288, 15%
- maximum clock ผ่านที่ 73.17MHz จากเป้าหมาย 50MHz
- คำเตือน timing ของ Ethernet RX clock เป็น false positive ที่เกี่ยวข้องกับ gray counter ของ LiteEth
- FPGA ของ Colorlight i5 คือ
Pipeline การประมวลผลซอฟต์แวร์
-
CIC filter
- ไมโครโฟนแต่ละตัวส่งออก สัญญาณ 1 บิต 3.125MHz และต้องลดลงเป็นอัตราสุ่มตัวอย่างและ bit depth ที่ต่ำลงเพื่อการประมวลผลถัดไป
- งานนี้ใช้ CIC filter ที่ใช้การคำนวณทางเลขคณิตน้อย
- อ้างอิงซีรีส์ Moving Average and CIC Filters ของ Tom Verbeure
- ตัวเลือกสุดท้ายคือ CIC filter 4 stage, decimation 16 เท่า
- ลดอัตราสุ่มตัวอย่างลงเหลือ 195kHz
- เอาต์พุตเป็น 32 บิต
- เพื่อรับข้อมูล 3.125MHz ต้องประมวลผลหนึ่งชุดตัวอย่างภายใน 320ns
- การ implement ด้วย Rust แบบง่ายยังไม่เร็วพอใน single core จึงใช้ implementation สุดท้ายที่ลด abstraction เพื่อชักนำ auto-vectorization ได้ดีขึ้น
- implementation ด้วย SIMD intrinsic เร็วกว่ามาก แต่เจอปัญหา alignment เมื่อใช้ร่วมกับโค้ดอื่น
- ผล benchmark:
bench_cic: 574ns/iter, 41MB/sbench_fast_cic: 181ns/iter, 132MB/sbench_simd_cic: 36ns/iter, 666MB/s
-
การปรับเทียบ
- การปรับเทียบอาร์เรย์ทำโดยเปิด white noise จากลำโพง แล้วขยับลำโพงไปมาในห้องด้านหน้าอาร์เรย์
- คำนวณ cross-correlation ด้วย FFT ระหว่างไมโครโฟนทุกคู่เพื่อหาหน่วงเวลาสัมพัทธ์
- มีคู่ไมโครโฟนมากกว่า 18,000 คู่ จึงใช้การคำนวณมาก
- สำหรับ window size 16k~64k FFT ถูกจำกัดด้วยหน่วยความจำ จึงรวม IFFT กับการค้นหา peak เพื่อไม่ต้องเขียนผลลัพธ์ลงหน่วยความจำ และได้ ความเร็วเพิ่มขึ้น 15 เท่า
- บน Ryzen 7950X กระบวนการนี้ทำงานแบบเรียลไทม์
- จากนั้นปรับตำแหน่งแหล่งเสียงในแต่ละช่วงเวลาและตำแหน่งไมโครโฟนแต่ละตัวด้วย gradient descent
- loss function ลดความต่างระหว่าง correlation ที่วัดได้กับ correlation อุดมคติ
- ป้องกันไม่ให้ตำแหน่งไมโครโฟนเบี่ยงออกจากตำแหน่งเริ่มต้นมากเกินไป
- ลด jerk ของ trajectory แหล่งเสียงด้วย
- ในกระบวนการปรับเทียบ ความเร็วเสียงถูกใส่เป็นพารามิเตอร์สำหรับ optimization ด้วย ทำให้กระบวนการทั้งหมดทำงานเหมือน เทอร์โมมิเตอร์ ที่ซับซ้อนเกินไป
- หลังทำซ้ำหลายร้อยรอบ ค่าคงที่อย่างตำแหน่งแหล่งเสียง ตำแหน่งไมโครโฟน และความเร็วเสียงจะ converge ไปยังคำตอบที่สมเหตุสมผล
- ปัญหานี้ vectorize บน GPU ได้ดี จึง converge ภายในไม่กี่วินาที
- ค่าเฉลี่ยความคลาดเคลื่อนตำแหน่งสุดท้ายอยู่ที่ประมาณ 1mm
- ยังปรับแก้ความบิดเบี้ยวเชิงระบบขนาดใหญ่ เช่น ความเว้าที่เกิดจากโครงสร้างแข็งแรงไม่พอ
- ความคลาดเคลื่อนสูงสุดระหว่างตำแหน่งออกแบบกับตำแหน่งหลังปรับเทียบอยู่ที่ประมาณ 5mm
- ความยาวคลื่นของเสียง 10kHz ประมาณ 3.4cm ดังนั้นหากไม่ปรับเทียบ อาจเกิด phase error ที่มีนัยสำคัญในย่านความถี่สูง
Beamforming และ visualization
-
วิธี beamforming
- Beamforming คือกระบวนการประมวลผลอินพุตไมโครโฟนดิบเพื่อสร้าง การตอบสนองแบบมีทิศทาง
- วิธีที่ implement คือแบบง่ายที่สุด delay-and-sum หรือ DAS
- หน่วงสัญญาณแต่ละตัวตามความต่างของระยะทางถึงแหล่งเสียง แล้วรวมกัน
- ในโปรเจกต์นี้ทำ beamforming ในโดเมนความถี่
- ในโดเมนความถี่ การหน่วงทำด้วยพจน์ phase เชิงเส้นที่แปรตาม delay ที่ต้องการ และการคูณเชิงซ้อนกับสัญญาณ
- จัดการ delay ที่ไม่ใช่จำนวนเต็มเท่าของคาบ sampling ได้อย่างเป็นธรรมชาติ
- ใช้ subarray ซ้อนทับหลายชุดของอาร์เรย์เดิมตามช่วงความถี่
- ไม่จำเป็นต้องทำ beamforming ด้วยไมโครโฟนทุกตัวในทุกความถี่ จึงลดปริมาณงาน และยังช่วยปรับ beamforming gain ของทุกความถี่ให้สอดคล้องกัน
-
การ implement บน GPU ด้วย Triton
- Beamformer ถูก implement เป็น kernel ของ Triton
- Triton คือ Python DSL ที่คอมไพล์ให้ทำงานบน Nvidia GPU
- เมื่อต้อง beamforming จุดนับแสน การขนานขนาดใหญ่ของ GPU ทำให้ได้ ผลลัพธ์แบบเรียลไทม์
- เนื่องจาก ข้อจำกัดปัจจุบัน ด้านการรองรับ shared memory array indexing ในภาษา Triton ประสิทธิภาพจึงยังไม่ optimal เล็กน้อย แต่ไม่ได้เลือกเขียน CUDA C++
-
Beamforming 3D ระยะใกล้
- Beamforming 3D ระยะใกล้ทำบน voxel grid 5cm
- ขนาด grid คือ 64×64×64
- บน RTX 4090 ได้อัตราอัปเดต 12Hz
- ความเร็วที่สูงกว่านี้ถูกจำกัดโดย overhead ที่ CPU-GPU synchronization ยังไม่เหมาะสมสำหรับหน่วยงานขนาดเล็ก
- Voxel grid แสดงผลด้วย VisPy ไลบรารี visualization ประสิทธิภาพสูงบน OpenGL
- การ render voxel โปร่งแสง 250,000 จุดไม่เป็นปัญหาสำหรับ framerate แบบ interactive เมื่อเทียบกับจำนวน polygon ในเกมสมัยใหม่
-
Beamforming 2D ระยะไกล
- แหล่งเสียงระยะไกลมี wavefront เกือบเป็นระนาบ ดังนั้นระยะห่างของแหล่งเสียงแทบไม่เปลี่ยนสัญญาณอาร์เรย์อย่างมีนัยสำคัญ
- แหล่งเสียงใกล้มีความโค้งของ wavefront มาก จึงสามารถกำหนด ตำแหน่ง 3D ได้
- Beamforming ระยะไกลไม่มีมิติความลึก จึงทำได้ที่ความละเอียดสูงกว่า
- ใช้ grid 512×512 pixel และได้อัตราอัปเดต 12Hz เช่นกัน
- Beamforming ระยะไกลใช้การประมาณโดยวางจุดไว้ไกล แทนสมมติฐาน plane wave จริง
- เนื่องจากในห้องมีการสะท้อนและ multipath มาก demo visualization 2D จึงได้รับผลกระทบจากสภาพแวดล้อมทางเสียง
-
เสียงแบบมีทิศทาง
- beamforming สองแบบก่อนหน้าคำนวณพลังงานเสียงในแต่ละตำแหน่ง แต่ไม่ได้สร้างเสียงที่ผ่าน beamforming ไว้ในหน่วยความจำ
- สำหรับการบันทึกเสียงแบบมีทิศทาง จึง implement time-domain delay-and-sum beamformer
- รับพิกัด 3D เทียบกับศูนย์กลางอาร์เรย์เป็นอินพุต
- ส่งออก audio sample
- Beamformer นี้ทำให้ตำแหน่ง differentiable เทียบกับเอาต์พุตได้
- สามารถ optimize ตำแหน่งแหล่งเสียงด้วย loss function ที่ differentiable ได้
- อาจประยุกต์ใช้ forced alignment model ในการถอดเสียงหลายคนเพื่อหาตำแหน่งทางกายภาพของผู้พูดแต่ละคนได้
- เปรียบเทียบผลโดยให้ลำโพงหนึ่งตัวเล่นเสียงหน้าอาร์เรย์ และลำโพงอีกตัวเล่น white noise ที่ระยะเท่ากันแต่ทำมุมประมาณ 45 องศาจากศูนย์กลางอาร์เรย์
- แสดงผล beamforming โดยเปรียบเทียบ raw audio จากไมโครโฟนเดี่ยวกับ audio หลัง beamforming
วิธีบันทึกและข้อจำกัด
- ข้อมูลอาร์เรย์ไมโครโฟนเป็นแพ็กเก็ต UDP จึงบันทึกได้ด้วยเครื่องมืออย่าง
tcpdump - สามารถอ่านไฟล์ packet capture แล้ว inject แพ็กเก็ตกลับเข้า listener ได้
- โปรแกรมก่อนหน้าถูกออกแบบให้ทำงานแบบเรียลไทม์ แต่ก็ทำงานกับข้อมูลบันทึกด้วยวิธีนี้ได้
- ข้อเสียคือบันทึกข้อมูลดิบตรง ๆ ทำให้อัตราข้อมูลเอาต์พุตสูงมาก
- เก็บ quantization noise ไว้อย่างครบถ้วนด้วย
- อัตราข้อมูลคือ 87.5MB/s
- การบันทึก 1 ชั่วโมงต้องใช้ 315GB
- implementation ที่ปรับให้เหมาะสมกว่านี้สามารถใช้การบีบอัด หรือบันทึกที่อัตราสุ่มตัวอย่างต่ำลงหลังผ่าน CIC filter ได้
แนวทางต่อยอดที่เป็นไปได้
- โปรเจกต์โดยหลักถือว่าเสร็จสมบูรณ์แล้ว และไม่มีแผนทำงานเพิ่มในอนาคตอันใกล้
- อย่างไรก็ตาม ยังมีพื้นที่ให้ต่อยอดสำหรับผู้ที่อยากสร้างเอง
- ใช้อัลกอริทึม beamforming ขั้นสูงกว่า เช่น DAMAS
- GUI ที่ดีขึ้นโดยผสานฟีเจอร์เดิม เช่น ดูว่าเสียงมาจากไหนแล้วบันทึกเสียงจากตำแหน่งนั้น
- ผสาน differentiable beamforming กับโมเดลโครงข่ายประสาท เช่น การประยุกต์แบบตัวอย่าง forced alignment ก็เป็นไปได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
น่าสนใจที่ในกระบวนการปรับเทียบ ความเร็วเสียง ก็เป็นพารามิเตอร์ที่ถูกปรับให้เหมาะสมเพื่อให้ได้โมเดลที่ดีที่สุดของระบบ ทำให้ขั้นตอนทั้งหมดทำงานเหมือนเทอร์โมมิเตอร์ที่ออกแบบมาเวอร์เกินเหตุอย่างเหลือเชื่อ
ทำให้นึกถึงสุภาษิตในวงการอิเล็กทรอนิกส์ที่ว่า “เซนเซอร์ทุกตัวคือเซนเซอร์วัดอุณหภูมิ และบางตัวก็วัดอย่างอื่นด้วย”
ปรากฏว่าวิธีนั้นยังใช้วัดอุณหภูมิได้ด้วย และสามารถ extrapolate กราฟเพื่อหาอุณหภูมิศูนย์สัมบูรณ์ได้
เท่าที่จำได้ ผลคลาดเคลื่อนไปประมาณ 20K ซึ่งสำหรับโปรเจกต์ในโรงรถของเด็กมัธยมแล้ว ผมว่าก็ยอดเยี่ยมทีเดียว
ตัวอย่างที่ผมชอบเป็นพิเศษคือ หน่วยวัดความเฉื่อย (IMU) ที่แม่นยำพอสามารถใช้เอฟเฟกต์คอริออลิสเพื่อวัดลองจิจูดได้ค่อนข้างแม่นยำด้วย
https://youtu.be/zsA3X40nz9w?si=oGg2wdUlLXSDxpsN
เมื่อก่อนเคยทำโปรเจกต์ระบุตำแหน่งค้างคาวแบบ multilateration ด้วย อาร์เรย์ไมโครโฟน 4 ตัว ที่วางบนพื้นเป็นรูปตัว Y ขนาดใหญ่
ใช้ความต่างของเวลาที่เสียงเดินทางมาถึงไมโครโฟนทั้งสี่ตัว เพื่อหาตำแหน่งของค้างคาวแต่ละตัวที่บินผ่านเหนืออาร์เรย์ และยังระบุชนิดได้ด้วย
งานนี้ถูกใช้ในการวิจัยเพื่อประเมินผลกระทบต่อสิ่งแวดล้อมจากการติดตั้งกังหันลม และสนุกมากทีเดียว
เป็นอุปกรณ์ที่พัฒนาขึ้นเพื่อติดตามและฆ่ายุงด้วยพัลส์เลเซอร์สั้น ๆ
เพราะต้องจับตำแหน่งของยุงในอวกาศอย่างแม่นยำ ผลพลอยได้คือสามารถตรวจจับความแตกต่างของความถี่การกระพือปีก เพื่อแยกเป้าหมายตามเพศและชนิดได้
แน่นอนว่าทักษะฮาร์ดแวร์และซอฟต์แวร์ยังไม่พอ เลย implement อัลกอริทึม TDOA ในรูปแบบที่ซื่อที่สุด และวิธีประมาณความต่างเวลาด้วย cross-correlation ก็ไร้ประสิทธิภาพมาก
แต่ก็ได้เรียนรู้เยอะ และท้ายที่สุดนำไปสู่ปริญญาเอกด้าน ระบบ SAR
ผมมองว่า SAR จริง ๆ แล้วใกล้เคียงกับ beamformer ที่ใช้การเคลื่อนที่ของแพลตฟอร์มแทนอาร์เรย์
เคยได้ยินว่าปอดของค้างคาวไวมาก จนถ้าบินผ่าน ความต่างของความดัน ของกังหันขนาดใหญ่ เส้นเลือดฝอยจะแตกได้จริง ๆ
ถ้ามีแหล่งข้อมูลอ้างอิงว่าควรเริ่มจากตรงไหนก็คงดี
พวกเขาวางอาร์เรย์ไมโครโฟนไว้ใต้แมงป่อง และแสดงให้เห็นว่าค้างคาวขยับลำแสงอัลตราซาวด์เพื่อสแกนแมงป่องอย่างไร
เป็นผลลัพธ์ที่น่าทึ่งจริง ๆ [0]
[0]: https://www.youtube.com/watch?v=57ScSPWhGqU
สงสัยว่าทำไมถึงใช้ PDM แทนที่จะใช้ ไมโครโฟน I2S แบบ TDM ในอาร์เรย์
ICS-52000 ค่อนข้างถูก อยู่ที่ระดับ 2 ดอลลาร์เมื่อซื้อ 100 ตัว และเท่าที่เข้าใจมีบอร์ด breakout ที่มีไมโครโฟน 4 ตัว รวมถึงสามารถต่อแบบ chain ได้ถึง 8 หรือ 16 ตัว
https://www.cdiweb.com/datasheets/notwired/ds-nw-aud-ics5200...
ถ้าใช้ Jetson หรือฮาร์ดแวร์ที่มี DSP/GPU และรองรับ I2S ก็สามารถต่อไมโครโฟนแบบ chain ได้ 16 ตัวต่อพอร์ต I2S หนึ่งพอร์ต ดูเหมือนจะประกอบและเขียนโปรแกรมง่ายกว่าการจัดชุด FPGA มาก
ถ้ามีไมโครโฟน 192 ตัว ความต่างระหว่าง 2 ดอลลาร์/ตัวกับ 0.5 ดอลลาร์/ตัวจะค่อนข้างมาก
ต่อให้ทำ daisy chain 16 ตัว ก็ยังหาอุปกรณ์ที่มีอินเทอร์เฟซ I2S เพียงพอได้ยาก และอุปกรณ์ส่วนใหญ่ก็ไม่ได้มีมากพอตามจำนวนที่ต้องใช้
FPGA กับฮาร์ดแวร์สั่งทำเองก็เป็นส่วนหนึ่งของความสนุกด้วย
ถ้าต้องการฟังเสียงฟู่ของก๊าซรั่วหรือการปล่อยโคโรนาของอาร์กไฟฟ้า ความถี่ที่สูงกว่า จะมีประโยชน์
ภายใน Orin มีพอร์ต I2S 6 พอร์ต ดังนั้นดูเหมือนว่าจะรองรับไมโครโฟนได้ถึง 16*6 = 96 ตัว ซึ่งเป็นตัวเลขที่ค่อนข้างดี
แต่ในทางปฏิบัติดูเหมือนมีเพียง 3 พอร์ตที่ถูกนำออกมานอกบอร์ด และอยู่บนคอนเน็กเตอร์ของบอร์ดพัฒนาคนละตัวกัน [1]
ในงานออกแบบ รายละเอียดมักเป็นปัญหาเสมอ ดังนั้นถ้าต้องการมากกว่า 96 ตัว FPGA อาจจัดโครงสร้างได้ง่ายกว่า
ชิ้นส่วนที่ผมจดไว้คือ ICS-52000 $3.50 20kHz, ICS-41350 $1.05 40kHz, SPH0641LU4H-1 $1.45 80kHz+
[1] https://docs.nvidia.com/jetson/archives/r34.1/DeveloperGuide...
เหตุผลที่ I2S ไม่ใช่ตัวเลือกที่ดีที่สุดมีอยู่ราว ๆ สองข้อ
I2S ต้องใช้ 3 พิน แทนที่จะเป็น 2 พินแบบ PDM
แต่ถ้าสามารถทำ daisy chain ไมโครโฟนได้เหมือนใน datasheet ที่ให้มา ก็ถือว่าเจ๋งมาก และถึงจะไม่ใช่ I2S มาตรฐาน ประเด็นนี้ก็หมดไป
PDM เข้าถึงอัตราการสุ่มตัวอย่างที่สูงกว่ามากได้ จึงมีความยืดหยุ่นมากขึ้นในการเลือก delay สำหรับการคำนวณแบบ delay-and-sum
เช่น ถ้า clock ของ PDM อยู่ที่ 2MHz ตามทฤษฎีจะหน่วงเวลาได้ด้วยความละเอียด 0.5µs
ในทางปฏิบัติคงใช้ความละเอียดต่ำกว่านั้น แต่ clock ของ I2S โดยทั่วไปอยู่ที่สูงสุดราว 192kHz
ไมโครโฟน PDM ยังถูกกว่าด้วย
หากลองค้นหา กล้องเสียง บน YouTube จะพบเดโมที่ค่อนข้างน่าประทับใจซึ่งแสดงให้เห็นประสิทธิภาพ
หนึ่งในบริษัทที่ผมติดตามมาระยะหนึ่งคือที่นี่ และดูเหมือนผู้เล่นรายใหญ่อย่าง FLIR ก็เข้ามาในตลาดนี้ด้วย: https://www.youtube.com/@gfaitechgmbh
กรณีใช้งานที่น่าสนใจแต่ก็น่าขนลุกคือการบันทึกเสียงในพื้นที่สาธารณะไว้ แล้วภายหลังค่อย ‘ซูมเข้า’ ไปที่บทสนทนาระหว่างบุคคลบางคน
หลังจากคุยกับเพื่อนที่ใช้ประสาทหูเทียม ผมคิดว่าถ้ามี การประมวลผลสัญญาณ ที่เหมาะสมประกอบเข้าไป ก็น่าจะช่วยการได้ยินได้มาก
อยากกลับไปเป็นนักศึกษาบัณฑิตศึกษาแล้วลองทำแอปพลิเคชันทางการแพทย์โดยผสานกับ อาร์เรย์ลำโพงอัลตราซาวนด์
โดยพื้นฐานแล้วมันคล้าย HIFU (อัลตราซาวนด์โฟกัสความเข้มสูง) ที่ทรงพลังมากและมีฟีดแบ็กแบบเรียลไทม์
https://en.wikipedia.org/wiki/Focused_ultrasound
ความถี่สูงกว่ามาก จึงต้องคิดที่ประมาณ 1~10MHz ไม่ใช่ 40kHz และวงจรอิเล็กทรอนิกส์ทั่วไปแทบจะใช้ไม่ได้
ถ้าอยากคุย ติดต่อได้ทางอีเมลในโปรไฟล์
คงดีถ้าเทคโนโลยีแบบนี้ถูกบรรจุมาอย่างดีแล้วใส่ลงในอุปกรณ์มือถือหลายชนิด
ผมมองว่าสาเหตุหนึ่งที่ผู้ช่วยดิจิทัลหรือเครื่องแปลภาษาอเนกประสงค์ยังติดขัดอยู่คือ คุณภาพเสียงที่แย่
หากลดสัญญาณรบกวนและตรวจจับทิศทางได้ ก็น่าจะช่วยได้มาก
เช่น อยากแปลบทสนทนากลุ่มรอบโต๊ะอาหารแบบเรียลไทม์
ขั้นแรกคงดีถ้าโทรศัพท์กับหูฟังสามารถรวมไมโครโฟนของแต่ละคนมาใช้เพื่อจุดประสงค์นี้ได้
ยิ่งไปกว่านั้น ถ้าโทรศัพท์ทุกเครื่องที่อยู่ใกล้กันร่วมมือกันเพื่อให้ได้เสียงเชิงทิศทางคุณภาพสูงได้จะเป็นอย่างไร
แน่นอนว่าต้องอยู่บนสมมติฐานว่าสามารถแก้ปัญหาความเป็นส่วนตัวได้
มันอาจเปลี่ยนชีวิตได้
Live Transcribe ของ Android ตอนนี้ดีมากแล้ว แต่ยังไม่แม้แต่จะพยายามแยกว่าคำไหนมาจากผู้พูดคนใด
มันเผยให้เห็นว่าสมองทำการประมวลผลอย่างมหาศาลเพื่อให้เราเข้าใจสิ่งที่ใครบางคนพูดกับเราในห้องที่มีเสียงดัง
https://en.wikipedia.org/wiki/Cocktail_party_effect?wprov=sf...
โดยคร่าว ๆ ต้องอยู่ในระดับประมาณ 10 เท่าของความถี่เสียงสูงสุดที่ต้องการเก็บ หรือภายในหนึ่งในหลายหมื่นวินาที
อีกทั้งถ้าตำแหน่งไมโครโฟนในอาร์เรย์ไม่ใช่เส้นตรง วงกลม หรือเรขาคณิตง่าย ๆ แบบอื่น โค้ดหรือคณิตศาสตร์ในการดึงสัญญาณที่ดีขึ้นออกมาก็จะยากมาก
Boeing เคยทำ เวอร์ชันทรงกลม ของอุปกรณ์แบบนี้ และใช้กับต้นแบบ 787 เพื่อค้นหาวัสดุกันเสียงที่เหมาะสม
ว่ากันว่าในสภาพแวดล้อมที่มีเสียงดังอย่างเครื่องบิน ภาพลวงทางการได้ยินอาจทำให้รู้สึกว่าเสียงมาจากตำแหน่งที่ต่างจากตำแหน่งจริง
เมื่อมีงบประมาณด้านน้ำหนักสำหรับวัสดุกันเสียงที่กำหนดไว้ การทำให้จุด 80/20 ถูกต้องจึงสำคัญ
ถ้าอยากลองเล่นกับ Zynq 7010 ก็น่าดู บอร์ด EBAZ4205
ซื้อได้บน AliExpress ในราคา 20~30 ยูโร และเดิมทีเป็นคอนโทรลเลอร์ขุด Bitcoin
มีคนทำ reverse engineering ทั้งหมดแล้วอัปขึ้น GitHub และยังมีบอร์ดอะแดปเตอร์สำหรับเข้าถึง GPIO ด้วย
ถ้าอยากเริ่มแบบซับซ้อนน้อยลง ก็มี FPGA จีนอย่างบอร์ด “Sipeed” ที่ใช้ GoWin FPGA
ใช้งานได้ค่อนข้างดี และ IDE ก็ฟรี
เมื่อคืนผมหาข้อมูลแล้วก็มาถึงหน้านี้พอดี
สงสัยว่ามีใครรู้วิธีติดตั้งไมโครโฟนในห้องแล้วบันทึกเฉพาะเสียงจาก บริเวณหนึ่ง ๆ ไหม
กรณีใช้งานของผมคือบันทึกเสียงจากฝั่งโซฟาเพื่อดูทีวีกับเพื่อนออนไลน์ โดยตัดเสียงของเพื่อน ๆ และเสียงรายการออกจากเสียงที่บันทึก
ดูเหมือนถ้าทำอาร์เรย์ไมโครโฟนแล้วใช้ beam steering น่าจะทำได้ แต่ผมหาตัวอย่างโค้ดที่ทำงานแบบเรียลไทม์บน GitHub ได้ไม่มากนัก
https://obsproject.com/
https://voicemeeter.com/
สิ่งที่ต้องการไม่ใช่ไมโครโฟนหรือเทคนิค beamforming แต่เป็น การตัดเสียงสะท้อน แบบเดียวกับที่ซอฟต์แวร์ประชุมวิดีโอทุกตัวใช้
ใส่เสียงรายการกับเสียงเพื่อนเป็นอินพุต แล้วใช้การตัดเสียงสะท้อนกับแต่ละรายการก็พอ
วัดระยะจากจุดหนึ่ง คือโซฟา ไปยังไมโครโฟนแต่ละตัว จากนั้นหน่วงสัญญาณในโดเมนเวลาเท่ากับเวลาที่เสียงเดินทางจากโซฟาไปถึงไมโครโฟน แล้วนำมารวมกัน
โดยพื้นฐานแล้วคือพยายามปรับให้ไมโครโฟนรับสัญญาณจากโซฟาเหมือนเกิดขึ้นในเวลาเดียวกัน แม้จะอยู่ห่างกันคนละระยะ
เพื่อให้วิธีนี้ได้ผล ต้องทำให้ ความแตกต่างของระยะห่างระหว่างไมโครโฟน มากพอ