שְׁאֵלָה:
האם יש ספריות להחלקת אותות לארדואינו?
asheeshr
2014-02-16 19:57:38 UTC
view on stackexchange narkive permalink

אני עובד על רובוט נייד הנשלט באמצעות קישור אלחוטי 2.4 GHz.המקלט מחובר ל- Arduino Uno המשמש על הסיפון כבקר הראשי. ערוץ הכניסה הקריטי (והעיקרי) ביותר המגיע מהמקלט מייצר אות רועש מאוד, המוביל להרבה שינויים קלים ביציאת המפעילים, למרות שאין צורך בכך.

 enter image description here עלילת הקלט של הארדואינו במרווח של 30 שניות. 

אני מחפש ספריות שיכולות לבצע החלקה יעילה. האם יש ספריות להחלקת אותות זמינות עבור Arduino (Uno)?

לא יודע אם אתה יכול למצוא סוג זה של ספריות, אבל אני חושש שייתכן ויהיה צורך בהספק מעבד רב עבור ארדואינו. אני מעדיף ללכת עם פתרון אלקטרוני (מסנן נמוך לעבור) אם אפשר.
אני עם jfpoilpret על זה. אני חושב שאתה צריך פיתרון אלקטרוני. הייתי מנסה קבל ייצוב, (פילטר מעבר נמוך נמוך). אני מניח שאתה משתמש בערוץ ADC, אז עליך לשים מכסה מהערוץ הזה לקרקע. התחל עם ערכים בסביבות 100pf, ועובד משם.
ארבע תשובות:
#1
+9
asheeshr
2014-03-07 20:14:24 UTC
view on stackexchange narkive permalink

Microsmooth היא ספריית החלקת אותות במשקל קל שפותחת על ידי כרגע.

עדיין עובדים עליה והמטרה היא להפוך אותה לקלילה מבחינת זיכרון ומהיר . הספרייה מספקת מספר פילטרים להחלקה:

  • ממוצע נע פשוט
  • ממוצע נע אקספוננציאלי
  • ממוצע נע מצטבר
  • סביצקי גולאי מסנן
  • אלגוריתם של ראמר דאגלס פקר
  • מסנן קלמוגורוב זורנקו

כדי להשתמש בספריה, הורד והוסף אותו לספריית המקור. כמו כן, הוסף את השורה הבאה לקובץ המקור שלך:

  #include "microsmooth.h"  
היי, אני מתקשה להשתמש בספרייה שלך. לא היית משתמש ב"יבוא ספרייה ... "כדי לייבא את הספרייה שלך נכון? ניסיתי פשוט להעתיק את המקור לתיקיית .ino שלי, אבל אני מקבל שגיאות לגבי חסר automicrosmooth.h, הסדרה לא מוגדרת וחסרה ';'. האם הספרייה הזו עדיין עובדת? תודה
@waspinator מצטער על כך. תוקן את השגיאות. תודה על המשוב!
#2
+7
David Cary
2014-03-26 22:37:56 UTC
view on stackexchange narkive permalink

אני חושב שאני רואה הרבה קוצים של רעש בדוגמה אחת באות הרועשת שלך.

המסנן החציוני טוב יותר להיפטר מקוצים של רעש חד-דגמי מכל פילטר ליניארי. (עדיף מכל מסנן נמוך לעבור, ממוצע נע, ממוצע נע משוקלל וכו 'מבחינת זמן התגובה שלו ויכולתו להתעלם ממגדילי רעש חד-מדגמיים כאלה). -החלקת ספריות עבור Arduino, שרבות מהן כוללות מסנן חציוני.

ספריות להחלקת אותות ב arduino.cc:

ספריות להחלקת אותות ב- github:

האם משהו כזה יעבוד ברובוט שלך? (חציון ה- 3 דורש מעט מאוד כוח מעבד, ומכאן מהיר):

  /*median_filter.ino2014-03-25: התחיל על ידי דייוויד קארי * / int median_of_3 (int a, int b, int c) {int the_max = max (max (a , ב), ג); int the_min = min (min (a, b), c); // קוד חכם שלא לצורך int__median = the_max ^ the_min ^ a ^ b ^ c; return (the_median);} int newest = 0; int recent = 0; int elder = 0; setup void () {Serial.begin (9600); // קרא את הערך הראשון, אתחל איתו. הכי ישן = אקראי (200); לאחרונה = העתיק ביותר; הכי חדש = אחרון; Serial.println ("דוגמה למסנן חציוני:");} לולאה בטלה () {
// שחרר את הערך הישן ביותר והזז את הערך האחרון הישן ביותר = אחרון; אחרון = חדש ביותר; הכי חדש = אקראי (200); Serial.print ("ערך חדש:"); Serial.print (הכי חדש, DEC); חציון int = median_of_3 (העתיק, האחרון, החדש ביותר); Serial.print ("ערך מוחלק:"); Serial.print (חציון, DEC); Serial.println (""); עיכוב (5000);}  
#3
+4
TheDoctor
2014-02-16 20:45:56 UTC
view on stackexchange narkive permalink

האם ניסית פילטר נמוך לעבור? מצאתי דוגמה כאן ועוד אחת כאן.

בשתי הספריות הללו יש רשימת נתונים שקוראים מהחיישן האנלוגי שבחרת אשר ממוצע. כל ערך חיישנים חדש נוסף לרשימה, והאחרון נזרק החוצה, כך:

  רשימה: 3 4 3 3 4 3 5 3 2 3 4 3 קריאה חדשה נוספה. ישן שנזרק / - / - רשימה: 5 3 4 3 3 4 3 5 3 2 3 4 ממוצע רשימות  
פחות או יותר מה עושה [פילטר FIR] פשוט (https://en.wikipedia.org/wiki/Finite_impulse_response) עם כל ערכי ההקשה שמוגדרים כ 1. התעסקות בערכי הברזים יכולה לשפר את האות עוד יותר, אך דורשת מתמטיקה גבוהה יותר.
הערה: הקישור השני מחשב את [ממוצע נע מצטבר] (http://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average) שאינו בחירה מעשית לבקרת מפעיל, במיוחד כזה שעשוי לכלול התחלה ועצירה תכופים. האות המוחלק תמיד יעקוב אחר ערך השיא של האות בפועל בהפרש ניכר.
#4
+2
akellyirl
2014-02-16 22:34:31 UTC
view on stackexchange narkive permalink

תוכל לסנן זאת דיגיטלית באמצעות פילטר לעבור נמוך:

  int valueFilt = (1-0.99) * value + 0.99 * valueFilt;  

שנה את ה- 0.99 כדי לשנות את תדירות הניתוק (קרוב יותר ל -1.0 הוא התדירות הנמוכה יותר). הביטוי בפועל לערך זה הוא exp (-2 * pi * f / fs) כאשר f הוא תדר הניתוק הרצוי ו- fs הוא התדירות בה נדגמים הנתונים.

סוג אחר של "פילטר דיגיטלי "הוא מסנן אירועים. זה עובד טוב על נתונים שיש להם חריגים; לְמָשָׁל 9,9,8,10,9,25,9. מסנן אירועים מחזיר את הערך השכיח ביותר. מבחינה סטטיסטית זהו המצב.

ניתן לחשב ממוצעים סטטיסטיים כגון ממוצע, מצב וכו 'באמצעות הספרייה הממוצעת של Arduino.

דוגמה שנלקחה מ דף ספריית Arduino המכונה:

  #include <Average.h> # define CNT 600int d [CNT]; setup up () {Serial.begin (9600);} loop loop () {int אני; עבור (i = 0; i<CNT; i ++) {d [i] = אקראי (500); } Serial.print ("ממוצע:"); Serial.print (ממוצע (d, CNT), DEC); Serial.print ("מצב:"); Serial.print (מצב (d, CNT), DEC); Serial.print ("מקס:"); Serial.print (מקסימום (d, CNT), DEC); Serial.print ("Min:"); Serial.print (מינימום (ד, CNT), DEC); Serial.print ("סטיית תקן:"); Serial.print (stddev (d, CNT), 4); Serial.println (""); Serial.println (""); עיכוב (5000);}  
שים לב שזה יהיה איטי מאוד, מכיוון שהוא עושה הרבה יציקות מרומזות לצוף וחזרה.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...