นักวิทยาศาสตร์และวิศวกรในการประมวลผลสัญญาณดิจิตอลโดย Steven W. Smith, Ph. D. ข้อดีอย่างมากของตัวกรองค่าเฉลี่ยเคลื่อนที่คือสามารถนำมาใช้กับอัลกอริทึมที่รวดเร็วมาก เพื่อทำความเข้าใจกับอัลกอริธึมนี้ลองจินตนาการผ่านสัญญาณอินพุท x ผ่านตัวกรองเฉลี่ย 7 จุดเพื่อสร้างสัญญาณเอาท์พุท y ตอนนี้ดูว่ามีการคำนวณจำนวนจุดส่งออกที่อยู่ติดกันสองจุดคือ y 50 และ y 51 อย่างไร: ต้องมีการคำนวณจุดการคำนวณเดียวกัน x 48 ถึง x 53 สำหรับ y 50 และอีกครั้งสำหรับ y 51 ถ้า y 50 ถูกคำนวณแล้ว วิธีที่มีประสิทธิภาพที่สุดในการคำนวณ y 51 คือเมื่อ y 51 ถูกค้นพบโดยใช้ y 50 แล้ว y 52 สามารถคำนวณได้จากตัวอย่าง y 51 และอื่น ๆ หลังจากที่จุดแรกถูกคำนวณใน y แล้วจุดอื่น ๆ ทั้งหมดสามารถพบได้โดยมีเพียงการบวกและการลบต่อจุดเท่านั้น นี่สามารถแสดงออกได้ในสมการ: สังเกตว่าสมการนี้ใช้ข้อมูลสองแหล่งในการคำนวณแต่ละจุดในเอาท์พุท: จุดจากอินพุทและจุดที่คำนวณก่อนหน้านี้จากเอาต์พุต นี้เรียกว่าสมการ recursive ซึ่งหมายความว่าผลของการคำนวณจะใช้ในการคำนวณในอนาคต (คำ recursive ยังมีความหมายอื่นโดยเฉพาะในวิทยาการคอมพิวเตอร์) บทที่ 19 กล่าวถึงตัวกรองแบบ recursive ในรายละเอียดเพิ่มเติม โปรดทราบว่าตัวกรอง recursive ค่าสัมบูรณ์ที่เคลื่อนที่แตกต่างจากตัวกรองแบบ recursive ทั่วไป โดยเฉพาะอย่างยิ่งตัวกรอง recursive ส่วนใหญ่มีการตอบสนองแรงดึงดูดอันยาวนาน (IIR) อนันต์ประกอบด้วย sinusoids และ exponentials การตอบสนองต่ออิมพัลส์ของค่าเฉลี่ยเคลื่อนที่เป็นรูปสี่เหลี่ยมผืนผ้า (pulse impulse response หรือ FIR) อัลกอริธึมนี้เร็วกว่าตัวกรองสัญญาณดิจิตอลอื่น ๆ ด้วยเหตุผลหลายประการ ขั้นแรกมีการคำนวณเพียง 2 จุดต่อจุดโดยไม่คำนึงถึงความยาวของเคอร์เนลตัวกรอง ประการที่สองการบวกและการลบคือการดำเนินงานทางคณิตศาสตร์เพียงอย่างเดียวที่ต้องการในขณะที่ตัวกรองดิจิทัลส่วนใหญ่ต้องการการคูณที่ใช้เวลานาน ประการที่สามรูปแบบการจัดทำดัชนีเป็นเรื่องง่ายมาก แต่ละดัชนีในสมการ 15-3 ได้ด้วยการเพิ่มหรือลบค่าจำนวนเต็มจำนวนเต็มซึ่งสามารถคำนวณได้ก่อนที่การกรองจะเริ่มต้น (เช่น p และ q) ขั้นตอนทั้งหมดสามารถดำเนินการได้ด้วยการแทนจำนวนเต็ม ขึ้นอยู่กับฮาร์ดแวร์ที่ใช้จำนวนเต็มสามารถมากกว่าลำดับความสำคัญได้เร็วกว่าจุดลอยตัว น่าแปลกที่การแทนจำนวนเต็มจะทำงานได้ดีกว่าจุดลอยตัวด้วยอัลกอริทึมนี้นอกจากจะเร็วกว่า ข้อผิดพลาดในการปัดเศษทศนิยมจากเลขคณิตลอยตัวสามารถให้ผลลัพธ์ที่ไม่คาดคิดได้หากคุณไม่ระมัดระวัง ตัวอย่างเช่นสมมติว่ามีการกรองตัวอย่างสัญญาณ 10,000 รายการด้วยวิธีนี้ ตัวอย่างสุดท้ายในสัญญาณที่ผ่านการกรองมีข้อผิดพลาดสะสม 10,000 ครั้งและการลบออก 10,000 ครั้ง นี้จะปรากฏในสัญญาณเอาท์พุทเป็นออฟเซ็ทลอย จำนวนเต็มไม่มีปัญหานี้เนื่องจากไม่มีข้อผิดพลาดในการคำนวณ ถ้าคุณต้องใช้จุดลอยตัวด้วยอัลกอริทึมนี้โปรแกรมในตารางที่ 15-2 จะแสดงวิธีการใช้เครื่องอัดฉีดความแม่นยำสองครั้งเพื่อกำจัดการล่องลอยนี้นักวิทยาศาสตร์และวิศวกรแนะนำการประมวลผลสัญญาณดิจิทัลโดย Steven W. Smith, Ph. D. เมื่อต้องการเริ่มการสนทนาของตัวกรอง recursive ลองนึกดูว่าคุณต้องดึงข้อมูลจากสัญญาณบางตัว x ความต้องการของคุณเป็นที่ดีเพื่อให้คุณจ้างอาจารย์คณิตศาสตร์เก่าเพื่อประมวลผลข้อมูลสำหรับคุณ งานของอาจารย์คือการกรอง x เพื่อผลิต y ซึ่งหวังว่าจะมีข้อมูลที่คุณสนใจศาสตราจารย์เริ่มทำงานในการคำนวณแต่ละจุดใน y ตามอัลกอริธึมบางอย่างที่ถูกล็อคอย่างแน่นหนาในสมองที่พัฒนาแล้วของเขา ส่วนหนึ่งผ่านงานเหตุการณ์ที่โชคร้ายที่สุดเกิดขึ้น ศาสตราจารย์เริ่มต้นพูดพล่ามเกี่ยวกับการวิเคราะห์เอกพจน์และการแปลงเศษส่วนและปีศาจอื่น ๆ จากฝันร้ายทางคณิตศาสตร์ เป็นที่ชัดเจนว่าอาจารย์ได้สูญเสียความคิดของเขา คุณดูด้วยความกังวลเป็นศาสตราจารย์และอัลกอริทึมของคุณจะถูกนำออกไปโดยผู้ชายหลายคนในเสื้อสีขาว คุณกำลังทบทวนบันทึกย่อของอาจารย์เพื่อค้นหาขั้นตอนวิธีที่เขาใช้อยู่ คุณพบว่าเขาได้คำนวณจุด y จาก 0 ถึง 27 y แล้วและกำลังจะเริ่มต้นในจุด y 28 ดังแสดงในรูป 19-1 เราจะให้ตัวแปร n แสดงจุดที่กำลังคำนวณอยู่ ซึ่งหมายความว่า yn คือตัวอย่างที่ 28 ในสัญญาณเอาท์พุท, yn - 1 คือตัวอย่าง 27, yn - 2 คือตัวอย่าง 26 ฯลฯ ในทำนองเดียวกัน xn คือจุดที่ 28 ในสัญญาณอินพุต, xn - 1 คือจุดที่ 27 ฯลฯ เพื่อให้เข้าใจ อัลกอริทึมที่ใช้เราถามตัวเอง: ข้อมูลที่มีให้กับอาจารย์ในการคำนวณ yn, ตัวอย่างที่กำลังทำงานอยู่บนแหล่งข้อมูลที่ชัดเจนที่สุดของข้อมูลคือสัญญาณเข้า นั่นคือค่า: xn, xn - 1, xn - 2, 8230 ศาสตราจารย์อาจมีการคูณแต่ละจุดในสัญญาณอินพุตด้วยสัมประสิทธิ์และการเพิ่มผลิตภัณฑ์เข้าด้วยกัน: คุณควรตระหนักว่านี่ไม่ใช่อะไรที่ง่ายกว่า convolution มีค่าสัมประสิทธิ์: a 0 1. ก. 2 8230 สร้างเคอร์เนลขึ้นรูป ถ้านี่เป็นศาสตราจารย์ทั้งหมดกำลังทำอยู่จะไม่มีความจำเป็นมากสำหรับเรื่องนี้หรือในบทนี้ อย่างไรก็ตามมีแหล่งข้อมูลอื่นที่ศาสตราจารย์ได้กล่าวถึง: ค่าที่คำนวณได้ก่อนหน้านี้ของสัญญาณเอาท์พุทที่จัดขึ้นใน: yn - 1, yn - 2, yn - 3, 8230 โดยใช้ข้อมูลเพิ่มเติมนี้อัลกอริทึมจะเป็น ในรูปแบบ: ในคำแต่ละจุดในสัญญาณเอาต์พุตจะพบได้โดยการคูณค่าจากสัญญาณอินพุทโดยสัมประสิทธิ์การคูณค่าที่คำนวณได้ก่อนหน้านี้จากสัญญาณเอาท์พุทโดยสัมประสิทธิ์ b และเพิ่มผลิตภัณฑ์เข้าด้วยกัน สังเกตว่าไม่มีค่าสำหรับ b 0 เนื่องจากตรงกับตัวอย่างที่คำนวณ สมการ 19-1 เรียกว่าสมการเวียนเกิด (recursion equation) และตัวกรองที่ใช้เรียกว่าตัวกรอง recursive ค่า a และ b ที่กำหนดตัวกรองจะเรียกว่าสัมประสิทธิ์การทับซ้ำ (recursion coefficients) ในทางปฏิบัติจริงไม่สามารถใช้ค่าไครน์ฟารีซ้ำได้มากกว่าหนึ่งโหลหรือตัวกรองจะไม่เสถียร (นั่นคือเอาต์พุตเพิ่มหรือเพิ่มขึ้นอย่างต่อเนื่อง) ตารางที่ 19-1 แสดงตัวอย่างโปรแกรมตัวกรองข้อมูลซ้ำ ตัวกรองซ้ำมีประโยชน์เพราะไม่ได้มีการเวียนกันอีกต่อไป เช่นพิจารณาสิ่งที่เกิดขึ้นเมื่อฟังก์ชันเดลต้าถูกส่งผ่านตัวกรอง recursive ผลลัพธ์คือการตอบสนองต่อตัวกรอง และโดยทั่วไปจะเป็นรูปคลื่นไซน์ (sinusoidal oscillation) เนื่องจากการตอบสนองต่ออิมพัลส์ในตัวกรองแบบเรียกซ้ำแบบไม่ จำกัด นาน ๆ ครั้งนี้มักเรียกว่าฟิลเตอร์ตอบสนองต่ออิมพัลส์อิมพัลส์ (IIR) มีผลให้ตัวกรอง recursive หมุนตัวสัญญาณอินพุตพร้อมเคอร์เนลตัวกรองที่ยาวมาก ๆ แม้ว่าจะมีเพียงไม่กี่ค่าสัมประสิทธิ์ ความสัมพันธ์ระหว่างค่าสัมประทานการเรียกซ้ำและการตอบสนองตัวกรองจะได้จากเทคนิคทางคณิตศาสตร์ที่เรียกว่า z-transform หัวข้อของบทที่ 31 ตัวอย่างเช่น z-transform สามารถใช้สำหรับงานต่างๆเช่นการแปลงค่าสัมประสิทธิ์การทับซ้ำและการตอบสนองความถี่รวม cascaded และ parallel ไปเป็น filter เดียวการออกแบบระบบ recursive ที่เลียนแบบตัวกรอง analog ฯลฯ แต่น่าเสียดายที่ z-transform เป็นไปได้ทางคณิตศาสตร์มากและซับซ้อนกว่าผู้ใช้ DSP ส่วนใหญ่ที่เต็มใจที่จะจัดการด้วย นี่คือขอบเขตของผู้ที่เชี่ยวชาญใน DSP มีสามวิธีในการหาสัมประสิทธิ์การเรียกซ้ำโดยไม่ต้องเข้าใจการแปลง z ขั้นแรกให้บทนี้มีสมการการออกแบบสำหรับตัวกรองซ้ำหลาย ๆ แบบ ประการที่สองบทที่ 20 มีโปรแกรมคอมพิวเตอร์ตำราสำหรับการออกแบบตัวกรองความถี่ต่ำและผ่านสูงของ Chebyshev ที่ Chebyshev ประการที่สามบทที่ 26 อธิบายถึงวิธีการซ้ำสำหรับการออกแบบตัวกรองแบบ recursive ด้วยการตอบสนองความถี่โดยพลการในสถิติค่าเฉลี่ยเคลื่อนที่แบบง่ายๆคืออัลกอริทึมที่คำนวณค่าเฉลี่ยที่ไม่ได้วัดจากตัวอย่าง n ล่าสุด พารามิเตอร์ n มักเรียกว่าขนาดของหน้าต่างเพราะอัลกอริธึมสามารถใช้เป็นหน้าต่างที่สไลด์มากกว่าจุดข้อมูลได้ โดยการใช้สูตร recursive ของอัลกอริทึมจำนวนการดำเนินการที่ต้องการต่อตัวอย่างจะลดลงเหลือหนึ่งรายการการลบหนึ่งครั้งและหนึ่งส่วน เนื่องจากสูตรเป็นอิสระจากขนาดหน้าต่าง n ความซับซ้อนของรันไทม์คือ O (1) กล่าวคือคงที่ สูตรการเว้นวรรคของค่าเฉลี่ยเคลื่อนที่ที่ไม่มีการชั่งน้ำหนักเป็นค่าเฉลี่ยถ่วงน้ำหนักโดยเฉลี่ยและ x แสดงถึงจุดข้อมูล ดังนั้นเมื่อใดก็ตามที่หน้าต่างสไลด์ไปทางขวาหนึ่งจุดข้อมูลหางลดลงและจุดข้อมูลหนึ่งหัวย้ายมาการดำเนินการการดำเนินงานของค่าเฉลี่ยเคลื่อนที่แบบง่ายๆต้องดำเนินการต่อไปนี้ในการเริ่มต้นอัลกอริทึมของบัญชีตราบเท่าที่ หน้าต่างไม่เต็มด้วยค่าสูตร recursive ล้มเหลว การเข้าถึงองค์ประกอบส่วนหางจะต้องมีการเข้าถึงองค์ประกอบส่วนหางซึ่งขึ้นอยู่กับการใช้งานต้องมีการจัดเก็บองค์ประกอบ n ไว้ การใช้งานของฉันใช้สูตรที่นำเสนอเมื่อหน้าต่างมีจำนวนประชากรทั้งหมดมีค่าและมิฉะนั้นจะเปลี่ยนเป็นสูตรซึ่งปรับปรุงค่าเฉลี่ยโดยการคำนวณผลรวมขององค์ประกอบก่อนหน้านี้ โปรดทราบว่าสิ่งนี้อาจนำไปสู่ความไม่เสถียรเชิงตัวเลขเนื่องจากการคำนวณเลขทศนิยม เมื่อใช้หน่วยความจำเกี่ยวข้องการใช้งานจะใช้ iterators เพื่อติดตามหัวและองค์ประกอบหาง สิ่งนี้นำไปสู่การใช้งานที่มีความต้องการหน่วยความจำคงที่โดยไม่ขึ้นกับขนาดของหน้าต่าง นี่คือขั้นตอนการปรับปรุงที่สไลด์หน้าต่างไปทางขวา ในคอลเลกชันส่วนใหญ่จะทำให้ enumerators ของคุณถูกปรับเปลี่ยน การดำเนินการนี้ขึ้นอยู่กับผู้แจกแจงที่ถูกต้อง โดยเฉพาะอย่างยิ่งในแอพพลิเคชันแบบสตรีมมิ่งคอลเลกชันที่อยู่เบื้องหลังต้องได้รับการแก้ไขเมื่อมีองค์ประกอบใหม่เข้ามา วิธีหนึ่งที่จะจัดการกับนั่นคือการสร้างคอลเลกชันขนาดคงที่แบบวงกลมที่เรียบง่ายของขนาด n1 ที่ไม่เคยทำซ้ำ iterators และสลับองค์ประกอบและโทร Shift ฉันต้องการฉันสามารถตัวเลขวิธีการใช้จริงนี้เป็นฟังก์ชันการทดสอบจะสับสนมาก me8230 ฉันจำเป็นต้องแปลงข้อมูลเป็น Array แล้วเรียก SMA SMA ใหม่ SMA (20, array) เป็นระยะเวลา 20 SMA ฉันจะจัดการ ฟังก์ชัน shift () จำเป็นต้องใช้ constructors หรือไม่ (ขออภัยสำหรับความสับสน) คุณ don8217t ต้องแปลงข้อมูลของคุณลงในอาร์เรย์ตราบเท่าที่ข้อมูลของคุณใช้ IEnumerable1 และชนิดที่ระบุเป็นสองเท่า เท่าที่ส่งข้อความส่วนตัวของคุณเป็นห่วงคุณต้องแปลง DataRow เพื่อสิ่งที่นับจำนวนคู่ วิธีการทำงานของคุณ Shift เลื่อนหน้าต่างหนึ่งตำแหน่งไปทางซ้าย สำหรับชุดค่าที่กล่าวว่า 40 ค่าและ SMA ระยะเวลา 20 คุณมี 21 ตำแหน่งหน้าต่างนี้จะพอดีกับ (40 8211 20 1) ทุกครั้งที่คุณโทรไปที่ Shift () หน้าต่างจะถูกย้ายไปทางซ้ายโดยหนึ่งตำแหน่งและ Average () จะส่งกลับ SMA สำหรับตำแหน่งหน้าต่างปัจจุบัน นั่นคือค่าเฉลี่ยที่ไม่มีการเบี่ยงเบนของค่าทั้งหมดภายในหน้าต่าง นอกจากนี้การใช้งานของฉันยังช่วยในการคำนวณ SMA แม้ว่าหน้าต่างจะเต็มไปหมดตั้งแต่เริ่มต้น ดังนั้นในสาระสำคัญหวังว่านี้จะช่วยให้ คำถามเพิ่มเติมใด ๆ ข้อควรระวังเกี่ยวกับลิขสิทธิ์ COPYRIGHT Christoph Heindl และ cheind. wordpress, 2009-2012 การใช้และการลอกเลียนแบบเนื้อหานี้โดยไม่ได้รับอนุญาตโดยไม่ได้รับการยินยอมเป็นลายลักษณ์อักษรและได้รับอนุญาตเป็นลายลักษณ์อักษรจากเจ้าของผู้เขียนและเจ้าของบล็อกนี้โดยเด็ดขาด อาจใช้บทคัดย่อและลิงก์ได้หากว่า Christoph Heindl และ cheind. wordpress มีการให้เครดิตที่ชัดเจนและชัดเจนโดยมีทิศทางที่เหมาะสมและเฉพาะเจาะจงกับเนื้อหาต้นฉบับ ตัวกรองค่าเฉลี่ยเคลื่อนที่เป็นตัวกรอง FIR ที่มีความยาว N พร้อมกับก๊อกทั้งหมดที่ตั้งไว้เท่ากับ (1N) .160 รู้จักการแยกความถี่หมัด แต่การตอบสนองต่อเวลาที่ยอดเยี่ยม - ในแง่นี้มันออก Bessels Bessel กรอง 160 คุณสามารถใช้กับบล็อก SigmaStudios FIR ตามที่อธิบายไว้ที่นี่: อีกต่อไปกรองที่เรียบมากขึ้น - แต่มาตรฐานขั้นตอนวิธีการกรอง FIR ใช้จำนวนมากของคำแนะนำสำหรับตัวกรองขนาดใหญ่เพราะ มันมีการคูณค่าสัมประสิทธิ์สำหรับทุก tap.160 นี่คือเสียเมื่อค่าสัมประสิทธิ์ทั้งหมดเหมือนกัน 160 เป็นบทที่ 15 ของ Steven W. Smiths หนังสือชี้ให้เห็นคุณสามารถสร้างตัวกรองค่าเฉลี่ยเคลื่อนที่ด้วยเทคนิค recursive ที่มีการแตะ ก่อนและหลังการหน่วงเวลา (N-1) 160 ตัวกรองดังกล่าวจะปรากฏด้านล่างเป็นส่วนหนึ่งของวงจรทดสอบที่มีแหล่งสัญญาณและ Bessel filter สำหรับการเปรียบเทียบ: 160160160160 ค่าสัมประสิทธิ์ถูกดึงออกมาจากบล็อก gain เดียวที่ input.160 ตัวอย่างปัจจุบันเพิ่ม เพื่อเอาต์พุตเมื่อมันเข้าสู่ความล่าช้าตัวอย่างที่ถูกเลื่อนออกไปจากเอาท์พุทเมื่อมันออกมา 160 adder ที่มีข้อเสนอแนะสะสมการเพิ่มและการลบเหล่านี้เพื่อสร้างผลลัพธ์ - นี่ทำอะไรบางอย่างที่เล็กน้อยใน C แต่เป็นอย่างอื่นความเจ็บปวดใน GUI.160 แม้ว่าจะมีการใช้เทคนิค recursive ตัวกรองยังคงเป็นตัวกรอง FIR ที่แท้จริง แต่ความยาวของการตอบสนองของอิมพัลส์จะถูกตั้งค่าเฉพาะตามความล่าช้าของคุณ 160160160160 อินพุตทดสอบของฉันเป็นคลื่นสี่เหลี่ยมที่มีเสียงรบกวนเพิ่มขึ้น 160 ผลลัพธ์ที่กรองออกมาจะปรากฏเป็นภาพด้านบนในภาพถ่ายทั้งสองรูป - แรกคือตัวกรองเฉลี่ยเคลื่อนที่: ตัวกรอง Bessel: 160160160160 ตัวกรองค่าเฉลี่ยเคลื่อนที่ช่วยให้มีเสียงรบกวนมากขึ้น แต่ให้ดีขึ้น รูปสี่เหลี่ยมจัตุรัสเป็นรูปทรงสี่เหลี่ยมจัตุรัส (รูปสี่เหลี่ยมจัตุรัส) มีรูปทรงเป็นรูปสี่เหลี่ยมจัตุรัส (รูปสี่เหลี่ยมจัตุรัส) มีรูปทรงเป็นรูปสี่เหลี่ยมจัตุรัสและลาดขึ้นและลงเป็นสมมาตร (เฟสเชิงเส้น). 160 การฟังรูปคลื่นสองรูปแบบด้วยหูฟังแสดงให้เห็นถึงผลที่คล้ายคลึงกัน - มีเสียงรบกวนมากขึ้น เสียงคลื่นสแควร์ผ่านเข้ามา
No comments:
Post a Comment