Table of Contents
Giới thiệu
Tiến trình tín hiệu kỹ thuật số (DP) là cột sống của hệ thống nhúng hiện đại, cho phép âm thanh, video, quang phổ và giao tiếp. Viết mã C cho các công việc cP trực tiếp tác động đến hệ thống thông qua các thông tin, tiêu dùng điện năng, và mã số. Không giống như mã mục đích tổng quát, thuật toán DP phải thực hiện trong thời gian hạn chế nhất định trong khi tối đa hóa việc sử dụng bộ nhớ và xử lý tài nguyên hạn chế. Hướng dẫn này mở rộng trên các nguyên tắc lõi và cung cấp kỹ thuật hành động để ghi mã hoá thiết bị phát triển năng phát triển để sử dụng cho ứng dụng DP, từ số học cố định đến tối ưu hóa chức năng đồ họa phần cứng.
Hiểu được những nguyên tắc cơ bản của DP
Bộ phận này bao gồm các thao tác toán học như lọc, chuyển hóa, tiến hóa, và phân tích thông tin về các tín hiệu mẫu. Trong C, lập trình viên điều khiển mọi khía cạnh của biểu hiện dữ liệu và dòng chảy, rất cần thiết để xác định tính toán. Mã DP thường chạy trên vi điều khiển hay bộ xử lý tín hiệu điện tử nơi mà phần cứng được kết hợp chặt chẽ với nhau để lấy thí dụ, các đơn vị MAC (cơ quan xử lý định dạng điện tử) hoặc động cơ SIMD. Một sự hiểu biết sâu sắc về phân cấp bậc của cấu trúc, thiết lập và khả năng nội bộ là thiết yếu để viết mã C.
Đặc điểm chính của mã hệ thống DP:
- Số học được lặp lại: vòng lặp với các thao tác tăng gấp đôi chi phối (v. d. bộ lọc FIR).
- Giới hạn thời gian lại:) mỗi mẫu phải được xử lý trong một thời gian mẫu.
- [FLT: 0] Truyền dữ liệu:[FLT: 1] đầu vào liên tục/t luồng yêu cầu sự đệm hiệu quả và sao chép tối thiểu.
- Các thuật toán kết nối Mô phỏng: bị giới hạn bởi tốc độ dữ liệu có thể di chuyển, không phải bởi các hoạt động số học.
Để có một tham chiếu nền tảng, xem Thiết bị đọc mã nguồn .
Cố định-Point rithmetic: chính xác mà không cần nổi-Point overhead
Nhiều bộ xử lý điểm nổi phần cứng thiếu các bộ xử lý điểm (FPUs) hoặc có chậm FPUs. Tính toán cố định dùng các số nguyên với một điểm vô tuyến ngầm, cung cấp hiệu suất xác định và tiêu thụ điện thấp hơn. Trình mô tả thông thường nhất Q[FLT: 0]m [FLT: 0]. [FLTT:1]. [FL: 2] [FL:], [FL:], [FL:], 15 bit, trong định dạng QT], 1 bit [FT] [FT] [FT] [FT], 15 bit].
Thi hành chiến dịch cố định ở C
Thêm điểm cố định là đơn giản (thường cộng các số nguyên), nhưng phép nhân đòi hỏi phải điều chỉnh điểm vô tuyến. Đối với Q15 phép nhân, sản phẩm của 2 số Q15 cần một kết quả 32- bit trung gian, sau đó bạn phải chuyển đổi 15 bit để trở về Q15. Ví dụ:
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);
}
Khi tích lũy (v. d., trong bộ lọc), bảo vệ bit ngăn cản tràn. Dùng 32- bit hoặc thậm chí 64- bit accumularators và kết quả bão hoà. Thư viện điểm cố định như [FLT: 0]ARM CMSP [FLT: 1] cung cấp các chức năng tối ưu hóa điểm bao gồm các chức năng lọc, biến đổi và thao tác ma trận.
Khi dùng Điểm- cố định và Điểm nổi
Các bộ xử lý hiện đại với FPUs (v. d., Cortex- M4/M7) có thể thực hiện các thao tác nổi nhanh như điểm cố định. Dùng điểm nổi khi:
- Phạm vi động lực tập tin là cao (v. d., bộ lọc thích nghi).
- Khả năng duy trì mã là ưu tiên (việc phân tích không nâng cao).
- Phần cứng FPU hiện diện và đường ống có thể chồng chéo nhau và nhân lên.
Trên thiết bị có số lượng lớn mà không có FPUs, vẫn còn tiêu chuẩn cho ứng dụng nhạy cảm với chi phí.
Truy cập bộ nhớ tô sáng cho hệ thống DP
Các thuật toán DP thường xử lý các mảng lớn dữ liệu đi ngược lại nhau.
- Truy cập dữ liệu đăng nhập: qua các dãy liên tục (cả hai chiều ở C). Tránh các mẫu truy cập đã tăng tốc trừ khi cần thiết bởi thuật toán (v. d., FFT bit-reversal).
- [FLT: 0] Sắp xếp thông tin: bảo đảm các dãy được liên kết với ranh giới dòng tạm. Hãy dùng tính năng biên dịch hoặc phần bộ nhớ đặc biệt.
- Pffering: sử dụng hai bộ đệm để chồng chéo chuyển đổi DMA với xử lý CPU. Trong khi CPU làm việc trên một bộ đệm, khối mẫu tiếp theo đang được tải.
- Từ khoá ngược:) dùng [C99] ) ) trên con trỏ để thông báo cho trình biên dịch rằng con trỏ không bí danh, cho phép véc- tơ hóa và sắp xếp hướng dẫn tốt hơn.
Ví dụ, một chức năng lọc FIR đơn giản nên được viết bằng « « %stric » khi nhập và xuất bộ đệm riêng:
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);
}
}
Chọn và giải phẫu thuật phức tạp
Thuật toán phức tạp trực tiếp chuyển sang thực hiện thời gian và năng lượng. Luôn chọn thuật toán hiệu quả nhất cho nhiệm vụ:
- Biến 4ier (FFT): sử dụng các yếu tố để hỗ trợ sự biến đổi và cửa hàng trong ROM.
- [FLT: 0] Bộ lọc FIR: sử dụng polyphase decomition cho de Dectation/trition; khai thác cân xứng cho bộ lọc biểu thức tuyến tính để che lấp số phép nhân.
- Bộ lọc: sử dụng trực tiếp dạng II chuyển đổi để đạt độ ổn định số tốt hơn; sử dụng các phần hai lần phân loại ( giai đoạn thứ hai) để giảm độ nhạy cảm để định lượng hệ số.
- Cách mạng: cho chuỗi dài, sử dụng phương pháp chồng chéo FFT hoặc chồng chéo nhau thay vì tiến hóa trực tiếp.
Bộ duyệt qua thư viện [FLT: 1] [FLT:] để tham khảo về kỹ thuật FFT hiện đại (mặc dù không phải trong C, các nguyên tắc của nó được sao chép rộng rãi trong thư viện DP nhúng).
Đặc điểm phần cứng đã tải: SIMD và DP
Hầu hết các bộ điều khiển vi mô hiện đại bao gồm SIMD (Chỉ dẫn đa dữ liệu) hoặc hướng dẫn dùng cho hệ thống điện tử. Ví dụ:
- ARM Cortex-M4/M7: SIMD (SAD, SMUD, etc.), số học bão hoà, và các hoạt động phân số (QAD, QSBB). Hãy dùng chức năng nội dung của CMXXYSSP.
- TI C6000 DP: 8 đơn vị nhân, nhị phân MAC, và đường ống phần mềm. Hướng dẫn [FLT: 0] [FLT: 0] [FLT:] [FLT:] cung cấp các kỹ thuật chi tiết.
- RISC-V với P-Extens: lõi tương lai sẽ có những hướng dẫn giống như DP.
Để sử dụng các tính năng này trong C, hãy ghi mã trình biên dịch có thể tự động mô tả (v. d., các vòng đơn giản không có quan hệ phụ thuộc) hoặc sử dụng chức năng biên dịch nội dung. Ví dụ sử dụng ARMM KADS cho bộ lọc 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);
Những thư viện như vậy được in bằng tay trong hội nghị cho hiệu suất tối đa. Luôn luôn hồ sơ trước và sau khi chuyển từ C chung sang chức năng thư viện.
Công nghệ hóa Loop
Bởi vì các thuật toán DP là những thuật toán lặp lặp, tối ưu hóa ở mức độ vòng thời gian trả nhiều lợi nhuận:
- Mở khóa: thủ công hoặc biên dịch pragmas (#pragma unroll N') để giảm vòng lặp trên đầu và tăng độ song song.
- Đường ống Software: để nhiều vòng lặp lặp cùng lúc. Một số người biên dịch tự động làm điều này; sử dụng cờ riêng của '-O3' và các cờ kiến trúc.
- Chi nhánh đỏ:[FLT: 1) thay thế điều kiện bằng số học (v. d., min/max bằng cách định tuyến), hoặc dùng bảng tìm kiếm để dùng chức năng không tuyến tính.
- Dùng biến cục bộ: lưu trữ thường xuyên vào dữ liệu trong bộ nhớ bằng cách tuyên bố biến bên trong vòng lặp hoặc dùng gợi ý « %register ».
- Các sư đoàn tinh thần:[FLT: 1) thay thế sự phân chia bằng cách nhân theo số; dùng dịch chuyển cho hai.
Các hằng số và Các Bàn tra tìm
Các chức năng như giá trị lượng giác, hệ số, và các yếu tố twiddle nên được tính trước khi kết thúc và được lưu giữ như là các dãy thường xuyên trong ROM. Đối với việc khởi chạy không đúng thời gian, bạn có thể tính toán một lần và sử dụng lại. Ví dụ: Đối với giá trị fFT 1024 điểm, tính trước các giá trị sin/cosin cho mỗi giai đoạn. Tính năng này loại bỏ khả năng đánh giá thời gian chạy và giảm điện.
Tra cứu bảng (LUTs) cũng giúp cho chức năng như gốc vuông, số mũ và bản ghi dùng trong DP (v. d. trong tiến trình xử lý giọng nói). Dùng độ phân giải tuyến tính giữa mục nhập bảng để trao đổi bộ nhớ với độ chính xác của bộ nhớ.
Lợi dụng và điều chỉnh
Không có tối ưu hoá được hoàn tất mà không có khả năng đo lường. Hãy dùng những kỹ thuật này để nhận diện nút cổ chai:
- Phân tích chính xác: sử dụng các máy đếm chu kỳ (v., DWT CYCCS trên máy tính xách tay để đo thời gian hoạt động.
- Phân tích định nghĩa: máy thu mẫu chương trình (PC) để xem các hàm nào tiêu thụ thời gian CPU.
- Phân tích bộ nhớ: dùng công cụ để theo dõi bộ nhớ tạm bị bỏ lỡ (nếu có) và giao dịch xe buýt.
- Phản hồi máy in:) cho phép biên dịch hóa các báo cáo (`- fopt-info-vec- deptized` in GCC) để xem nếu các vòng lặp được chuyển đổi theo véc- tơ.
Thường thì lợi ích lớn nhất đến từ việc cải thiện các mô hình bộ nhớ thay vì thay đổi số học.
Tóm tắt thực tế: Cùng nhau mang lại mọi điều
Viết mã DP hoạt động ở C yêu cầu một cách tiếp cận tổng thể:
- Chọn biểu diễn dữ liệu đúng ( P cục bộ- điểm phù hợp với điểm nổi).
- Thiết kế cấu trúc dữ liệu để truy cập và sắp xếp lại.
- Chọn các thuật toán với độ phức tạp thấp (FFT, polyphase).
- Dùng thư viện của nhà cung cấp DP khi có.
- Mở vòng và giảm chi nhánh.
- Đối chiếu hằng số trong ROM.
- Hồ sơ không ngừng và để cho biên dịch giúp đỡ.
Bằng cách áp dụng những nguyên tắc này, các nhà phát triển có thể đạt được xử lý tín hiệu tương đương với hội nghị được cài tay trong khi giữ được khả năng cập nhật và duy trì của C. Kết quả là hệ thống đáng tin cậy, thực tế, đáp ứng các yêu cầu của các sản phẩm hiện đại - từ các thiết bị trợ thính đến trạm 5G.