Friday 7 July 2017

การย้าย ค่าเฉลี่ย ระดับ C ++


ในใบสมัครซื้อขายของฉันฉันมีอยู่ ticks ของราคาหุ้นฉันต้องรักษา SMA สมมุติว่าฉันต้องการ SMA ของ 20 candles ที่ระยะเวลาของแต่ละเทียนคือ 10 วินาทีซึ่งหมายความว่าทุก 10 วินาทีฉันมีจุดตรวจสอบ where. I ปิดเทียนในปัจจุบัน และราคาเฉลี่ยของร้านค้าสำหรับ 10 วินาทีที่ผ่านมาค่าเฉลี่ยคือ max - min 2.I เริ่มต้นเทียนใหม่และเก็บ last. I ทำความสะอาด candle. Id เก่าปรับปรุงราคาล่าสุดของเทียนขึ้นรูปและคำนวณ SMA. So เมื่อเห็บใด ๆ ที่ฉันต้องการ เพื่อคำนวณ SMA ในกรณีส่วนใหญ่เราจะใช้ราคาของเทียนสุดท้ายเพียงครั้งเดียวต่อครั้ง 10 วินาทีฉันต้องทำงานพิเศษอีกหน่อย - ต้องลืมค่าเฉลี่ยของเทียนที่เสื่อมสภาพและเก็บค่าเฉลี่ยของเทียนที่เพิ่งสร้างขึ้น Apr 28 14 at 10 21.I m ไม่แน่ใจว่านี่เป็นวิธีการที่คุณกำลังมองหา แต่ที่นี่เป็น pseudocode สำหรับรวดเร็วมาก SMAs. Simple Moving Average คุณสามารถแนะนำวิธีการนี้กับแฝงต่ำสุด สมมติว่าข้อมูลของคุณเป็น comin g ในรูปแบบของกระแสบางและเก็บไว้ในสถานที่หน่วยความจำอย่างต่อเนื่องอย่างน้อยด้วยที่อยู่อย่างต่อเนื่อง mappable วิธีที่มีสองเพิ่มเติมและหนึ่งคูณกับ 1 2000 คุณสามารถสร้างค่าเฉลี่ยเคลื่อนที่ต่อไปสำหรับ ticks. Exposential ใหม่ย้ายเฉลี่ยนั่นคือทางเลือกที่ดี ดังกล่าวข้างต้นที่นี่มันไม่ได้จริงๆ N-day moving average มันเป็นเพียงค่าเฉลี่ยเคลื่อนที่ถ่วงน้ำหนัก with.87 weightage ไปล่าสุด N-days ดังนั้นเกือบ N-day เป็นเหมือน it. Note ใน optimizations. Do ทราบว่าการเปิดตัว SSE หรือ AVX ถ้ามีจะช่วยให้การเร่งความเร็วขนาดใหญ่ของอัลกอริทึมเหล่านี้ได้เนื่องจากการคำนวณแบบหลายแบบสามารถปั่นออกได้ในซีพียูตัวเดียวฉันรู้ว่านี่ทำได้ด้วยการเพิ่มตาม per. But ฉันต้องการหลีกเลี่ยงการใช้ boost I มี googled และไม่พบตัวอย่างใด ๆ ที่เหมาะสมหรืออ่านได้โดยปกติฉันต้องการติดตามค่าเฉลี่ยเคลื่อนที่ของกระแสอย่างต่อเนื่องของสตรีมของตัวเลขจุดลอยใช้ตัวเลขล่าสุด 1000 เป็นตัวอย่างข้อมูลอะไรที่ง่ายที่สุดคือ y เพื่อให้บรรลุ this. I ทดลองกับการใช้อาร์เรย์วงกลมค่าเฉลี่ยเคลื่อนที่ชี้แจงและค่าเฉลี่ยเคลื่อนที่ง่ายขึ้นและพบว่าผลลัพธ์จากอาร์เรย์แบบวงกลมเหมาะกับความต้องการของฉัน best. asked 12 มิถุนายน 12 ที่ 4 38.If ความต้องการของคุณง่าย, คุณเพียงแค่ลองใช้ exponential moving average. Put เพียงคุณสร้างตัวแปรสะสมและเป็นรหัสของคุณดูที่ตัวอย่างแต่ละโค้ดจะอัพเดต accumulator ด้วยค่าใหม่คุณสามารถเลือก alpha คงที่ระหว่าง 0 ถึง 1 และ คำนวณนี้คุณเพียงแค่ต้องพบค่าของอัลฟาที่ผลกระทบของตัวอย่างที่กำหนดเท่านั้น lasts ประมาณ 1000 samples. Hmm ฉันไม่แน่ใจว่าจริงนี้เหมาะสำหรับคุณตอนนี้ที่ฉันได้วางไว้ที่นี่ปัญหาคือว่า 1000 เป็นหน้าต่างที่ค่อนข้างยาวสำหรับค่าเฉลี่ยเคลื่อนที่ที่อธิบายได้ฉัน m ไม่แน่ใจว่ามีอัลฟาที่จะกระจายค่าเฉลี่ยมากกว่า 1000 ครั้งโดยไม่ต้องมีการคำนวณต่ำกว่าจุดต่ำสุด แต่ถ้าคุณต้องการค่าเฉลี่ยที่เล็กกว่าเช่น 30 ตัวเลขหรือมากกว่านั้น นี้เป็นเรื่องง่ายมากและ f ast วิธีที่จะทำ it. rieded Jun 12 12 at 4 44. 1 ในการโพสต์ของคุณค่าเฉลี่ยเคลื่อนที่ชี้แจงสามารถอนุญาตให้อัลฟาเป็นตัวแปรดังนั้นนี้จะช่วยให้สามารถใช้ในการคำนวณค่าเฉลี่ยฐานเวลาเช่นไบต์ต่อวินาทีถ้าเวลานับตั้งแต่ครั้งสุดท้าย accumulator update มากกว่า 1 วินาทีคุณยอมให้ alpha เป็น 1 0 มิฉะนั้นคุณสามารถปล่อยให้ alpha เป็น usecs ตั้งแต่ update ล่าสุด 1000000 jxh Jun 12 12 at 6 21 โดยทั่วไปฉันต้องการติดตามค่าเฉลี่ยเคลื่อนที่ของกระแสข้อมูลสตรีมของกระแสข้อมูล ตัวเลขจุดลอยตัวที่ใช้ตัวเลขล่าสุด 1000 เป็นตัวอย่างข้อมูลโปรดสังเกตว่าด้านล่างนี้จะอัพเดตองค์ประกอบรวมเป็นองค์ประกอบแทนที่ถูกแทนที่โดยหลีกเลี่ยงการข้ามค่าใช้จ่ายเพื่อคำนวณผลรวมที่จำเป็นสำหรับค่าเฉลี่ยความต้องการรวมทั้งหมดเป็นพารามิเตอร์ที่แตกต่างกัน จาก T เพื่อสนับสนุนเช่นใช้ยาวนานเมื่อรวม 1000 long s, int สำหรับ char s หรือ double เพื่อ float ทั้งหมด. นี้เป็นบิตสมบูรณ์ใน numsamples ที่สามารถผ่าน INTMAX - ถ้าคุณดูแลคุณสามารถใช้ unsigned นานหรือใช้ข้อมูลสมาชิก bool พิเศษเพื่อบันทึก whe n ภาชนะบรรจุครั้งแรกเต็มไปหมดขณะที่การวนรอบ numsamples รอบแถวที่ดีที่สุดแล้วเปลี่ยนชื่อบางสิ่งบางอย่างที่ไม่เป็นอันตรายเช่น pos. answered 12 มิถุนายน 12 ที่ 5 19.one สมมติว่าผู้ประกอบการโมฆะ T ตัวอย่างเป็นจริงโมฆะดำเนินการตัวอย่าง T oPless 8 มิถุนายน 14 ที่ 11 52 oPless ahhh ดีด่างจริงฉันหมายสำหรับมันจะโมฆะตัวดำเนินการ T ตัวอย่าง แต่แน่นอนคุณสามารถใช้สิ่งที่คุณต้องการสัญกรณ์จะแก้ไขขอบคุณ Tony D มิถุนายน 8 14 ที่ 14 27.As คนอื่น ๆ ได้กล่าวถึงคุณควรพิจารณา IIR impuls ตอบสนองอนันต์ กรองมากกว่าตัวกรองฟิวเจอร์ฟิวด์ฟิวเจอร์ฟิลเตอร์ที่คุณใช้ตอนนี้มีอะไรมากกว่า แต่ในตอนแรกจะใช้ตัวกรอง FIR เป็น convolutions ที่ชัดเจนและตัวกรอง IIR ที่มีสมการตัวกรอง IIR แบบพิเศษที่ฉันใช้เป็นจำนวนมากในไมโครคอนโทรลเลอร์เป็นขั้วเดียว low pass filter นี่คือ digital analog ของ RC analog filter ที่ง่ายสำหรับแอพพลิเคชั่นส่วนใหญ่เหล่านี้จะมีลักษณะที่ดีกว่า filter ของกล่องที่คุณใช้อยู่ ntered เป็นผลมาจากคนที่ไม่ให้ความสนใจในคลาสการประมวลผลสัญญาณดิจิตอลไม่ได้เป็นผลจากการต้องการลักษณะเฉพาะของพวกเขาหากคุณต้องการลดความถี่สูงที่คุณรู้ว่าเป็นเสียงรบกวนเสาเดียวต่ำกรองจะดีกว่าวิธีที่ดีที่สุดในการ (FILT FF NEW - FILT. FILT เป็นส่วนของรัฐที่มีความคงทน) นี่คือตัวแปรเดียวที่คุณต้องใช้เพื่อคำนวณตัวกรองนี้ NEW คือค่าใหม่ที่ตัวกรองจะได้รับการอัพเดตด้วยวิธีนี้ iteration FF คือส่วนของตัวกรองที่ปรับความหนาแน่นของตัวกรองมองไปที่อัลกอริทึ่มนี้และเห็นว่าสำหรับ FF 0 ตัวกรองมีความหนักแน่นเป็นอนันต์เนื่องจากผลลัพธ์ไม่เปลี่ยนแปลงสำหรับ FF 1 จริงๆแล้วไม่มีตัวกรองเลย input ค่าที่เป็นประโยชน์อยู่ในระหว่างในระบบขนาดเล็กที่คุณเลือก FF เป็น 1 2 N เพื่อให้คูณโดย FF สามารถทำได้เป็น shift ขวาโดย N บิตเช่น FF อาจจะ 1 16 และคูณด้วย FF จึง การเปลี่ยนสิทธิของ 4 บิตมิฉะนั้นตัวกรองนี้ต้องการเพียงหนึ่งคำเดียวและลบออกแม้ว่าตัวเลขจะต้องกว้างกว่าค่าอินพุทมากกว่าความแม่นยำเชิงตัวเลขในส่วนที่แยกข้างล่างฉันมักจะใช้เวลาอ่านโฆษณาอย่างมีนัยสำคัญเร็วกว่าที่จำเป็นและ ใช้สองตัวกรองเหล่านี้ cascaded นี่คือดิจิตอลเทียบเท่าของตัวกรอง RC สองชุดและ attenuates โดย 12 dB octave เหนือความถี่ rolloff อย่างไรก็ตามสำหรับ AD readings มักจะเกี่ยวข้องกับการดูตัวกรองในโดเมนเวลาโดยพิจารณาของ ขั้นตอนการตอบสนองนี้จะบอกคุณว่าระบบของคุณจะเห็นการเปลี่ยนแปลงเมื่อสิ่งที่คุณกำลังวัดการเปลี่ยนแปลงเพื่ออำนวยความสะดวกในการออกแบบตัวกรองเหล่านี้ซึ่งหมายถึงการเลือก FF และการตัดสินใจกี่ของน้ำตกฉันใช้ FILTBITS โปรแกรมของคุณคุณระบุจำนวนของ กะบิตสำหรับแต่ละ FF ในชุด cascaded ของตัวกรองและจะคำนวณการตอบสนองขั้นตอนและค่าอื่น ๆ ที่จริงฉันมักจะทำงานนี้ผ่านฉัน wrapper script PLOTFILT นี้จะทำงาน FILT BITS ซึ่งสร้างไฟล์ CSV จากนั้นแปลงไฟล์ CSV ตัวอย่างเช่นนี่เป็นผลมาจาก PLOTFILT 4 4. พารามิเตอร์สองตัวของ PLOTFILT หมายความว่าจะมีตัวกรองสองแบบเรียงตามลำดับชั้นที่ระบุไว้ข้างต้นค่า 4 ระบุจำนวน shift bit เพื่อให้เกิดการคูณด้วย FF ค่า FF สองตัวจึงมีค่าเท่ากับ 1 16 ในกรณีนี้ trace สีแดงคือการตอบสนองของ unit step และเป็นสิ่งสำคัญในการมองตัวอย่างเช่นนี้จะบอกคุณว่าถ้า input เปลี่ยนแปลงทันที, เอาท์พุทของตัวกรองที่รวมกันจะตัดสินถึง 90 ของค่าใหม่ใน 60 ซ้ำถ้าคุณสนใจเกี่ยวกับการตั้งเวลา 95 แล้วคุณจะต้องรอประมาณ 73 ซ้ำและสำหรับเวลาการตกตะกอนเพียง 26 ซ้ำรอยสีเขียวแสดงให้คุณเห็นผล ความกว้างของสัญญาณเต็มรูปแบบเดียวนี้จะช่วยให้คุณมีแนวคิดในการปราบปรามเสียงรบกวนแบบสุ่มดูเหมือนว่าไม่มีตัวอย่างเดียวจะทำให้เกิดการเปลี่ยนแปลงในการแสดงผลมากขึ้น 2 5 การติดตามสีฟ้าคือการให้ความรู้สึกอัตนัยของตัวกรองนี้ด้วยเสียงสีขาว นี่ไม่ใช่ความรุนแรง ous ทดสอบเนื่องจากไม่มีการรับประกันว่าเนื้อหาที่เป็นของตัวเลขสุ่มเลือกเป็นสัญญาณรบกวนสีขาวสำหรับการทำงานของ PLOTFILT นี้เป็นเพียงเพื่อให้คุณรู้สึกขรุขระของเท่าใดก็จะถูกแบนและวิธีเรียบมันคือ PLOTFILT อาจ FILTBITS และจำนวนมากสิ่งที่มีประโยชน์อื่น ๆ โดยเฉพาะอย่างยิ่งสำหรับการพัฒนาเฟิร์มแวร์ PIC มีอยู่ในการพัฒนาซอฟต์แวร์ PIC ปล่อยซอฟต์แวร์เครื่องมือที่หน้าดาวน์โหลดซอฟต์แวร์ของฉันเพิ่มเกี่ยวกับความแม่นยำตัวเลขฉันเห็นจากความคิดเห็นและตอนนี้คำตอบใหม่ที่มีความสนใจ ในการพูดถึงจำนวนบิตที่จำเป็นในการใช้ตัวกรองนี้โปรดสังเกตว่าการคูณด้วย FF จะสร้างบิตใหม่ FF 2 Log ด้านล่างจุดไบนารีในระบบขนาดเล็ก FF มักถูกเลือกให้เป็น 1 2 N เพื่อให้การคูณนี้เกิดขึ้นจริงโดย shift ขวาของ N bits. FILT จึงมักจะเป็นจำนวนเต็มจุดคงที่ทราบว่า doesn t นี้เปลี่ยนใด ๆ ของคณิตศาสตร์จากมุมมองของตัวประมวลผลตัวอย่างเช่นถ้าคุณกำลังกรองการอ่านโฆษณา 10 บิตและ N 4 FF 1 16 แล้ว คุณ ต้องมีเศษเศษด้านล่าง 10 บิตจำนวนเต็ม AD อ่านหนึ่งโปรเซสเซอร์ส่วนใหญ่คุณต้องทำ 16 บิตการดำเนินงานจำนวนเต็มเนื่องจากการอ่าน 10 บิต AD ในกรณีนี้คุณยังสามารถทำเหมือนกัน 16 บิตจำนวนเต็ม opertions แต่เริ่มต้นด้วย AD อ่านด้านซ้ายเลื่อนโดย 4 บิตหน่วยประมวลผลไม่ทราบความแตกต่างและ doesn t ต้องทำคณิตศาสตร์ในทั้ง 16 จำนวนเต็มบิตทำงานได้ไม่ว่าคุณจะคิดว่าเป็น 12 4 จุดคงที่หรือ 16 จำนวนเต็มจริง 16 0 จุดคงที่โดยทั่วไป คุณต้องเพิ่มบิต N แต่ละขั้วกรองถ้าคุณ don t ต้องการเพิ่มเสียงเนื่องจากการแทนตัวเลขในตัวอย่างข้างต้นตัวกรองที่สองของสองจะต้องมี 10 4 4 18 บิตจะไม่สูญเสียข้อมูลในทางปฏิบัติใน เครื่อง 8 บิตหมายความว่าคุณใช้ค่าบิต 24 ค่าทางเทคนิคเฉพาะขั้วที่สองของสองจะต้องมีค่ามากขึ้น แต่สำหรับความเรียบง่ายของเฟิร์มแวร์ฉันมักใช้การแทนเดียวกันและรหัสเดียวกันสำหรับเสาทั้งหมดของตัวกรองโดยปกติฉัน เขียนโปรแกรมย่อยหรือแมโครไปยัง p erform การดำเนินงานเสาหนึ่งกรองแล้วใช้ที่แต่ละขั้วไม่ว่าจะเป็น subroutine หรือ macro ขึ้นอยู่กับว่าหน่วยความจำรอบหรือโปรแกรมมีความสำคัญมากขึ้นในโครงการเฉพาะใด ๆ ไม่ว่าจะด้วยวิธีใดฉันใช้รัฐบางรอยขีดข่วนเพื่อส่ง NEW เข้าไปในแมโคร subroutine ซึ่งปรับปรุง FILT แต่ยังโหลดว่าเป็นรัฐเดียวกับการขีดข่วน NEW อยู่ในนี้ทำให้ง่ายต่อการใช้เสาหลายตั้งแต่ FILT ปรับปรุงของเสาหนึ่งเป็นใหม่ของถัดไปเมื่อ subroutine ก็มีประโยชน์ที่จะมีจุดชี้ไป FILT on วิธีการในซึ่งมีการปรับปรุงไปเพียงหลังจาก FILT ในทางออกวิธีการ subroutine ทำงานโดยอัตโนมัติในตัวกรองต่อเนื่องในหน่วยความจำถ้าเรียกว่าหลายครั้งด้วยแมโครคุณ don t ต้องการตัวชี้ตั้งแต่คุณผ่านในที่อยู่ในการทำงานในแต่ละซ้ำ. Code Examples. Here เป็นตัวอย่างของแมโครตามที่อธิบายไว้ข้างต้นสำหรับ PIC 18.And นี่คือแมโครที่คล้ายกันสำหรับ PIC24 หรือ dsPIC 30 หรือ 33 ทั้งสองตัวอย่างนี้จะใช้เป็นแมโครใช้ preprocessor assembler PIC ของฉันซึ่งเป็น m แร่ที่มีความสามารถสูงกว่าสิ่งอำนวยความสะดวกที่มีอยู่ภายในตัวใดตัวหนึ่ง clabacchio ปัญหาอื่นที่ควรจะกล่าวถึงคือการใช้งานเฟิร์มแวร์คุณสามารถเขียนโพรโตคอลผ่านต่ำโพรเซสเซอร์ subroutine เพียงครั้งเดียวจากนั้นใช้มันหลายครั้งในความเป็นจริงฉันมักจะเขียนเช่น subroutine เพื่อนำตัวชี้ในหน่วยความจำไปยังสถานะตัวกรองแล้วมีมันล่วงหน้า ตัวชี้เพื่อให้สามารถเรียกได้อย่างต่อเนื่องเพื่อให้ทราบตัวกรองแบบหลายขั้ว Olin Lathrop 20 เม. ย. 55 ที่ 15 03.1 ขอบคุณมากสำหรับคำตอบของคุณ - ทั้งหมดของพวกเขาฉันตัดสินใจที่จะใช้ตัวกรอง IIR นี้ แต่ตัวกรองนี้ไม่ได้ใช้เป็น Standard LowPass Filter เนื่องจากต้องใช้ Counter Values ​​ค่าเฉลี่ยและเปรียบเทียบเพื่อตรวจจับการเปลี่ยนแปลงใน Range เนื่องจากค่าเหล่านี้เป็นมิติที่แตกต่างกันไปโดยขึ้นอยู่กับฮาร์ดแวร์ที่ฉันต้องการใช้โดยเฉลี่ยเพื่อให้สามารถตอบสนองต่อฮาร์ดแวร์เหล่านี้ได้ การเปลี่ยนแปลงที่เฉพาะเจาะจงโดยอัตโนมัติ sensslen 21 พฤษภาคมที่ 12 06. ถ้าคุณสามารถอยู่กับข้อ จำกัด ของอำนาจของสองจำนวนรายการเฉลี่ยเช่น 2,4,8,16,32 ฯลฯ แล้วแบ่งได้อย่างง่ายดายและมีประสิทธิภาพสามารถทำได้ใน ไมโครประสิทธิภาพต่ำโดยไม่แบ่งเฉพาะเพราะสามารถทำได้เป็นเปลี่ยนบิตกะขวาแต่ละคนเป็นหนึ่งในอำนาจของทั้งสองเช่น OP คิดว่าเขามีสองปัญหาแบ่งใน PIC16 และหน่วยความจำสำหรับแหวนของเขา buffer คำตอบนี้แสดงให้เห็นว่าการแบ่ง ไม่ใช่เรื่องยากเป็นที่ยอมรับมันไม่ได้อยู่ที่ปัญหาหน่วยความจำ แต่ระบบ SE ช่วยให้คำตอบบางส่วนและผู้ใช้สามารถใช้อะไรจากคำตอบสำหรับตัวเองหรือแม้กระทั่งการแก้ไขและรวมคำตอบอื่น ๆ s เนื่องจากบางส่วนของคำตอบอื่น ๆ ต้องมีการดำเนินการแบ่งพวกเขา ยังไม่สมบูรณ์เหมือนกันเนื่องจากไม่แสดงวิธีการอย่างมีประสิทธิภาพบรรลุนี้ใน PIC16 มาร์ติน 20 เมษายน 12 ที่ 13 01. มีคำตอบสำหรับการกรองเฉลี่ยจริงกรอง aka boxcar กรองกับความต้องการหน่วยความจำน้อยลงถ้าคุณ don t ใจ downsampling It s เรียกว่าตัวกรองแบบผสมผสานแบบเรียงซ้อน (Cascaded Integrator-comb filter) CIC แนวคิดก็คือคุณมีตัวรวบรวมข้อมูลซึ่งคุณใช้ความแตกต่างในช่วงเวลาหนึ่ง ๆ และอุปกรณ์ประหยัดหน่วยความจำที่สำคัญคือโดยการสุ่มตัวอย่างคุณจะไม่ต้องเก็บอีเวน ry ค่าของ integrator สามารถดำเนินการโดยใช้ pseudocode ต่อไปนี้ความยาวเฉลี่ยที่มีประสิทธิภาพของการเคลื่อนที่ของคุณคือ decimationFactor stateize แต่คุณจะต้องเก็บตัวอย่างเกี่ยวกับ statesize แน่นอนคุณจะได้รับประสิทธิภาพที่ดีขึ้นถ้า statesize และ decimationFactor ของคุณมีอำนาจของ 2 เพื่อให้ ส่วนแบ่งและตัวดำเนินการที่เหลือได้รับการแทนที่โดยการเปลี่ยนแปลงและหน้ากาก - ands. Postscript ฉันเห็นด้วยกับ Olin ว่าคุณควรพิจารณาตัวกรอง IIR แบบธรรมดาก่อนที่ตัวกรองค่าเฉลี่ยที่เคลื่อนที่ถ้าคุณไม่จำเป็นต้องมี nulls ค่าของตัวกรอง boxcar 1 ขั้ว หรือตัวกรองความถี่ต่ำ 2 ขั้วอาจจะทำงานได้ดีในทางกลับกันถ้าคุณกำลังกรองเพื่อจุดประสงค์ในการ decimation โดยใช้อินพุตที่มีอัตราการสุ่มตัวอย่างสูงและใช้ค่าเฉลี่ยสำหรับการใช้งานโดยกระบวนการที่มีอัตราต่ำ อาจเป็นเพียงสิ่งที่คุณกำลังมองหาโดยเฉพาะอย่างยิ่งถ้าคุณสามารถใช้ stateize 1 และหลีกเลี่ยง ringbuffer ทั้งหมดพร้อมเพียง value. There integrator ก่อนหน้านี้มีการวิเคราะห์ในเชิงลึกของคณิตศาสตร์ที่อยู่เบื้องหลังการใช้คำสั่งแรก er IIR filter ที่ Olin Lathrop ได้อธิบายไว้แล้วเกี่ยวกับการแลกเปลี่ยน stack การประมวลผลสัญญาณภาพดิจิตอลรวมถึงภาพสวย ๆ มากมายสมการนี้เป็นตัวกรอง IIR ซึ่งสามารถใช้งานได้โดยใช้ integers เพียงอย่างเดียวและไม่มีการหารโดยใช้โค้ดต่อไปนี้อาจต้องมีการดีบั๊กตามที่ฉัน กำลังพิมพ์จากหน่วยความจำตัวกรองนี้ประมาณค่าเฉลี่ยเคลื่อนที่ของตัวอย่าง K ล่าสุดด้วยการกำหนดค่าของอัลฟาไปเป็น 1 K ให้ทำดังนี้ในโค้ดข้างต้นด้วยการกำหนด BITS ไปที่ LOG2 K นั่นคือ K 16 ชุด BITS ถึง 4 สำหรับ K 4 ชุด BITS ถึง 2 ฯลฯ ฉันจะตรวจสอบรหัสที่ระบุไว้ที่นี่ทันทีที่ฉันได้รับการเปลี่ยนแปลงและแก้ไขคำตอบถ้า needed. answered 23 มิถุนายนที่ 4 04.Here sa เดียวขั้วต่ำผ่านกรองเฉลี่ยเคลื่อนที่ด้วย cutoff ความถี่ CutoffFrequency ง่ายมากอย่างรวดเร็วทำงานได้ดีและเกือบจะไม่มีหน่วยความจำ overhead. Note ตัวแปรทั้งหมดมีขอบเขตเกินกว่าฟังก์ชั่นการกรองยกเว้นผ่านใน newInput. Note นี่คือตัวกรองขั้นตอนเดียวหลายขั้นตอนสามารถ cascaded กันเพื่อเพิ่ม ความคมชัดของ ตัวกรองถ้าคุณใช้มากกว่าหนึ่งขั้นตอนคุณจะต้องปรับ DecayFactor เป็นที่เกี่ยวข้องกับ Cutoff ความถี่เพื่อชดเชยและเห็นได้ชัดทั้งหมดที่คุณต้องเป็นทั้งสองสายที่วางไว้ที่ใดก็ได้พวกเขา don t จำเป็นต้องใช้ฟังก์ชันของตัวเองตัวกรองนี้จะมี เวลาเริ่มทำงานก่อนค่าเฉลี่ยเคลื่อนที่ของสัญญาณอินพุตหากคุณต้องการหลีกเลี่ยงเวลาในการรับส่งสัญญาณคุณสามารถเริ่มต้น MovingAverage ให้เป็นค่าแรกของ newInput แทน 0 และหวังว่าอินเทอร์เฟซใหม่จะไม่เป็นค่าผิดปกติ CutRequest SampleRate มีช่วงระหว่าง 0 ถึง 0 5 DecayFactor คือค่าระหว่าง 0 ถึง 1 โดยปกติแล้วจะใกล้เคียงกับ 1.Single-precision floats ที่ดีพอสำหรับสิ่งต่างๆส่วนใหญ่ฉันชอบคู่ถ้าคุณต้องการติดตัวเลขจำนวนเต็มคุณสามารถ แปลง DecayFactor และ Amplitude Factor เป็นเศษเล็กเศษน้อยจำนวนเต็มซึ่งเป็นตัวเลขที่ถูกเก็บไว้เป็นจำนวนเต็มและตัวหารเป็นจำนวนเต็มของ 2 ดังนั้นคุณจึงสามารถเปลี่ยนบิตไปทางด้านขวาเป็นตัวหารแทนที่จะต้องแบ่งระหว่างลูปไหว ตัวอย่างเช่นถ้า DecayFactor 0 99 และคุณต้องการใช้ integers คุณสามารถตั้งค่า DecayFactor 0 99 65536 64881 จากนั้นทุกครั้งที่คุณคูณด้วย DecayFactor ในลูปไส้กรองของคุณเพียงแค่เปลี่ยนผล 16.For ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้เป็นหนังสือที่ยอดเยี่ยมที่ s บทที่ 19 เกี่ยวกับตัวกรอง recursive. PS สำหรับกระบวนทัศน์ Moving Average วิธีการที่แตกต่างกันในการตั้งค่า DecayFactor และ AmplitudeFactor ที่อาจเกี่ยวข้องกับความต้องการของคุณมากขึ้นสมมติว่าคุณต้องการก่อนหน้านี้ประมาณ 6 รายการโดยเฉลี่ย tog ether ทำ discretely คุณ d เพิ่ม 6 รายการและหารด้วย 6 เพื่อให้คุณสามารถตั้งค่า AmplitudeFactor เป็น 1 6 และ DecayFactor เป็น 1 0 - AmplitudeFactor. answered 14 พฤษภาคม 12 ที่ 22 55 ทุกคนอื่นได้แสดงความคิดเห็นอย่างละเอียดเกี่ยวกับยูทิลิตี้ ของ IIR vs FIR และในอำนาจของสองฝ่ายฉัน d ต้องการให้รายละเอียดการใช้งานด้านล่างทำงานได้ดีใน microcontrollers ขนาดเล็กไม่มี FPU ไม่มีการคูณและถ้าคุณเก็บ N พลังของทั้งสองฝ่าย เป็น single-cycle bit-shifting บัฟเฟอร์ ring FIR พื้นฐานเก็บบัฟเฟอร์ที่กำลังทำงานของค่า N ล่าสุดและ SUM ที่ใช้งานของค่าทั้งหมดในบัฟเฟอร์แต่ละครั้งที่มีตัวอย่างใหม่เข้ามาให้ลบค่าที่เก่าแก่ที่สุดในบัฟเฟอร์จาก SUM แทนที่ด้วยตัวอย่างใหม่เพิ่มตัวอย่างใหม่ให้ SUM และ SUM N Modified IIR buffer เอาต์พุตจะมีค่า SUM ที่กำลังทำงานอยู่ของค่า N ล่าสุดทุกครั้งที่มีตัวอย่างใหม่มาให้ SUM - SUM N เพิ่มในใหม่ ตัวอย่างและผลลัพธ์ SUM ตอบเมื่อสิงหาคม 28 13 เวลา 13 45. ถ้าฉันอ่านคุณถูกต้องคุณจะอธิบายคำสั่งแรก IIR กรองค่าที่คุณลบออกใหม่ไม่ใช่ค่าที่เก่าแก่ที่สุดซึ่งหลุดออก แต่แทนที่จะเป็นค่าเฉลี่ยของค่าก่อนหน้าตัวกรอง IIR ของ First-order จะเป็นประโยชน์อย่างแน่นอน แต่ฉันไม่แน่ใจว่าคุณหมายถึงอะไรเมื่อคุณแนะนำว่าเอาต์พุต เป็นเหมือนกันสำหรับทุกสัญญาณเป็นระยะ ๆ ที่อัตราการสุ่มตัวอย่าง 10 กิโลเฮิรตซ์การป้อนคลื่นความถี่ 100Hz ลงในตัวกรองกล่อง 20 เฟสจะทำให้สัญญาณที่เพิ่มขึ้นอย่างสม่ำเสมอสำหรับ 20 ตัวอย่างอยู่สูง 30 หยดอย่างสม่ำเสมอสำหรับ 20 ตัวอย่างและอยู่ต่ำ สำหรับ 30 A แรกสั่ง IIR supercat กรอง 28 สิงหาคม 13 ที่ 15 31.will ผลคลื่นที่รุนแรงเริ่มเพิ่มขึ้นและค่อยๆระดับออกใกล้ แต่ไม่ได้ใส่ที่สูงสุดแล้วอย่างรวดเร็วเริ่มลดลงและค่อยๆระดับปิดใกล้ แต่ไม่ได้ที่อินพุท น้อยมาก supercat พฤติกรรมที่แตกต่างกัน Aug 28 13 at 15 32.One ก็คือค่าเฉลี่ยเคลื่อนที่ที่เรียบง่ายอาจจะหรืออาจจะไม่เป็นประโยชน์กับตัวกรอง IIR คุณจะได้รับตัวกรองที่ดีกับ calcs ค่อนข้างน้อย FIR ที่คุณอธิบายสามารถให้คุณได้ รูปสี่เหลี่ยมผืนผ้าในเวลา - sinc in freq - และคุณสามารถ t จัดการด้าน lobes มันอาจจะดีคุ้มค่าที่จะโยนในจำนวนเต็มไม่กี่คูณเพื่อให้เป็น FIR ปรับสมมาตรที่ดีถ้าคุณสามารถประหยัดนาฬิกา ticks Scott Seidman 29 สิงหาคม 13 ที่ 13 50 ScottSeidman No ต้องคูณถ้าหนึ่งมีเพียงขั้นตอนของ FIR ทั้งสองเอาท์พุทค่าเฉลี่ยของการป้อนข้อมูลไปยังขั้นตอนนั้นและค่าที่เก็บไว้ก่อนหน้านี้และจากนั้นเก็บข้อมูลถ้ามีช่วงตัวเลขหนึ่งสามารถใช้ผลรวมมากกว่าเฉลี่ยไม่ว่าจะเป็น s ดีกว่าตัวกรองกล่องขึ้นอยู่กับโปรแกรมการตอบสนองขั้นตอนของตัวกรองกล่องที่มีความล่าช้ารวม 1ms ตัวอย่างเช่นจะมีการบีบ d2 dt น่ารังเกียจเมื่อการเปลี่ยนแปลงการป้อนข้อมูลและอีกครั้ง 1ms ต่อมา แต่จะมีขั้นต่ำที่เป็นไปได้ d dt สำหรับตัวกรองที่มี superms 1ms ล่าช้า 29 สิงหาคม 13 ที่ 15 25. เป็น mikeselectricstuff กล่าวว่าถ้าคุณต้องการจริงๆเพื่อลดความต้องการหน่วยความจำของคุณและคุณ don t ใจการตอบสนองต่อแรงกระตุ้นของคุณเป็นเลขแทนของชีพจรรูปสี่เหลี่ยมผืนผ้าฉัน จะไปสำหรับการเคลื่อนที่แบบเอ็กซ์เรย์แทน กรองความโกรธฉันใช้พวกเขาอย่างกว้างขวางกับชนิดของตัวกรองที่คุณ don t ต้อง buffer คุณ don t ต้องเก็บตัวอย่างที่ผ่านมา N เพียงหนึ่งดังนั้นความต้องการหน่วยความจำของคุณได้รับการลดลงโดยปัจจัยของ N. นอกจากนี้คุณ don t ต้องใด สำหรับ multiplications เฉพาะที่ถ้าคุณมีการเข้าถึงเลขคณิตลอยเลขใช้ทศนิยม multiplications มิฉะนั้นจะทำ multiplications จำนวนเต็มและเลื่อนไปทางขวา แต่เราอยู่ในปี 2012 และผมอยากจะแนะนำให้คุณใช้คอมไพเลอร์และ MCUs ที่ช่วยให้คุณ เพื่อทำงานกับตัวเลข floating-point นอกจากนี้หน่วยความจำที่มีประสิทธิภาพมากขึ้นและเร็วขึ้นคุณ don t ต้องปรับปรุงรายการในบัฟเฟอร์วงกลมใด ๆ ที่ฉันจะบอกว่ามันเป็นธรรมชาติมากขึ้นเพราะการตอบสนองแรงกระตุ้นเลขชี้ตรงกับลักษณะทางธรรมชาติจะทำงานในกรณีส่วนใหญ่ ได้ตอบ 20 เมษายนที่ 9 59.One กับตัวกรอง IIR เกือบสัมผัสโดย olin และ supercat แต่เห็นได้ชัดว่าละเลยโดยคนอื่น ๆ ก็คือการปัดเศษแนะนำบางอย่างไม่ถูกต้องและอาจตัดทรราชสมมติว่า N i อำนาจของสองและใช้เลขคณิตจำนวนเต็มเท่านั้นการเปลี่ยนสิทธิจะทำให้ LSBs ของตัวอย่างใหม่เป็นระบบอย่างเป็นระบบนั่นหมายความว่าระยะเวลาที่ชุดข้อมูลจะยาวนานเท่าใดค่าเฉลี่ยจะไม่นำค่าเหล่านี้เข้าสู่บัญชีตัวอย่างเช่นสมมติว่าช้า ลดลงชุด 8,8,8 8,7,7,7 7,6,6 และสมมติว่าค่าเฉลี่ยเป็นจริง 8 ที่จุดเริ่มต้นกำปั้น 7 ตัวอย่างจะนำค่าเฉลี่ยไป 7 ไม่ว่าสิ่งที่กรองความแข็งแรงเพียงแค่หนึ่งตัวอย่างเดียวกัน เรื่องราวสำหรับ 6 ฯลฯ ตอนนี้คิดว่าตรงข้ามซีรีย์ขึ้นค่าเฉลี่ยจะอยู่ที่ 7 ตลอดไปจนกว่าตัวอย่างมีขนาดใหญ่พอที่จะทำให้มันเปลี่ยนแปลงได้แน่นอนคุณสามารถแก้ไขความอคติโดยการเพิ่ม 1 2 N 2 แต่ ที่ได้รับรางวัล t จริงๆแก้ปัญหาความแม่นยำในกรณีที่ชุดลดลงจะอยู่ที่ 8 ตลอดจนตัวอย่างเป็น 8-1 2 N 2 สำหรับ N 4 ตัวอย่างใด ๆ เหนือศูนย์จะให้ค่าเฉลี่ยไม่เปลี่ยนแปลงผมเชื่อว่าการแก้ปัญหาสำหรับ นั่นหมายความว่าจะถือสะสมของ LSBs หายไป แต่ฉัน didn t ทำให้ไกลพอที่จะมีรหัสพร้อม, และฉันไม่แน่ใจว่ามันจะไม่เป็นอันตรายต่ออำนาจ IIR ในกรณีอื่น ๆ ของชุดเช่น 7,9,7,9 จะเฉลี่ย 8 แล้ว. โอลินน้ำตกสองขั้นตอนของคุณก็จะต้องมีคำอธิบายอยู่บ้างคุณหมายถึงการเก็บค่าเฉลี่ย 2 ค่าด้วยผลลัพธ์จากการป้อนข้อมูลครั้งแรกเป็นครั้งที่สองในแต่ละรอบข้อมูลสิ่งที่เป็นประโยชน์นี้

No comments:

Post a Comment