Pengantar Perjanjian Lama

Pemrosesan Sinyal Digital Zalim (DSP) adalah tulang punggung sistem tertanam modern, mengaktifkan audio waktu-nyata, video, telemetri, dan operasi komunikasi. Menulis kode C yang efisien untuk tugas DSP berdampak langsung pada sistem throughput, konsumsi daya, dan latensi. Tidak seperti kode tujuan-umum, algoritme DSP harus dilaksanakan di dalam batasan waktu yang ketat sementara memaksimalkan penggunaan memori terbatas dan pemrosesan sumber daya. Panduan ini memperluas pada prinsip inti dan menyediakan teknik yang dapat dijalankan untuk menulis kode C kelas-produksi untuk aplikasi DSP, dari aritmetik tetap ke optimasi perangkat keras-spesifik.

Pengertian Keanekaragaman DSP Fundamentals in C

DSP purviance melibatkan operasi matematika seperti penyaringan, transformasi, convolution, dan analisis spektral pada sinyal sampel. Dalam C, programmer mengontrol setiap aspek representasi data dan aliran, yang sangat penting untuk eksekusi deterministik. Kode DSP sering berjalan pada mikrokontroler atau prosesor sinyal digital di mana perangkat keras disatukan erat ⁇ misalnya, satuan MAC yang berdedikasi (multiply-accumulate) atau mesin vektor SIMD. Pemahaman mendalam dari hierarki memori, instruksi, dan kemampuan periferal adalah penting untuk menulis kode C yang efisien.

Karakteristik kunci kode DSP:

  • Repeated aritmetic: loop dengan operasi multiply-add mendominasi (contoh, filter FIR).
  • [[LANFALT:0]]Kekanan waktu-real: setiap sampel harus diproses dalam periode sampel.
  • Data streaming: input/output streams terus menerus memerlukan buffering efisien dan penyalinan minimal.
  • Memori lebar jalur lebar: banyak algoritme DSP dibatasi oleh seberapa cepat data dapat dipindahkan, bukan oleh operasi aritmetika.

Untuk acuan dasar, lihat Analog Devices' DSP Basics.

Aritmetik Titik-Tetap ufuk: Presisi Tanpa Titik-Apung-Atas

Banyak prosesor DSP yang kekurangan perangkat keras titik-apung unit (FPus) atau memiliki FPU yang lebih lambat. Aritmetik titik-tetap tetap menggunakan operasi integer dengan titik radix implisit, menyediakan kinerja deterministik dan konsumsi daya yang lebih rendah. Representasi yang paling umum adalah notasi Q: Q]m.]nn]n]n]n]n] dimana dimana dimana m]m] bit adalah bagian bilangan integer dan ]]]]][FLTT:2]][FT:2]][FT:2]][FT:2]][FT:2]]n]][FT:2]]. Sebagai bagian pecahan, contohnya

Implementasi Operasi Titik-Tetap di C

Penambahan titik-tetap-tetapan morfina adalah mudah (sama dengan bilangan integer), tetapi pendaraban memerlukan penyesuaian titik radix. Untuk pendaraban Q15, hasil dari dua angka Q15 membutuhkan hasil intermediat 32-bit, kemudian anda benar-shift dengan 15 bit untuk kembali ke Q15. Contoh:

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);
}

Ketika akumulasi lentur terjadi (misalnya, dalam filter), bit penjaga mencegah overflow. Gunakan 32-bit atau bahkan 64-bit akumulator dan hasil satur. Pustaka titik-tetap seperti ARM CMSIS-DSP[ menyediakan fungsi titik-tetap yang dioptimalkan termasuk penyaringan, transformasi, dan operasi matriks.

Ketika Menggunakan Titik-Tetap vs Titik-Apung

Pemproses modern dengan FPU (mis., Cortex-M4/M7) dapat menjalankan operasi titik-apung secepat titik-tetap. Gunakan titik-apung ketika:

  • Kisaran dinamis morfik morfonia tinggi (misalnya, penyaring adaptif).
  • Kestabilan kode zodiak adalah prioritas (kurang analisis skala).
  • Perangkat keras FPU PU LU ada dan pipeline dapat tumpang tindih menambah dan melipatgandakan.

Pada perangkat volume tinggi tanpa FPU, titik-tetap tetap menjadi standar untuk aplikasi sensitif biaya.

Pengoptimuman Memori untuk DSP

Algoritme DSP sering memproses array data yang besar secara berurutan. Cache meleset dan gerai bus dapat mematikan kinerja. Ikuti prinsip-prinsip ini:

  • [[UGNOFLT:0]]Linear akses data: array traverse dalam urutan cocontinuous (baris-major dalam C). Hindari pola akses terstrid kecuali jika diperlukan oleh algoritme (misalnya, FFT bit-reversal).
  • Data alignment: memastikan array dijajarkan ke batasan baris-terkunci. Gunakan atribut kompiler seperti atau bagian memori khusus.
  • [[EZALT:0]]Buffering: gunakan buffering ganda untuk tumpang tindih transfer DMA dengan pemrosesan CPU. Sementara CPU bekerja pada satu buffer, blok sampel berikutnya sedang dimuat.
  • [[CHANOLT:0]]Restrict kata kunci: gunakan C99 pada penunjuk untuk menginformasikan pengkompilator bahwa penunjuk tidak alias, mengaktifkan vektorisasi dan penjadwalan instruksi yang lebih baik.

Sebagai contoh, fungsi filter FIR sederhana harus ditulis dengan `restrict` ketika input dan buffer output terpisah:

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);
 }
}

Pemilihan dan Implementasi Algoritma yang Efektif

Kerumitan algoritma langsung diterjemahkan ke waktu eksekusi dan kekuasaan selalu memilih algoritma yang paling efisien untuk tugas ini:

  • ¡EaperFLT:0]]Fast Fourier Transform (FFT): gunakan Cooley-Tukey radix-2 atau split-radix untuk power-of-two longs. Hindari naif DFT yang merupakan O(N2). Precompute twiddle factors and store in ROM.
  • [NAFAFLT:0]]FIR filters:] gunakan dekomposisi polifase untuk desilasi/interpolasi; exploit simetri untuk filter linear-fase untuk menghirup jumlah pendaraban.
  • [Ezona]IIR filters: gunakan bentuk langsung II ditranspos untuk stabilitas numerik yang lebih baik; gunakan bagian biquad terkasca (tahap urutan-kedua) untuk mengurangi kepekaan terhadap kuantisasi koefisien.
  • [5]E-25OFLT:0]]Convolution: untuk urutan panjang, gunakan metode spind-adding-based FFT atau splige-save daripada convolution langsung.

falzer to the FFTW library untuk referensi pada teknik FFT modern (meskipun tidak dalam C, prinsip-prinsipnya banyak disalin dalam pustaka DSP tertanam).

Fitur Perangkat Keras Pengalihan: Instruksi SIMD dan DSP

Hampir semua mikrokontroler modern termasuk SIMD (Ningle Instruction Multiple Data) atau instruksi DSP-enhanced. Sebagai contoh:

  • ARM Cortex-M4/M7: SIMD (SADD, SMUAD, dll), aritmetik jenuh, dan operasi fraksional (QADD, QSUB). Gunakan fungsi intrinsik CMSIS-DSP.
  • TIK C6000 DSP: delapan unit ganda, ganda MAC, dan pipelining perangkat lunak. TI DSP Optimisasi Panduan menyediakan teknik detail.
  • RISC-V dengan P-extensions: inti masa depan akan memiliki instruksi mirip DSP.

Untuk menggunakan fitur-fitur ini dalam C, tulis kode yang dapat di-directorize kompilator (misalnya, loop sederhana tanpa dependensi) atau gunakan fungsi intrinsik kompilator. Contoh menggunakan ARM CMSIS-DSP untuk filter 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);

Perpustakaan semacam itu disetel tangan dalam perakitan untuk kinerja maksimum. Selalu profil sebelum dan setelah beralih dari generik C ke fungsi perpustakaan.

Teknik Optimisasi Gelung

Karena algoritma DSP adalah loop-berat, optimisasi di tingkat loop membayar dividen besar:

  • [[GALALT:0]]Loop unrolling: secara manual atau dengan compiler pragmas (`#pragma unroll N`) untuk mengurangi loop overhead dan meningkatkan paralelisme tingkat-petunjuk.
  • Pilining perangkat lunak: restruktur loop sehingga iterasi ganda berada dalam penerbangan secara bersamaan. Beberapa kompiler melakukan ini secara otomatis; gunakan `-O3` dan bendera spesifik-arsitektur.
  • [[ViethanFLT:0]]Reduce branching: ganti kondisional dengan aritmetika (contoh, min/max menggunakan ternari), atau gunakan tabel pencarian untuk fungsi nonlinear.
  • [[EfolFLT:0]]Gunakan variabel lokal: simpan data yang sering diakses dalam register dengan mendeklarasikan variabel di dalam loop atau menggunakan `register` hint.
  • Minimize divisions: menggantikan pembagian dengan konstanta dengan pendaraban oleh timbal balik; gunakan pergeseran untuk kekuatan dua.

Pemalar dan Tabel Pencarian yang Diprasarankan

Fungsi-fungsi DSP semu seperti nilai trigonometri, koefisien, dan faktor twiddle harus dipra-computed offline dan disimpan sebagai array konstan dalam ROM. Untuk startup non-real-time, Anda dapat menghitungnya sekali dan penggunaan ulang. Contoh: untuk FFT 1024-point, precomputed nilai sinus/kosine untuk setiap tahap. Ini menghilangkan evaluasi runtime dan mengurangi daya.

Tabel pencarian (LUTs) Heido ) juga membantu fungsi seperti akar kuadrat, eksponen, dan log yang digunakan dalam DSP (misalnya, dalam pengolahan pidato). Gunakan interpolasi linear antara entri tabel untuk perdagangan off memori vs akurasi.

Kebidanan dan Penentuan

Pengoptimuman astronaut tidak lengkap tanpa pengukuran. Gunakan teknik ini untuk mengidentifikasi botkenck:

  • [5] FILEFLT:0]]Cycle-accurate profiles: gunakan onboard cycle cycle counter (contoh, DWT CYCCNT on Cortex-M) untuk mengukur durasi fungsi.
  • [[FLRT:0]]Statistik profiling: Contoh penghitung program (PC) untuk melihat fungsi mana yang mengkonsumsi waktu CPU.
  • [[GANDAFLT:0]]Memori profiling: gunakan alat untuk memantau cache misses (jika tersedia) dan transaksi bus.
  • [[OGNOFLT:0]]Compiler feedback: memungkinkan laporan pengoptimalkan kompiler (`-fopt-info-vec-optimized` dalam GCC) untuk melihat apakah loop diveksi.

Seringkali keuntungan terbesar datang dari meningkatkan pola akses memori daripada mengubah aritmatika.

Ringkasan Praktis Praktis: Membawanya Bersama - sama

Cara menulis kode DSP yang efisien dalam C memerlukan pendekatan holistik:

  • Fonta Pilih perwakilan data yang tepat (titik-tetap vs titik-apung).
  • Desain struktur data untuk akses dan keselarasan berurutan.
  • Algoritma pilihan morfik dengan kompleksitas rendah (FFT, polifase).
  • flodor Gunakan perpustakaan DSP vendor bila tersedia.
  • ¡Leret loops dan kurangi percabangan.
  • Konstanta pra-hitung dalam ROM.
  • Profil fafores tanpa henti dan biarkan bantuan kompiler.

Dengan menerapkan prinsip-prinsip ini, pengembang dapat mencapai pemrosesan sinyal melaluiput yang sebanding dengan perakitan bertunjang tangan sambil mempertahankan portabilitas dan kehandalan C. Hasilnya adalah sistem DSP yang dapat diandalkan, real-time yang memenuhi tuntutan produk tertanam modern ⁇ dari alat bantu dengar hingga stasiun basis 5G.