Biblioteka DSP dla mikrokontrolerów LPC1700 i LPC1300 firmy NXP

Mnożenie wektora przez stałą

Każdy element wektora jest mnożony przez stałą. Wzór na mnożenie wektora przez stałą:

 

 

 

 

Prototyp funkcji VectMulConst16:

void vF_dspl_vectmulconst16(short int *psi_y, short int *psi_x, short int si_c, int i_VectorLen);

Prototyp funkcji  VectMulConst32:

void vF_dspl_vectmulconst32(int *pi_y, int *pi_x, int i_c, int i_VectorLen);

Wydajność obliczeń przedstawiono w tabeli 7.

 

Tab. 7. Mnożenie wektora przez stałą

Mnożenie wektora Mnożnik zegara pamięci 1 Mnożnik zegara pamięci 2 Mnożnik zegara pamięci 3
przez stałą (20 MHz maks.) (40 MHz maks.) (60 MHz maks.)
  Cykle Czas (μs) Cykle Czas (μs) Cykle Czas (μs)
16 bitów 243 12,150 247 6,175 252 4,200
32 bitów 274 13,700 277 6,925 280 4,667
Mnożenie wektora Mnożnik zegara pamięci 4 Mnożnik zegara pamięci 5 Mnożnik zegara pamięci 6
przez stałą (80 MHz maks.) (100 MHz maks.) (120 MHz maks.)
  Cykle Czas (μs) Cykle Czas (μs) Cykle Czas (μs)
16 bitów 257 3,213 264 2,640 264 2,200
32 bitów 283 3,538 286 2,860 286 2,383

 

Suma kwadratów

Wzór na sumę kwadratów wartości wektora:

 

 

 

 

Prototyp funkcji VectSumSquares16:

int iF_dspl_vectsumofsquares16(short int *psi_x, int i_VectorLen);

Prototyp funkcji VectSumSquares32 function prototype

int iF_dspl_vectsumofsquares32(int *pi_x, int i_VectorLen);

Wydajność obliczeń przedstawiono w tabeli 8.

 

Tab. 8. Suma kwadratów

Suma kwadratów Mnożnik zegara pamięci 1 Mnożnik zegara pamięci 2 Mnożnik zegara pamięci 3
wartości wektora (20 MHz maks.) (40 MHz maks.) (60 MHz maks.)
  Cykle Czas (μs) Cykle Czas (μs) Cykle Czas (μs)
16 bitów 242 12,100 244 6,100 247 4,117
32 bitów 242 12,100 245 6,125 249 4,150
Suma kwadratów Mnożnik zegara pamięci 4 Mnożnik zegara pamięci 5 Mnożnik zegara pamięci 6
wartości wektora (80 MHz maks.) (100 MHz maks.) (120 MHz maks.)
  Cykle Czas (μs) Cykle Czas (μs) Cykle Czas (μs)
16 bitów 250 3,125 254 2,540 254 2,117
32 bitów 254 3,175 259 2,590 259 2,158

 

Filtr o skończonej odpowiedzi impulsowej (FIR)

W przeciwieństwie do procesorów sygnałowych, Cortex-M3 nie może wykonywać operacji odczytu równolegle z operacjami ALU, zatem każdy cykl wczytywania danych jest cyklem, podczas którego nie można dokonywać obliczeń arytmetycznych na potrzeby filtru. Funkcje FIR są w istocie długimi sekwencjami operacji mnożenia i dodawania (MAC), w których wynik jest rezultatem sumowania wielu współczynników mnożonych przez wartość wejściową.
Aby zmaksymalizować wydajność filtru FIR w procesorze Cortex-M3, zastosowano tak zwany algorytm „ block-FIR ”. Algorytm ten redukuje liczbę odwołań do pamięci poprzez obliczanie kilku próbek wyjściowych w każdym obiegu pętli. W ten sposób dane wejściowe i współczynniki mogą zostać użyte ponownie przed doczytaniem kolejnych wartości z pamięci.

Wzór opisujący filtr:

 

 

 

 

Odwoływanie się do filtru:

typedef struct

{

int *pi_Coeff;

int NTaps;

}tS_blockfir32_Coeff;

void vF_dspl_blockfir32(int *pi_y, int *pi_x, tS_blockfir32_Coeff *pS_Coeff, int i_nsamples);

Uwaga. Liczba i_nsamples musi być wielokrotnością 4.

Do pobrania

O autorze