บทความ

กำลังแสดงโพสต์จาก กุมภาพันธ์, 2011

การสร้างสัญญาณ Decaying Sinusoid ด้วยตัวกรองดิจิตอลโดยใช้ pd

รูปภาพ
แบบจำลองของเสียงจากเครื่องดนตรีแบบหนึ่งคือ Decaying Sinusoid ซึ่งก็คือสัญญาณตระกูลไซนูซอยด์ที่มีขนาดลดลงด้วยอันดับเอกโพเนนเชียลเมื่อเวลาผ่านไป สัญญาณลักษณะนี้สามารถเขียนเป็นสมการได้ amath y(t) = A*e^{-b*t}*sin( omega_{c} * t ) endamath เมื่อ amath A endamath คือขนาดของสัญญาณ amath a endamath คืออัตราการลดทอน amath omega_{c} endamath คือความถี่มีหน่วยเป็น rad/sec และ amath t endamath คือเวลา สัญญาณ Decaying Sinusoid (เส้นสีแดงและเส้นสีเขียวเป็นเพียงเส้นนำสายตาเท่านั้น) กลยุทธ์การสังเคราะห์เสียงลักษณะนี้ก็คือการใช้ตัวกรองที่มีผลตอบสนองอิมพัลส์ (Impulse Response) ที่มีหน้าตาแบบนี้เลย คือถ้าใส่อิมพัลส์เข้าไป ให้ตัวกรองส่งสัญญาณหน้าตาแบบนี้ออกมา ซึ่งเราสามารถสร้างตัวกรองดังกล่าวได้โดยใช้กรรมวิธีการออกแบบตัวกรองดิจิตัลแบบอิมพัลส์ไม่เปลี่ยนแปลง (Impulse Invariant Method) ด้วยวิธี Impulse Invariant Method เราสามารถเขียนผลตอบสนองของตัวกรองดิจิตัลในรูปแบบสัญญาณดิสครีตได้ดังนี้ amath y(n) = A*e^{-k*n}*sin(omega_{d}*n) endamath เมื่อ amath k endamath เป็นอัตราลดทอนที่แปลงมาจาก amath b endamath ama...

การสร้าง Impulse (Discrete) ใน pd เพื่อใช้ทดสอบตัวกรอง

รูปภาพ
ผมหัดใช้ pd มาได้สักพักแล้ว ตอนนี้กำลังทำโครงงานที่สอง (เลยนึกได้ว่าไม่เคยบันทึกโครงงานแรกลงในบล๊อกเลย) ในโครงงานนี้เราจะสร้างตัวกรอง (Filter) เพื่อสังเคราะห์สัญญาณเสียงขึ้นมา ซึ่งตัวกรองจะทำงานได้ต้องมีอินพุต และอินพุตที่เราจะใช้นั้นเป็นอิมพัลส์ (Impulse) ในดิสครีตโดเมน ใน pd-extended นั้นจะมีออบเจ็ค dirac~ ให้ใช้อยู่ แต่เนื่องจากผมใช้เดเบียนซึ่งใน Repository มีแต่ pd-vanilla ซึ่งไม่มีออบเจ็ค dirac~ ให้ใช้ ก็ต้องสร้างเอง การสร้างได้แนวทางมาจาก http://www.mail-archive.com/pd-list@iem.at/msg12771.html และหลังจากลองผิดลองถูกมาได้สักพัก ก็สามารถสร้าง Discrete Impulse ขึ้นมาจนได้ดังรูป หลักการทำงานก็คือ รับข้อความ \$1 0 มาจาก inlet เมื่อ \$1 เป็นตัวแปรที่ส่งเข้ามาเพื่อใช้เป็นขนาดของอิมพัลส์ ส่งข้อความไปให้ vline~ สร้างสัญญาณเป็น \$1 ทันทีที่ได้รับข้อความ หลังจากนั้น ข้อความ \$1 0 จะส่งทริกเกอร์ไปยังการคำนวณคาบเวลา T=1/fs (ในที่นี้ใช้ 1.5/fs แทน เผื่อไว้กันเหนียว) สร้างข้อความ 0 0 \$1 เมื่อ \$1 ระยะเวลาเป็นหน่วยมิลลิวินาทีที่รอก่อนที่ vline~ จะสั่งให้ตั้งค่าเป็นศูนย์ เราพยายามจะตั้งให้ได้ 1...