Giriş Giriş Giriş

Dijital Signal Processing (DSP) modern gömülü sistemlerin arka kemiğidir, gerçek zamanlı ses, video, telemetri ve iletişim operasyonlarının en üst düzey prensipleri kullanarak DSP görevleri için etkin C kodu yazmak için doğrudan üretim-gradlama sistemi kodlarından farklı olarak, DSP algoritmalarının sabit zaman sınırlamaları içinde uygulanması gerekir.

DSP Temellerini C C C

DSP, filtreleme, dönüşüm, konvolution ve ⁇ analizi örnek olarak verilen sinyaller üzerinde içerir. C, programcı, veri temsili ve akış her yönünü kontrol eder, bu da hedef mimarisinin hafıza hiyerarşisi için kritiktir. DSP kodu genellikle donanımın sıkıca çiftleştiği mikro kontrolcüler veya dijital sinyal işlemcileri üzerinde çalışır - örneğin, özel MAC (multiply-accume) birimleri veya SIMD vektör motorlar. Hedef mimarisinin derin bir anlayış.

DSP kodunın Anahtar Özellikleri:

  • [FONT:0)Repeated arithmetic:) Döküz-add operations hakim (örneğin FIR filtreler).
  • [FONT:0) Gerçek zamanlı kısıtlamalar: [Dön-zaman kısıtlamaları: [Döntgen: 1] Her bir örnek bir dönemde işlenmelidir.
  • [FONT:0)Data streaming:[Dönemli giriş/ ⁇ akışları verimli bir tamponlama ve minimum kopya gerektirir.
  • [FONT:0)Memory bant genişliği sınırı:[DSPT:1] birçok DSP algoritmaları, arithmetic operasyonları tarafından değil, hızlı verilerin nasıl taşınabileceği ile sınırlıdır.

Temel bir referans için, bkz.FLT:0)Analog Cihazlarının DSP Temelleri[DDK:1).

Sabit-Point Arithmetic: Floating-Point Overhead olmadan Hassasiyet

Birçok DSP işlemcisi donanım yüzen birim (FPUs) veya daha yavaş FPUs var. Sabit nokta arithmetic tamsa işlemleri kapalı bir radix noktası ile kullanıyor, normal performans ve daha düşük güç tüketimi sağlıyor.En yaygın temsil Q)))[D)[D)[D)[Df: 15 cm[D)[D)

C C C Cde Sabit-Point Operasyonlarını Uygulamayın

Sabit nokta eki basit (kesinlikle tamsayı ekliyor), ancak multiplikasyon, Q15 çokluplikasyon için, iki Q15 sayının ürünü 32 bit orta bir sonuca ihtiyaç duyar, sonra Q15'e geri dönmek için 15 bit doğru değiştirirsiniz.

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

Kombinasyonlar meydana geldiğinde (örneğin, filtrelerde), koruma noktaları aşırı akışları önler. 32-bit veya 64-bit cumulatorları ve dourate sonuçları.|s.Hard-point librarys such: 0)ARM CMSIS-DSP), filtreleme, dönüştürme ve matris işlemleri dahil olmak üzere sabit nokta fonksiyonları sağlar.

Sabit-Point vs Floating-Point Ne Zaman Kullanılır

FPUs ile Modern işlemciler (örneğin, Cortex-M4/M7) sabit nokta olarak yüzen işlemleri hızlı bir şekilde yürütebilir.

  • Algoritma dinamik aralığı yüksek (örneğin, adaptif filtreler).
  • Kod koruması önceliklidir (daha az ölçeklendirme analizi).
  • FPU donanım mevcut ve boru hattı, ekler ve multiplies ile çakışabilir.

FPU'lar olmadan yüksek hacimli cihazlarda sabit nokta maliyet duyarlı uygulamalar için standart kalır.

İyileştirme Memory Access for DSP

DSP algoritmaları genellikle veri kümesinin büyük dizilerini doğru bir şekilde işlemektedir. Cache kaçırılır ve otobüs tezgahları performansı öldürebilir.Bu ilkeleri takip edin:

  • [FONT=0)Linear veri erişimi:[Dönerge:[Dönerge:0)Linear data access:[Dönerge: FFT bit-reversal).
  • [FONT:0)Dataeks:[Döneticileri önbellek sınırlarına uyumlu hale getirir.([0)Dataeks:[[Döneticiler) veya özel hafıza bölümleri gibi derleyici özellikleri kullanın.
  • [FONT:0)Buffering:[Dönetici:[Dönetici:0) CPU işleme ile DMA transferlerini çakışmak için çift tampon kullanın. CPU bir tampon üzerinde çalışırken, bir sonraki örnek blok yükleniyor.
  • [FONT=0)Restrikt anahtar kelime:[Dönetici:0) C99'un [[Döncüleri, bu noktadakileri bilgilendirmeye, vektörleşmeye ve daha iyi öğretim zamanlamasına izin vermek için.

Örneğin, basit bir FIR filtre fonksiyonu, giriş ve çıkış tamponları ayrı olduğunda “restrict” ile yazılmalıdır:

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

Verimli Algoritma Seçimi ve Uygulama

Algoritma karmaşıklığı doğrudan zaman ve gücü idam etmeye başlar. Her zaman görev için en verimli algoritmayı seçin:

  • [FONT=0)Fast Fourier Dönüşümü (FFT): ), Cooley-Tukey radix-2 veya iki uzunluk için altı enerji-iki uzunluk için bölünmüş-radix kullanın. O(N2) Precompute twiddle faktörler ve ROM mağazası.
  • [FONT=0)FIR filtreler:[Dönetici:[Döntgenlik/interpolasyon için polifazemleri kullanın; lineer-faze filtrelerinin sayısal olarak kullanılması için simetriyi kullanın.
  • [FONT=0)IIR filtreler:[Dönemli form II transa daha iyi sayısal stabilite için önerilen; cascaded biquad bölümlerini (ikinci sıra aşamalarını) katlama hassasiyeti azaltmak için.
  • [FONT=0)Convolution:[Döneticiler için , FFT tabanlı çakışma-add veya çakışma yöntemleri doğrudan konvolution yerine.

Modern FFT teknikleri (C'de olmasa da, ilkeleri gömülü DSP kütüphanelerinde yaygın olarak kopyalanır).

Donanım Özelliklerinin Kullanımı: SIMD ve DSP Talimatlar

Hemen hemen tüm modern mikrokontroller SIMD (Tek Öğretim Birden Çok Veri) veya DSP-enhanced talimatları içerir. Örneğin:

  • ARM Cortex-M4/M7: SIMD (SADD, SMUAD, vb.), doygun arithmetic ve kesik işlemler (QADD, QSUB). CMSIS-DSP intrinsic işlevleri kullanın.
  • TI C6000 DSP: sekiz çoğaltılmış birim, dual MAC ve yazılım borulining. TheurFLT:0)TI DSP Optimizasyon Kılavuzu) ayrıntılı teknikler sunar.
  • RISC-V P-exctions ile: gelecekteki çekirdekler DSP benzeri talimatları olacaktır.

C'deki bu özellikleri kullanmak için, derleyicinin otomatik olarak (örneğin, bağımlılık olmayan basit döngüler) veya derleyici intrinsic işlevleri kullanmak için. Örnek using ARM CMSIS-DSP for an FIR filtresi:

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

Bu tür kütüphaneler, maksimum performans için montajta el ele alınır. Her zaman önce profil ve genel C'den kütüphane işlevlerine geçiş yaptıktan sonra.

Loop Optimizasyon Teknikleri

DSP algoritmaları döngü-heavy olduğundan, döngü seviyesindeki optimizasyonlar büyük kar payı öder:

  • [FONT:0]Loop kayıt dışı: [Döntme:[Dönetici:[Dönetici:0) Elli veya derleyici pragmas ('#pragma unroll N') döngüyü azaltmak ve öğretim düzeyinde paralellik artırmak.
  • [FONT:0]Software borulining:[Dönetici] yeniden yapılandırılırlar, böylece birden çok iterasyon aynı anda uçuşta bulunur. Bazı derleyiciler bunu otomatik olarak yapar; “-O3’ ve mimarlık özel bayrakları kullanın.
  • [FONT:0)Reduce şube:[Dönetici:[Dönetici) ve arithmetic (e.g., min/max kullanımı ternary), veya lineer olmayan fonksiyonlar için göz masaları kullanın.
  • [[Dönetici değişkenleri kullanın:[Dönetici:0) Yerel değişkenleri kullanarak kayıtlara sık erişim sağlar veya “ Kayıt” ipucunu kullanarak.
  • [FONT:0) Ayrılma bölümlerini dikkate almak:[Dönetici:0)[Döneticileri yeniden tanımlamak için bir değişiklik yapmak; iki güç için geçiş yapmak.

Precomputing Constants and Lookup Tables

DSP, trigonometrik değerler, katlar ve twiddle faktörler gibi işlevlerin her aşama için prekomputed çevrimdışı olması ve ROM'daki sabit diziler olarak depolanması gerekir.Gerçek zamanlı olmayan bir başlangıç için, onları bir kez ve yeniden hesaplayabilirsiniz. Örnek: 1024-point FFT, precompute the sine/cosine values for each stage.This removes runtime değerlendirme and reduce power.

Arama masaları (LUTs) ayrıca meydan kök, exponent gibi işlevlerin yardımcı olur ve DSP'de (örneğin, konuşma işleme) kullanılan logları kullanın. tablo girişleri arasında masa girişi arasındaki line/polasyon kullanın.

Profil ve Tuning

Optimizasyon ölçümü olmadan tamamlanmaz. şişeleri tanımlamak için bu teknikleri kullanın:

  • [FONT=0)Cycle-accurate profilleme: board çevrim tezgahlarında (e.g., DWT CYCCNT on Cortex-M) kullanım süresi ölçmek için.
  • [FONT:0]Statistical profiling: Örnek program sayacı (PC) hangi işlevlerin CPU zamanını tükettiğini görmek için.
  • [FONT:0)Memory profili:[Döncük: 1) Önbelleklileri izlemek için araçlar kullanın (eğer mevcutsa) ve otobüs işlemleri.
  • [FONT=0)Compiler geri bildirim:[Döneticiler:[Döneticiler) derleyici optimizasyon raporları (GCC'de opt-info-vec-optestini'yi GCC'de) etkinleştirmiş olup, eğer döngüler vektörelleştirilmişse görmek için.

Buerate: ölçüm, değişiklik, tekrar ölçü. Çoğu zaman en büyük kazanımlar hafıza erişim modellerini düzeltmeden ziyade düzeltmeden gelir.

Pratik Özet: Tüm Birlikte Getirmek

C'deki verimli DSP kodu yazmak, bütünsel bir yaklaşım gerektirir:

  • Doğru veri gösterimini seçin (Eklenen nokta vs yüzen nokta).
  • Düzgün erişim ve hiza için veri yapıları.
  • Düşük karmaşıklık ile algoritmaları seçin (FFT, polifa).
  • Mevcut olduğunda satıcı DSP kütüphanelerini kullanın.
  • Kayıt döngüleri ve dallamayı azaltır.
  • ROM'da Precompute sabitler.
  • Profili sürekli olarak ve derleyici yardımına izin verin.

Bu ilkeleri uygulayarak, geliştiriciler, C'nin portability ve kullanılabilirliği korurken el Kaide tarafından karşılaştırılabilir sinyal işleme elde edebilir. Sonuç, modern gömülü ürünlerin talepleri ile karşılaştırıldığında gerçek zamanlı DSP sistemleridir - işitme yardımlarından 5G baz istasyonlarına kadar.