Biblioteka DSP dla mikrokontrolerów LPC1700 i LPC1300 firmy NXP
Firma NXP opracowała bibliotekę DSP dla mikrokontrolerów z rdzeniem Cortex-M3: LPC1700 oraz LPC1300. Biblioteka ta jest zbiorem często używanych funkcji służących do cyfrowego przetwarzania sygnałów. Większość funkcji została zaimplementowana w języku asembler (instrukcje Thumb-2), o ile tylko zysk wydajności okazywał się wystarczający. Biblioteka jest dostarczana jako projekt biblioteki statycznej w kodzie LPCXpresso (Code Red), wersjach Keil i IR, a także może być zlinkowana w łańcuchu narzędzi ARM-EABI jako biblioteka binarna.
Funkcje DSP:
- filtr bikwadratowy
- Szybka transformata Fouriera (FFT)
- Iloczyn skalarny
- Operacje na wektorach
- Filtr FIR (o skończonej odpowiedzi impulsowej)
- Rezonator
- Regulator PID
- Generator liczb losowych
Każda zmienna i funkcja zawiera prefiks z liter wskazujących na typ. Niektóre przykłady zostały przedstawione poniżej:
- vF – funkcja typu void
- iF – funkcja zwracająca liczbę całkowitą
- pi_x – wskaźnik na liczbę całkowitą
- psi_x – wskaźnik na liczbę całkowitą ze znakiem
- si_x – liczba całkowita ze znakiem
- i_x – liczba całkowita
- pS_x – wskaźnik na strukturę
Cortex-M3 ma kilka właściwości, dzięki którym oferuje doskonałą wydajność w przetwarzaniu sygnałów:
- Mnożenie dwóch 32-bitowych liczb ze znakiem odbywa się w jednym cyklu
- Operacja mnożenie z dodawaniem (MAC) liczb 32-bitowych ((32×32)+32) wykonywana jest w dwóch cyklach
- Cortex-M3 ma architekturę Harvard, posiada zatem oddzielny dostęp do pamięci danych i pamięci instrukcji
Uwagi:
|
Filtr bikwadratowy
Filtr bikwadratowy jest powszechnie używana jako filtr rzędu 2, który może być łączony kaskadowo w celu zbudowania filtru dowolnego rzędu. Bikwadratowa funkcja czasu dyskretnego:
Transmitancja w dziedzinie zmiennej zespolonej Z:
Implementacja została dokonana w postaci bezpośredniej typu II, która korzysta ze współdzielonego dwuelementowego wektora stanów.
Wywołanie funkcji:
void vF_dspl_biquad32(int *pi_Output, int *pi_Input, tS_biquad32_StateCoeff *pS_StateCoeff, int i_NSamples);
typedef struct
{
short int psi_Coeff[5];
short int psi_State[2];
}tS_biquad32_StateCoeff;
psi_Coeff to wartości ułamkowe w formacie '2.14′.
psi_State to wartości ułamkowe w formacie '2.14′, które mogą zostać zainicjalizowane zerem przy pierwszym wywołaniu, ale w trakcie procedury są uaktualniane, co pozwala na przetwarzanie przez filtr ciągu danych.
Wydajność filtru bikwadratowego przedstawiono w tabeli 1.
Tab. 1. Filtr bikwadratowy
Sekcja | Mnożnik zegara pamięci 1 | Mnożnik zegara pamięci 2 | Mnożnik zegara pamięci 3 | |||
bikwadratowa | (20 MHz maks.) | (40 MHz maks.) | (26 MHz maks.) | |||
Cykle | Czas (μs) | Cykle | Czas (μs) | Cykle | Czas (μs) | |
32 próbki | 626 | 31,300 | 631 | 15,775 | 636 | 10,600 |
Sekcja | ||||||
bikwadratowa | Mnożnik zegara pamięci 4 | Mnożnik zegara pamięci 5 | Mnożnik zegara pamięci 6 | |||
(80 MHz maks.) | (100 MHz maks.) | (120 MHz maks.) | ||||
32 próbki | 641 | 8,013 | 648 | 6,480 | 648 | 5,400 |