יום ראשון, 24 במרץ 2013

אסטרטגיות להאצת ישומי ואלגוריתמי MATLAB

ממש לאחרונה התפרסמה באתר MathWorks סקירה בסיסית של האסטרטגיות השונות להאצת ישומי ואלגוריתמי MATLAB. בין היתר, נידונות בסקירה אסטרטגיות כמו אלוקציה מראש של זיכרון, שימוש במספר מעבדים או בכרטיס המסך (GPU), שיטות לכתיבת אלגוריתמים טובים יותר, היתרונות בעבודה עם System Objects ויצירה אוטומטית של קבצי MEX.

לקריאת הסקירה, לחצו כאן.

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

יום שלישי, 12 במרץ 2013

Time scope is money

לא רבים מכירים את כלי הויזואליזציה time scope שהושק ב-DSP System Toolbox לפני כ-3 שנים ושופר מאז בכל גרסה וגרסה.


הנה כמה מיתרונות הכלי הזה להצגת אותות בזמן, המגיע גם בצורת בלוק וגם בצורת system object (להסבר על system objects, לחצו כאן):

1. הכלי מאפשר ביצוע מדידות שונות באמצעות סמנים, ביצוע ניתוחים סטטיסטיים על האות (מקסימום, מינימום, Peak to Peak וכו') ומציאת Peaks באות בזמן אמת (ראו משולש צהוב במרכז התמונה לעיל, ניתן ללחוץ עליה כדי להגדילה).

2. הכלי מסוגל לקבל קלט מבוסס-דגימות (samples), קלט מבוסס-קבוצות-דגימות
(frames) או קלט רציף.

3. פרט לקלט ממשי, הן הבלוק והן ה-system object מסוגלים לקבל קלט מרוכב, ולהציג אותו אוטומטית כמגניטודה ופאזה, או להציג את מרכיבו הממשי לצד מרכיבו המדומה.

4. ניתן להציג מספר אותות במערכת צירים אחת או יותר (אפשר לשלוט על מספר מערכות הצירים לאורך המסך ולרוחבו).

5. אפשר לשלוט על התקדמות הסימולציה ישירות מתוך גרסת הבלוק של הכלי – בפינה השמאלית העליונה בתמונה שלעיל ניתן לראות לחצני "התחל", "השהה" ו"הפסק".

6. ניתן למצוא את מיקום בלוק ה-time scope במודל על ידי לחיצה על Highlight Simulink Block בפינה השמאלית העליונה של הממשק (כתוצאה – צבע צהוב יהבהב סביב הבלוק).

האם הכרתם את ה-time scope לפני הפוסט הזה? אם כן, האם אתם משתמשים בו? אילו פיצ'רים חסרים לכם בכלי הויזואליזציה הזה?



יום ראשון, 17 בפברואר 2013

עובדים מהר מדי בסביבת MATLAB? אתם עלולים לקבל דו"ח!

אני שמח לארח בבלוג פעם נוספת את רוני פאר, אשר כתב פוסטים רבים עד כה, האחרון שבהם - לפני שלושה חודשים. הפוסט של רוני יעסוק הפעם ביכולות הפקת הדו"חות מתוך סביבת MATLAB.


בעברי כסטודנט מצאתי את עצמי לא מעט פעמים מבצע פעולות העתק+הדבק על מנת לקחת גרפים שהופקו מ-MATLAB ולשתול אותם במסמך שאותו הייתי צריך להגיש. תמיד הנחתי שישנה דרך נוחה יותר לעשות זאת, ושגם בטח יש שיטה יעילה יותר מה-Equation Editor בשביל לשתול את כל הנוסחאות הרלוונטיות. אבל בשעה אחת בלילה, בזמן ששאר חבריי למעונות היו מבלים או ישנים, לא כל כך היה את מי לשאול...

לא הרבה יודעים את זה, אבל מתוך קבצי MATLAB, גרפים, דיאגרמות Simulink וטבלאות Stateflow ניתן להפיק בקלות מסמכי תיאור ודו"חות בפורמטים שונים, כמו:
RTF, XML, PDF, DOC ו-HTML. יכולות אלו עשויות לחסוך לכם לא מעט זמן, בין אם אתם סטודנטים ובין אם אתם חוקרים או מהנדסים בתעשיה.

אז, אם ברצוני לבצע את הפעולות הבאות:

• לייצר נוסחאות הכוללות פקודות LaTeX

• לפרמט את הטקסט והפונטים כך שיכללו הדגשות, קווים נטויים, לינקים וכו'

• להפיק רשימות ממוספרות או עם Bullets

• לתפוס גרפים שהוכנו בעזרת MATLAB ולשלב אותם במסמך חיצוני

יש כמה דרכים לעשות זאת !

הדרך הראשונה היא על ידי שימוש בפקודה "publish" המובנית ב-MATLAB, ורועי התייחס אליה כחלק מהפוסט שלו שנקרא "עולם הפרסום" שפורסם לפני כשלוש שנים. פקודה זו לוקחת קובץ MATLAB, ובהתאם למבנה שלו היא מפיקה ממנו מסמך הכולל קטעי קוד, הערות, גרפים ותמונות שמופקים כתוצאה מהרצת הקוד וכו'. בגרסת R2012b כל היכולות הרלוונטיות שולבו ב-TAB בעל השם PUBLISH, והוא יתגלה לכם כאשר תהיו במצב עריכה של קובץ m:

סרגל PUBLISH בגרסת R2012b

אופציה זו היא שימושית מאוד, בעיקר אם עובדים עם פונקציה או סקריפט בודד, ודוגמה לכך נמצאת בתיקיה מכווצת זו (פשוט בצעו publish לדוגמה מספר 1). באופן אישי, בסמינרים שאני מעביר כיום, אני נעזר בפונקציה הזו בכדי לסנכרן את כל ההדגמות שלי (אני משלב מקטעי תיאור של ההדגמה, מוסיף נוסחאות שמתארות התהליך, לינקים שמעבירים אותי בין קבצים ובין הרצות, וכמובן - כל המסמך הזה יכול להיפתח ב-browser של MATLAB או אחד חיצוני). אבל - השיטה הזו בעייתית כאשר רוצים לייצר מסמכים ממספר קבצים או כשרוצים לפרמט את התוצר הסופי בצורה מסויימת, למשל: אם רוצים לייצר מסמך Word שיהיה בעל עמודים ממוספרים, או אם מעוניינים בגרפים עם כותרות משתנות (כתוצאה מעשרות הרצות), או אם רוצים אפשרות לקבוע שלפעמים כן יופקו גרפים ולפעמים לא
(Conditional Reporting).

השיטה השניה מרחיבה את יכולות האפשרות הראשונה והיא בעלת גמישות גבוהה יותר (אבל - לא מגיעה כחלק מחבילת ה-MATLAB הבסיסית). היא נעזרת בפונקציות המובנות במוצר MATLAB Report Generator לצורך שליטה מירבית על פורמט הדו"ח המתקבל. אני מאד אוהב להשתמש בממשק המשתמש שמגיע יחד עם המוצר הזה, ונפתח על ידי הפעלת הפקודה "report". ממשק זה, כפי שניתן לראות למטה, מורכב מ-3 חלקים: בחלק השמאלי רואים את מבנה הדו"ח שהולך ונבנה, בפורמט היררכי של "עץ". בחלק האמצעי ניתן לראות רשימה של אובייקטים מוכנים, המחולקים לנושאים (אובייקט הוא בעצם פקודה שתשמש לפירמוט הדו"ח, ופקודה שכזו לדוגמא יכולה להיות "פרק חדש", "תת-פרק חדש", "טבלה", "figure" או "לולאת FOR"). בחלק הימני ניתן לראות את התכונות המשוייכות לאובייקט (למשל, עבור תמונה, ניתן לראות את הגודל שלה, האוריינטציה ועוד).

ממשק המשתמש בכלי  MATLAB Report Generator 

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

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

• טעינת מידע מתוך קבצים (m, MAT) וביצוע פעולות מקדימות נוספות

• הגדרת פרמטרי הבעיה ומספר ההרצות (או התנאים) לכל פרמטר

• בדיקה בלולאות (לרוב לפחות 2 לולאות עבור לפחות 2 פרמטרים)

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

• ריכוז נתונים בטבלה או בגרף מסכם

• פעולות לאחר הריצה – שמירת תוצאות ל-MAT, מחיקת משתנים

את כל הפעולות הללו ניתן לבצע בעזרת פקודת report, ודוגמה לכך נמצאת בתיקיה מכווצת זו (בדוגמה מספר 2 יש קובץ לדוגמה וכן מסמך PDF שנוצר בעקבות הפעלתו).

ולפני סיום, כמה מילים על הפקת דו"חות מסביבת Simulink - אלה מכם שעובדים בסביבת Simulink ישמחו לדעת שה-Simulink Report Generator, שהוא מוצר נוסף, מוסיף לכל היכולות שהוזכרו לעיל אובייקטים מוכנים לבלוקים של Simulink ושל Stateflow, וגם הוא כולל בתוכו טמפלייטים מוכנים של דו"חות. ניתן להיעזר במוצר זה ישירות מתוך תפריט ה-File:

דו"חות אוטומטיים עבור Simulink

לדעתי - אחת מהתכונות הכי משמעותית של המוצר הזה עבור מודלי Simulink היא האפשרות לבצע בעזרתו השוואה בין 2 מודלים שונים. כאשר יש 2 גרסאות שונות של מודל מסויים, ניתן לבצע השוואה גרפית בין 2 המודלים, השוואה בין פרמטרים של בלוקים, השוואה בין ה-configuration parameters, ואפילו השוואה בין פונקציות האתחול. ואם אותר הבדל מסויים, אפשר לבחור האם למחוק אותו או למזג אותו בין המודלים בעזרת כלי גרפי מתאים. דוגמה לכך נמצאת בתיקיה מכווצת זו (בדוגמה מספר 3, הכוללת גם מסמך PDF שנוצר כתוצאה מהתהליך), וצילום מסך מופיע למטה: 
השוואה ומיזוג בין מודלי Simulink

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

האם אתם מפיקים דו"חות רבים במסגרת עבודתכם? האם אתם משתמשים באופציית ה-publish, באופציית ה-report או באף אחת מהן? האם אתם מבצעים סימולציות מונטה-קרלו?
 

יום שלישי, 5 בפברואר 2013

לא רק שואב אבק | דברים ש-MATLAB ו-Simulink יכולים לגרום לרובוט לעשות

כמו לפני שנתיים, גם בסוף החודש שעבר השתתפתי בכנס השנתי של חברת MathWorks לעובדי החברה ומפיצי הכלים שלה. גם השנה התקיימה תערוכה של אפליקציות שפיתחו המהנדסים השונים של החברה באמצעות MATLAB ו-Simulink, ואת תשומת ליבי משכה הדגמה מעניינת במיוחד, במסגרתה רובוט חיקה במהירות תנועות של אדם אשר צולם בעזרת מערכת חישת-התנועה Kinect (המבוססת על טכנולוגיה של חברת פריים-סנס הישראלית). הנה סרטון קצר:

ולמי שלא מצליח לראות את הסרטון, הנה רצף תמונות (ניתן ללחוץ כדי להגדיל):
הרובוט המופיע בסרטון ובתמונות הוא NAO, רובוט משוכלל הניתן לתכנות, פרי פיתוח של Aldebaran Robotics, אשר לדברי החברה נמצא בשימוש במאות אוניברסיטאות יוקרתיות ומעבדות מחקר ברחבי העולם. גובהו של הרובוט 57 ס"מ, והוא בעל 25 דרגות חופש, דבר המאפשר לו לבצע תנועות אנושיות. כאמור, בהדגמה שניתן לראות למעלה השתמשו ב-MATLAB ו-Simulink כדי להעביר את המידע שהתקבל ממערכת חישת-התנועה Kinect בתור הוראות לרובוט NAO, במטרה שיחקה במהירות את תנועות האדם אשר ניצב לידו. כיצד עשו זאת?
מודל ה-Simulink אשר שימש לכך מופיע למטה (חלק עליון), והוא עושה שימוש באתר שיתוף הקבצים של MathWorks, בו יש סט של בלוקי Simulink תחת השם Simulink Support for Kinect. אוסף בלוקים זה מאפשר לקחת בקלות את המידע מה- Kinect של מיקרוסופט (או ממערכת Xtion PRO של Asus), להכניסו לתוך Simulink (צד ימין למטה) ולייצר skeleton (צד שמאל למטה), וכל זה קורה בחצי השמאלי של המודל (כלומר בצד שמאל של החלק העליון).
Level-2 MATLAB S-Function (מסומן בחץ ירוק בחצי הימני של המודל) לוקח את ה-skeleton וממיר אותו לזוויות למפרקים הנשלחות כהוראות לרובוט בעזרת ה-API של Aldebaran Robotics.
קשה היה להישאר אדיש מול ההדגמה הזו, ואפילו קליב מולר, ממציא ה-MATLAB, ניסה ללמד את הרובוט מספר תנועות:

מה דעתכם על ההדגמה הזו? האם אי פעם השתמשתם בכלי MathWorks כדי לשלוט על חומרה? ומתי לאחרונה כתבתם S-Function בעצמכם?

יום שני, 14 בינואר 2013

שימוש בעצים לצורך סיווג פרחים | על עצי רגרסיה-קלסיפיקציה

אני שמח לארח בבלוג פעם נוספת את חנן קביץ, אשר כתב מספר פוסטים עד כה, האחרון שבהם - באפריל 2012.


קלסיפיקציה (סיווג) היא שיוך של דגימה לקבוצה מסויימת. אלגוריתם המבצע קלסיפיקציה נקרא מסווג (classifier). מסווגים מהווים חלק מאפליקציות בתחומים שונים, כמו ראיה ממוחשבת (זיהוי אנשים, אותיות וכו'), הערכת הסיכון במתן הלוואה (credit scoring) וקביעת דירוג אשראי (credit rating), מנועי חיפוש באינטרנט וכו'. אחד מהמסווגים הנפוצים ביותר הוא עץ רגרסיה-קלסיפיקציה. עצי רגרסיה וקלסיפיקציה הם עצים בינארים, וככאלה הם נהנים ממספר יתרונות מובנים – הם קלים להבנה ושימוש, זמני הבניה שלהם מהירים וזמני השאילתות מהירים אפילו יותר.

בעצי רגרסיה-קלסיפיקציה "מפרקים" את הקלסיפיקציה בצורה רקורסיבית לאוסף של החלטות לגבי משתני הבעיה, החל בשורש העץ וממנו לעבר העלים. יש מספר דרכים לבנות עץ רגרסיה-קלסיפיקציה, לרוב באמצעות "אלגוריתם חמדן" המתחיל משורש העץ ובכל צומת בוחר את המשתנה "האינפורמטיבי ביותר". המושג "אינפורמטיבי ביותר" ניתן להגדרה באמצעות מספר דרכים, ומכאן עיקר השוני בין השיטות השונות לבניית עצי רגרסיה-קלסיפיקציה. באופן הפשוט ביותר, ניתן למצוא את המשתנה "האינפורמטיבי ביותר" באמצעות בחינת השינוי שמתחולל באנטרופיה כאשר מורידים משתנה ממאגר
המידע (אלגוריתם ID3) . דרך אחרת ופופולרית לא פחות היא Gini Impurity .

ניתן לבנות עצי רגרסיה-קלסיפיקציה בסביבת MATLAB באמצעות פקודת classregtree, ולהציגם באמצעות פקודת view. לשם סיווג דגימה חדשה יש להשתמש בפונקציה predict. שלוש הפקודות משתייכות ל- Statistics Toolbox, ולהלן דוגמה לשימוש בשתי הראשונות מבניהן, לשם סיווג הנתונים במאגר המידע של פישר על פרחי האירוס (ניתן ללחוץ על התמונה להגדלה):

לצד היתרונות הרבים של עצי רגרסיה–קלסיפיקציה, ישנם גם מספר חסרונות, המרכזיים שבהם הינם יכולת פרדיקציה נמוכה בהשוואה למסווגים אחרים, ובעית overfitting. במילים אחרות, העץ לומד לעשות פרדיקציה טובה על המידע אשר שימש לצורך בנייתו, אך לא מסוגל לסווג נכונה דגימות חדשות (בדומה לתלמיד חלש המשנן בעל פה חומר מסוים, אבל לא יודע לענות נכונה על אף שאלה המנוסחת באופן קצת שונה). אחת הדרכים להתגבר על הבעיה הנ"ל היא לבצע גיזום (pruning) לעץ, כלומר להקטין את כמות הצמתים והרמות בעץ, ובסביבת MATLAB הדבר ניתן לביצוע באמצעות פונקצית prune (נחשו לאיזה כלי היא משתייכת). דרך אחרת להתגבר על הבעיה היא לא להסתפק בעץ אחד, אלא לבנות אוסף של עצים, דוגמת מסווג מסוג Bagged trees, אבל על כך ארחיב בהזדמנות אחרת.

לאילו יישומים אתם משתמשים במסווגים? האם אתם עושים שימוש ב-Statistics Toolbox לצורך סיווג?

יום שלישי, 1 בינואר 2013

אז מה היה לנו ?

הבלוג MATLAB with Fun יחגוג בחודש הבא 3 שנים להיווסדו, וזה זמן טוב לעשות כמה סיכומים.

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

בין היתר, יכלתם לקרוא ב-2012 על החידושים בכלי MATLAB ו-Simulink בשתי הגרסאות שיצאו במהלכה (R2012a, R2012b), על יכולות של כלים שונים (כלי אופטימיזציה, כלים לשוק הפיננסי, Wavelet ,SimEvents וכו'...) ועל דרכים ליעל את שיטות העבודה, הקוד והסימולציות שלכם
(System Objects, Simulation Data Inspector, Model Referencing, האצת ביצועים באמצעות FPGA וכו'...). ואפילו יכלתם להוריד קוד MATLAB המסמלץ את פעולת מערכת כיפת ברזל !

העלאת מספר הפוסטים בחודש הביאה לעלייה מרשימה בנתוני הגלישה בבלוג, על פי אתר Google Analytics. בהשוואה ל-2011, חלה ב-2012 עליה במספר הביקורים
בבלוג (31%), במספר המבקרים הייחודיים בו (37%), במספר הדפים הנצפים
בו (33%), בזמן הביקור הממוצע באתר (17%) ובמספר התגובות (88%, הפוסט הכי מטוקבק, אגב, הוא "גילוי פנים בעזרת MATLAB" – קיבל 11 תגובות בחצי שנה).

לפני כשלושה חודשים, הבלוג אפילו הוזכר במסגרת הבלוג "MATLAB Spoken Here" של חברת MathWorks, בפוסט שעסק בקהילות MATLAB ברחבי העולם !

לסיום, הנה רשימת חמשת הפוסטים הנקראים ביותר מאז השקת הבלוג, מהפופולרי ביותר והלאה, אתם מוזמנים לקרוא את אלה שפספסתם:

1. כנגד ארבעה System Toolboxes דיברה תורה (פורסם לפני 20 חודשים)

2. כל המוסיף גורע מזמן הריצה (פורסם לפני 18 חודשים)

3. כיפת ברזל (פוסט של אריאל רובננקו שפורסם לפני 12 חודשים)

4. מה חדש ב-MATLAB ו-Simulink בגרסת R2012a ? (פורסם לפני 10 חודשים)

5. MATLAB 8 ו-Simulink 8 כבר כאן ! (פורסם רק לפני 4 חודשים וכבר במקום החמישי, מסתמן כלהיט היסטרי...)

אשמח לקבל למטה פידבקים על הבלוג, ובכל מקרה - שתהיה לכולנו שנה אזרחית חדשה לא פחות מעניינת מקודמתה, בגזרת ה-MATLAB כמובן...

יום ראשון, 16 בדצמבר 2012

מכחול ושרשרת ברזל | על Link Plot ו-Brush/Select Data


בתחילת החודש העברתי הרצאה במסגרת סמינר בנושא החידושים ב-MATLAB ו-Simulink בגרסאות האחרונות, ולקראת תום ההרצאה הצגתי שקף ובו סקירה של טיפים וטריקים בעבודה עם MATLAB. מפאת קוצר הזמן, לא הייתי יכול להדגים או להסביר כל טיפ וטריק, ולכן ביקשתי מהנוכחים לבחור כמה מראשי הפרקים שבשקף אשר נשמעים להם מעניינים ואשר היו מעוניינים שארחיב עליהם. הקהל בחר ב-Link Plot וב-Brush/Select Data, ובהם יעסוק פוסט זה.

לא רבים יודעים, אך באמצעות Link-Plot ניתן לקשר בין גרף לבין המשתנים שמהם הוא הופק, כך ששינוי של המשתנים יביא לעדכון של הגרף (מבלי שיהיה צורך להפעיל שוב פעם את פקודת ציור הגרף). בנוסף, ניתן אפילו לבצע שינויים במידע על גבי הגרף, כך שהללו יבואו לידי ביטוי גם בגרף וגם במשתנים אשר מהם הוא נוצר (וזאת על ידי Brush/Select Data). והנה דוגמה...

נניח שהפקנו גרף של עשר נקודות במישור X-Y אשר הוגרלו מפילוג אחיד בתחום [0,1] (לחצו על התמונה כדי להגדילה):

ניתן לקשר בין הגרף לבין המשתנים שמהם הוא הופק באמצעות לחצן ה-Link Plot שבתפריט ה-Figure

אם נלחץ עליו, ולמשל נשנה את קואורדינטת ה-X הראשונה ל-5, הגרף יתעדכן בהתאם, מבלי שיהיה צורך להפעיל שוב את פקודת scatter:

משמאל ללחצן ה-Link Plot מופיע לחצן ה-Brush/Select Data

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

ומה אפשר לעשות עם זה? הרשימה המלאה של האפשרויות מופיעה כאשר מקליקים עם הלחצן הימני של העכבר על גבי אחת מהנקודות:

אפשר, למשל, לייצר משתנה חדש מתוך כל הנקודות שמעניינות אותנו (Create Variable), להסיר את הנקודות שמפריעות לנו (Remove) או להחליף את ערכיהן בערכים אחרים (Replace with). למרות שאני מתקשה לחשוב על מקרה שבו נרצה לגרום לנתונים להיראות טובים יותר...

למידע נוסף:
Data Brushing
Data Linking

יום רביעי, 5 בדצמבר 2012

שובם של ה-System Objects

בשלוש שנות קיומו של הבלוג הזה, השתדלתי כמה שפחות למחזר פוסטים. אבל בפוסט הנוכחי אחרוג ממנהגי, מכמה סיבות:
1. חלפו שנתיים וחצי מאז הפוסט האחרון בנושא שבו ארצה לדון
2. בתקופה הזו הנושא התפתח מאוד
3. חברת MathWorks רואה בנושא הזה מרכיב חשוב בתוכניותה לעתיד
4. מעט מאוד אנשים נחשפו לנושא הזה עד כה (בכל פעם שאני שואל את הקהל שאני ניצב מולו האם אנשים מכירים את הנושא, בודדים, אם בכלל, משיבים "כן").

הנושא הינו System Objects, אלגוריתמים העומדים מאחורי אובייקטים הקיימים בסביבת MATLAB כבר 6 גרסאות (מאז גרסת R2010a). כשכתבתי על כך לפני שנתיים וחצי, היו קיימים רק כ-140 אובייקטי מערכת, ורק בתחומים עיבוד אות, עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת. כיום, קיימים כבר כ-330 אובייקטי מערכת, המשמשים ל:
1. עיבוד אות - מעל 95 אובייקטי מערכת ב-DSP System Toolbox
2. עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת - מעל 60 אובייקטי מערכת ב-Computer Vision System Toolbox
3. פיתוח השכבה הפיזית של מערכות תקשורת - מעל 105 אובייקטי מערכת ב-Communications System Toolbox
4. תכנון, סימולציה וניתוח של מערכות מכ"מ, מערכות Ultrasound ומערכות תקשורת מרובות-אנטנות - מעל 60 אובייקטי מערכת ב-Phased Array System Toolbox

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

להבדיל מפונקציות MATLAB, אשר הינן מסוג "y שווה לפונקציה של x", ה-System Objects מסוגלים לעבוד עם קלט משתנה (Streams) וכן מסוגלים לספק מידע על המצבים הפנימיים של הפונקציה. בכך הם מרחיבים את שפת MATLAB באופן המאפשר למדל מערכות דינמיות באמצעות שפה טקסטואלית, ומהווים מעין "גשר" המקשר בין MATLAB ל-Simulink. כמובן שאם כתבתם אלגוריתם ב-MATLAB העושה שימוש ב-System Objects, אתם מוזמנים לנסות להכניס אותו לתוך בלוק ה-MATLAB Function ב-Simulink על מנת לשלבו כחלק ממודל בסביבה הזו.

מבחינת ביצועים – נניח ואתם מעוניינים לבצע Edge Detection לפריימים השונים בסרטון וידאו. בעוד ששימוש בפונקציית edge בתוך לולאה העוברת בין הפריימים השונים יהיה כרוך בקריאה לאותה פונקציה בכל פעם מחדש (דבר אשר כרוך באיתחולים חוזרים ונישנים), עבודה עם אובייקט המערכת vision.EdgeDetector ומתודת step אמורה להיות יעילה יותר. בנוסף, כמה System Objects המשתייכים ל-Communications System Toolbox ול-Phased Array System Toolbox ניתנים להאצה על ידי שימוש ב-GPU (הכרטיס הגרפי של המחשב), תוך שינוי מזערי של הקוד הכתוב.  אם כך, System Objects אמורים להביא לקיצור זמני הריצה של אלגוריתמים ! 

System Objects עשויים להקל על אלה מכם המנסים לבצע סימולציות Fixed-Point בסביבת MATLAB, וכן על מי שמנסה להמיר בקלות קוד MATLAB לקוד C או HDL. כבר כיום יש תמיכה ביצירת קוד C/HDL מתוך מגוון System Objects - למשל, כל
ה-System Objects שבגרסת R2012b של ה-Communications System Toolbox נתמכים ליצירה אוטומטית של קוד C. בהקשר זה, חשוב לציין כי החל מגרסת R2011b יכול כל אחד לפתח System Objects משלו, אשר יוכלו להתממשק אל אלה שפיתחה MathWorks, והחל מגרסת R2012a ניתן להמיר לקוד C כאלה אובייקטי מערכת שהמשתמש פיתח.


System Objects הוא נושא שאני ממליץ לכל אחד להתחיל ללמוד אותו וליישם אותו, שכן כבר היום הם נכללים בחלק גדול מכלי MathWorks - פרט להיותם חלק ממשפחת ה-System Toolboxes (אותם ארבעה כלים שהוזכרו לעיל ואשר קיימים מגרסת R2011a), יש כיום אובייקטי מערכת גם בכלים Image Acquisition Toolbox (אובייקט המאפשר רכישת תמונה הנתמך ליצירה אוטומטית של קוד C) ו-HDL Verifier (אובייקט המאפשר לבצע סימולציות FPGA-in-the-loop תוך שימוש ב-MATLAB ו-FPGA בלבד). וכפי שנכתב קודם, MathWorks מתכוונת להמשיך לפתח את הנושא הזה בשנים הבאות.

לרשימת ה-System Objects בארבעת ה-System Toolboxes המוזכרים לעיל, לחצו על הקישורים הבאים:
DSP
Computer Vision
Communications
Phased Array

יום שני, 19 בנובמבר 2012

המפקח על הסימולציות לעזרתכם | שימוש ב-Simulation Data Inspector לבחינת אלגוריתם והפרמטרים שלו

"הרשו לי לפנות את הבמה בפוסט הזה פעם נוספת לטובת רוני פאר, אשר עובד יחד עמי בחברת סיסטמטיקס והתארח בבלוג הזה מספר פעמים, האחרונה שבהן – לפני חודש".


לאחרונה הזדמן לי לשוחח עם מספר מהנדסים שביצעו את הפעולות הבאות בסביבת סימולינק:

• להריץ סימולציה
• לשנות סט של פרמטרים חשובים (למשל מקדמי בקר או מסנן, תגובת הזמן של אחת מפונקציות התמסורת, או פרמטר "אנושי" כמו מסה)
• להריץ שוב את הסימולציה (עם הפרמטרים המעודכנים) ולהשוות בין תוצאותיה לתוצאות הסימולציה המקורית

תהליך העבודה של אותם האנשים היה לכתוב GUI בסביבת MATLAB שמרכז את כל תוצרי הסימולציה, מריץ את המודל, מבצע Logging לכל הנתונים ולבסוף מציג אותם בעזרת Figures. הבעיה בשיטה הזו היא שכאשר אותם מהנדסים רצו להוסיף עוד אותות או פרמטרים, הם היו חייבים לשנות בצורה משמעותית את הקוד ואת ה-GUI. שיטת עבודה עדיפה היתה שימוש ב-Simulation Data Inspector, אשר קיים עוד מגרסת R2010b של כלי MathWorks (לחצו לסרטון ישן בנושא).

למי שהצליח לא לשים לב ל-Simulation Data Inspector, החל מגרסת R2012b של תוכנת Simulink, שיצאה לפני כחודשיים – אי אפשר להתחמק מכפתור ההקלטה האדום שנמצא במרכז החלק העליון של ה-Editor החדש. ולאלה מכם שמעוניינים להשתמש בו – להלן הדרך המקובלת.

ראשית, יש לבחור את האותות אשר רוצים להשוות בין ערכיהם בסימולציות השונות. קליק-ימני של העכבר על האות, ואז Properties, נותן את האפשרות לבצע "Log Signal Data". בחירה באופציה הזו תביא להופעת Badge כחול שנראה כמו אנטנה משדרת. ניתן לראות בתמונה למטה את החלון שנפתח לאחר הבחירה ב-Properties, וכן מספר Badges כחולים (לחצו על התמונה כדי להגדיל אותה במקצת).


לאחר שהגדרנו את האותות, יש לבחור בכפתור ההקלטה האדום, ה-"Record and Inspect Simulation Output". בלחיצה על כפתור זה, כל סימולציה עתידית שתופעל תישמר לתוך פרמטר מתאים ב-Workspace. אגב, בתמונה למטה ניתן לשים לב לכך שמימין לכפתור האדום ישנו חץ הרחבה המאפשר לפתוח את ה-Configure Data Logging שבעזרתו ניתן לשלוט בפירוט רב יותר על האותות שייאגרו והפורמט שבו יישמר המידע, וכן לבצע Override (או הפעלה וכיבוי) לאותות שברצוננו לשמור בכל סימולציה.


נריץ את הסימולציה עבור סט מסויים של פרמטרים, והתוצאות יישמרו בצורה אוטומטית. לאחר מכן, נשנה את הפרמטר Ta, השולט על זמן התגובה של המערכת, כך שיהיה ארוך יותר, ונריץ שוב את הסימולציה.

בכדי להשוות בין תוצאות שתי הסימולציות, כל שיש לעשות הוא ללחוץ על הקישור שמופיע בחלקו העליון של המודל:


בחלון ה-Simulation Data Inspector שנפתח כל ריצה מסומנת ב-RUN עם אינדקס מתאים, וניתן לראות שלוש לשוניות (Tabs) ברורות: הצגת המידע, השוואה בין האותות השונים, והשוואה בין הריצות השונות.

הלשונית הראשונה מאפשרת להציג כל אות או מספר אותות על אותה מערכת צירים. פשוט מסמנים ב-V את כל האותות המעניינים אותנו, והכלי כבר ידאג לכל השאר.


כפי שנכתב למעלה, הלשוניות השניה והשלישית מאפשרות להשוות בין שני אותות או בין שתי ריצות שונות, דוגמה לתוצאת ההשוואה בין שתי הסימולציות מובאת להלן, ומאחר ושינינו פרמטר השולט על זמן התגובה של המערכת, ניתן לראות הבדל משמעותי בין שתי הריצות, המתבטא ב"Difference" גבוה בין 2 האותות.


מעבר להצגת המידע וביצוע ההשוואות, ניתן לייצר דו"ח המרכז את כל התוצרים, ישירות מתוך ה-Simulation Data Inspector. כדי לבצע זאת, יש לגשת לתפריט File, ולבחור ב-Generate Report. אפשרות זו, אגב, היא אשר שכנעה סופית את בני שיחי לעבור לשימוש ב-Simulation Data Inspector, שכן הם הבינו שהיא תחסוך להם זמן רב של ביצוע Copy & Paste.


האם הכרתם את ה-Simulation Data Inspector לפני הפוסט הזה? אם לא, האם נראה לכם שתתחילו להשתמש בו מעתה?

יום חמישי, 1 בנובמבר 2012

גל גל גלונים


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

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

STFT
דניס גאבור הציע ב-1946 דרך להתגבר על החסרון הנ"ל של ניתוח פוריה – והיא להשתמש בניתוח הזה על מקטעים של הסיגנל. בעזרת חלון מתאים מקבלים את המקטעים השונים, ועל כ"א מהם עושים את ניתוח פוריה (שבשיטה הקודמת בוצע על האות כולו). האדפטדציה הזו נקראת Short-Time Fourier Transform, והיא ממפה את הסיגנל לפונקציה בשני משתנים: תדר וזמן. ה-STFT הוא סוג של פשרה בין התבוננות על הסיגנל המבוססת על הזמן ובין התבוננות עליו המבוססת על התדר. היא מאפשרת קבלת מידע גם על "מה היו התדרים" וגם על "מתי היו התדרים האלה".
אז מה הבעיה?
הדיוק של המידע הזה מוגבל, והוא תלוי בגודל החלון שבו עושים שימוש. וברגע שבוחרים את גודל החלון – החלון קבוע, יהיו התדרים אשר יהיו. וזו בעיה כיוון שלניתוח של אותות רבים נדרשת גישה יותר גמישה – כזו שבה אפשר לשנות את גודל החלון כדי לקבוע בדיוק רב יותר את זמן או את התדר.
אז מה הפתרון? ניחשתם נכון – ניתוח Wavelet !

ניתוח Wavelet
זהו בעצם השלב הלוגי הבא – טכניקה של עבודה עם חלונות עם גודל משתנה. ניתוח Wavelet מאפשר להשתמש באינטרוולי זמן ארוכים היכן שמעניינת אותה האינפורמציה בתדרים הנמוכים, ובאינטרוולים קצרים יותר היכן שמעניינת אותה האינפורמציה בתדרים הגבוהים. לגלונים, אם כך, יש היבטים של scaling והיבטים של זמן.
היכולת הזו לבצע ניתוח מקומי (ניתוח של אזור מסויים בסיגנל הגדול) חשובה מאוד - קחו לדוגמה גל סינוס בתדר Wo עם עיוות קטנטן, למשל – אי רציפות, שזה משהו שבהחלט יכול לקרות בעולם האמיתי, למשל בגלל פלקטואציה חשמלית או מתג רועש. התמרת פוריה של הסיגנל הזה, שאותה מקבלים ב-MATLAB ע"י פקודת fft, תיתן לנו שני פיקים, ב-Wo וב-Wo-. ניתוח Wavelet, לעומת זאת, יראה בבירור גם את המיקום המדוייק של העיוות על ציר הזמן.

להלן סיכום של ארבע הצורות להצגת סיגנל שעסקנו בהן – בזמן, בתדר, במישור גאבור ובמישור Wavelet:
כיצד מתבצע ניתוח Wavelet
בעוד ניתוח פוריה מפרק סיגנל לסינוסואידות בתדרים שונים, ניתוח Wavelet מפרק סיגנל לגרסאות מוזזות ובעלות סקאלה שונה של גלון האם, גלון המקור. גלון הינו אות בעל משך סופי וממוצע אפס. סינוסואידות, שהן הבסיס לניתוח פוריה, הן כידוע לא בעלות משך סופי. הן גם חלקות וצפויות, בעוד גלונים הינם אי-רגולרים באופיים, וא-סימטריים.
מספר משפחות של גלונים נמצאו כיעילות במיוחד, למשל:
Haar, Daubechues, Biorthogonal, Coiflets, Symlets, Morlet ועוד. ניתן לחקור אותן באמצעות ה-Wavelet Toolbox, וכמובן להשתמש בו על מנת לבצע ניתוח Wavelet תוך שימוש בהן.

אז מה זה בעצם ה-Wavelet Toolbox
Wavelet Toolbox הוא אוסף של פונקציות הפועל בסביבת המיחשוב הטכני של MATLAB, והמאפשר לבצע ניתוח בשיטת Wavelet. בין היתר, ה-Toolbox מאפשר:
• לבחון ולחקור מאפיינים של גלונים בודדים ושל Wavelet packets
• לחקור סטטיסטיקה של אותות ושל מרכיבי אותות
• לבצע התמרת Wavelet רציפה על סיגנל חד-מימדי
• לבצע פירוק והרכבה של אותות חד ודו מימדיים (בדידים)
• לבצע ניתוחי Wavelet packet לאותות חד ודו מימדיים
• לדחוס ולהסיר רעש מאותות ותמונות

ה-Toolbox מספק שני סוגים של כלים:
• פונקציות שהן בעצם m-files שאפשר להשתמש בהן בשורת הפקודה או בסקריפט,
• ממשקים גרפיים אינטראקטיביים (העלאה ע"י פקודת wavemenu או על ידי בחירה
ב-App המתאים בגלריית ה-Apps החל מגרסת R2012b), דוגמאות לשנים מהם מובאות להלן:
ה-Wavelet Toolbox מספק מבוא מקיף לתורת הגלונים ולא מניח ידע קודם בתחום (למעשה, פוסט זה מבוסס ברובו על ה-Help של הכלי). הוא מאפשר לכם להשתמש בטכניקות הכלולות בו באופן מיידי על המידע שלכם, ולקבל תובנות חדשות לגביו. אם אתם מעוניינים להתנסות ב-Wavelet Toolbox, רק שלחו מייל ל-matlab.israel@gmail.com

האם הכרתם את תורת הגלונים לפני הפוסט הזה? האם יצא לכם להשתמש ב-Wavelet Toolbox? האם השתמשתם בפונקציות שבו או בממשק הגרפי שלו?