מבוא

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

הבנת עקרונות DSP C

DSP כרוך בפעולות מתמטיות כגון סינון, שינוי, אבולוציה וניתוח ספקטרלי על אותות מדגימים.ב- C, המתכנתים שולטים בכל היבט של ייצוג נתונים וזרימה, אשר קריטי לביצועים ⁇ סטים.קוד DSP פועל לעתים קרובות על מיקרובקרים או מעבדי אותות דיגיטליים שבהם חומרה הוא מתוחה - לדוגמה, MAC ייעודי (יחידות מכניות) או SIMD-D אפקטים חיוניים, כלומר, הוא מסוגלות זיכרון C.

מאפיינים מרכזיים של קוד DSP:

  • (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) יש לעבד כל דגימה (ב) בפרשת זמן (בפרק: 1) כל דגימה חייבת להיות מעובדת בתוך תקופת הדגימה.
  • (ב) שטף נתונים:0) סטרימינג: פיזור נתונים: שטף 1:1 (ב) שטף שטף וזרימת קלט / קידוד מתמשך דורשות כיפוף יעיל ומינימום העתקה.
  • (ב) אלגוריתמים רבים של DSP מוגבלים על ידי כמה מהר ניתן להעביר נתונים, לא על ידי פעולות ספאריות.

(ב) עיין ב-[[1924]], [[1924]]

שם הסרטון: Arithmetic: Precision Without Floating-Point Overhead

(ב) מעבדי DSP רבים חסרים יחידות תצפית צף (FPUs) או יש איטי יותר FPUs. קבוע סטויינט משתמש פעולות integer עם נקודה רדיוקס בלתי פתיר, מתן ביצועים ⁇ סטיים וצריכת חשמל נמוכה יותר.הייצוג הנפוץ ביותר הוא Qtation: QFLT:0mFLT:2nFLT 3, שבו LT5 ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

ביצוע פעולות קבועות-Point ב-C

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

typedef int16_t q15_t;
q15_t q15_mul(q15_t a, q15_t b) {
 int32_t temp = (int32_t)a * (int32_t)b;
 return (q15_t)(temp >> 15);
}

כאשר הצטברות מתרחשות (למשל, במסננים), ביטים שומרים מונעים על גדותיהם. השתמש ב-32 סיביות או אפילו 64 סיביות של אסימונים ותוצאות קבועות.

מתי להשתמש ב-Switching-Point קבוע לעומת Floating-Point

מעבדים מודרניים עם FPUs (למשל, Cortex-M4/M7) יכולים לבצע פעולות צף במהירות כנקודת זמן קבועה. השתמש בנקודת צף כאשר:

  • טווח דינמי Algorithm הוא גבוה (למשל, מסננים הסתגלות).
  • שמירה על קוד היא עדיפות (ללא ניתוח מדרג).
  • חומרה FPU היא נוכחת צינורות יכול חופף להוסיף ולהכפל.

במכשירים בעלי ערך גבוה ללא FPUs, נקודת קבוע נותרה תקן ליישומים רגישים בעלויות.

אופטימיזציה של Memory Access for DSP

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

  • (FLT:0)Linear data Accessmia: FLT:1 חוצה מערךים בסדר יזום (הגדלה ב C) להימנע מתבניות גישה מתוחות אלא אם נדרש על ידי האלגוריתם (למשל, FFT bitreversal).
  • (ב) ,0) היערכות: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0)Buffering: FLT:1 להשתמש בשחיקה כפולה כדי לחפוף DMA העברות עם עיבוד CPU. בעוד CPU עובד על חיץ אחד, בלוק הדגימה הבא הוא טעון.
  • (ב) ,0) ,6 ,7 (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

לדוגמה, פונקציה פשוטה של מסנן FIR צריכה להיות כתובה עם "הגבלת" כאשר קלט ופלט buffers נפרדים:

void fir_lowpass(const int16_t * restrict x, int16_t * restrict y,
 const int16_t * restrict coeffs, int len, int order) {
 for (int i = 0; i < len; i++) {
 int32_t acc = 0;
 for (int j = 0; j < order; j++) {
 acc += (int32_t)x[i + j] * coeffs[j];
 }
 y[i] = (int16_t)(acc >> 15);
 }
}

בחירה ומניעה

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

  • (FLT:0)Fast Fourier Transform (FFT): ההרחבה 1 (RIRLT:1) משתמשת Cooley-Tukey קורנקס-2 או פיצול-radix עבור כוח-of-Two אורך.מנע מ DFT נאייבי שהוא O(N2).
  • (ב) [15] ,0 ; ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0) מסננים: FLT:1 להשתמש בצורת ישירה II transposed ליציבות המספרית טובה יותר; השתמש בסעיפים דו-קוליים קזנד (שלבים מסדרים שנייה) כדי להפחית את הרגישות להגדרה יעילה יותר.
  • (ב) ⁇ :0 מהפכת: ⁇ 1) עבור רצף ארוך, השתמש בשיטות חפיפות מבוססות FFT או חפיפות ולא באבולוציה ישירה.

(ב) עיין בטכניקות FFT מודרניות (למרות שלא ב- C, עקרונותיה מועתקים באופן נרחב בספריות DSP משובצות).

תכונות קשיחות: הוראות SIMD ו DSP

כמעט כל המיקרובקרים המודרניים כוללים SIMD (Single הוראה מספר נתונים) או הוראות DSP-enhanced.

  • ARM Cortex-M4/M7: SIMD (SADD, SMUAD וכו '), קידוד רווי ופעולות שבריריות (QADD, QSUB) השתמש בפונקציות CMSIS-DSP Intrinsic.
  • TI C6000 DSP: שמונה יחידות להכפיל, MAC כפול, וצנרת תוכנה.The FLT:0TI DSP אופטימיזציה מדריך אופטימיזציה של ההרחבה 1 מספק טכניקות מפורטות.
  • RISC-V עם P-extensions: ליבות עתידיות יהיו הוראות דומות ל-DSP.

כדי להשתמש בתכונות אלה ב C, לכתוב קוד כי המאגד יכול להתאים אוטומטית (למשל, לולאות פשוטות ללא תלות) או להשתמש בפונקציות איטרינריות של ה- ARM CMSIS-DSP עבור מסנן FIR:

#include "arm_math.h"
arm_fir_instance_f32 S;
float32_t firState[128];
arm_fir_init_f32(&S, numTaps, coeffs, firState, blockSize);
arm_fir_f32(&S, input, output, blockSize);

ספריות כאלה מכווננות על ידי הרכב לביצועים מקסימליים.תמיד פרופיל לפני ואחרי מעבר C הגנרית לתפקודי הספרייה.

טכניקות אופטימיזציה

מכיוון שאלגוריתמי DSP הם לולאה-כבדה, אופטימיזציה ברמת לולאה משלמים דיבידנדים גדולים:

  • (ב) ,0) ל"לא לחליפה": "ה'לא' (ב')" (ב') "לבטל את ה') כדי להפחית את הלהבה מעל פני השטח ולהגביר את המקבילות ברמת ההוראה.
  • (ב) ⁇ :0) ⁇ : ⁇ ⁇ התחדשות (הדברים הבאים) כך שמקרים רבים נמצאים בטיסה בו-זמנית.חלק מהפיטורים עושים זאת באופן אוטומטי; השתמשו בדגלים ספציפיים לאדריכלות.
  • (ב) ,0) ,העברה: (החליפה: 1) להחליף תנאים עם ⁇ (למשל, מינוס / מקס באמצעות ternary), או להשתמש בטבלאות חיפוש עבור פונקציות לא ליניאריות.
  • (FLT:0)Use Local Varis:FLT:1ir לעתים קרובות גישה לנתונים ברשומות על ידי ההכרזה על משתנים בתוך הלולאה או שימוש ברמז "register".
  • (ב) ,0) מחלוקות: 1FLT להחליף את החלוקה על ידי כפל עם רב-תכליתי על ידי הדדיות; השתמש בשינויים עבור כוחות של שניים.

לוחות תצוגה ו-Seeup

פונקציות כגון ערכים trigonometric, coefficients, ו גורמי twidle צריך להיות precomputed ולא מאוחסן כמו דיסציפלינות קבועות ב ROM. עבור סטארט-אפ לא-מציאותי, אתה יכול לחדד אותם פעם ולהשתמש מחדש.דוגמה: עבור 1024-point FFT, מראש לחדד את ערכי החטא /cosine עבור כל שלב.

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

ייעוץ ו Tuning

אין אופטימיזציה מלאה ללא מדידה. השתמש בטכניקות אלה כדי לזהות צווארי בקבוק:

  • (FLT:0)Cycle-accurate profiling:03FLT) 1 להשתמש על גבי דלפקי מחזור (למשל, DWT CYCCNT על Cortex-M) כדי למדוד את משך הפונקציה.
  • (FLT:0) פרופיל סטטיסטי: FIRLT 1 (PC) תוכנית מדגם נגד (PC) כדי לראות אילו פונקציות לצרוך זמן CPU.
  • (ב) ,0) ,מזכרים: שימוש בכלים כדי לפקח על מפספסי שפם (אם זמין) ועסקאות אוטובוס.
  • (FLT:0)Compiler משוב: FLT:1 מאפשר דוחות אופטימיזציה של מדגמים ("-fopt-info-vec-optimized" ב- GCC) כדי לראות אם לולאות הושחתו.

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

שם הספר בלועזית: Bring It All Together

כתיבת קוד DSP יעיל ב- C דורש גישה הוליסטית:

  • בחרו את ייצוג הנתונים הנכון (קודמת-נקודת מול נקודת צף).
  • עיצוב נתונים מבנים לגישה והיערכות.
  • אלגוריתמים נבחרים עם מורכבות נמוכה (FFT, Polyphase).
  • השתמש בספריות DSP של הספק בעת הזמינות.
  • לא לגלגל לולאות ולהפחית את הצנרת.
  • קבועות מראש ב ROM.
  • פרופיל ללא רחמים ולתת ליוצר לעזור.

על ידי יישום עקרונות אלה, מפתחים יכולים להשיג עיבוד אותות באמצעות חישוב דומה לאסיפה מותאמת יד תוך שמירה על יכולת התחזוקה של C. התוצאה היא מערכות DSP אמין, בזמן אמת, העומדות בדרישות של מוצרים מודרניים משובצים - מסיוע שמיעה ועד תחנות בסיס 5G.