---
title: Arch. Num. du Trait. Sig.
author: Rémi {Hyperion} MAUBANC
tags: ESIEE, I4
---
Architecture Numérique du Traitement de Signal
===
# Planning
- Contrôle avec documents (Cours, TD, TP)
- TD
- Arithmétique fixe & flottante
- Filtres & CAN
# Présentation
## Applications
- GEDD: Optimisation des performances de commandes
- Onduleurs
- Commandes moteurs
- GRIT:
- Téléphonie
Techniques numériques incontournables dans les produits électroniques
- Les DSP (Digital Signal Processor) remplacent les technologies analogiques
Raisons ?
- Avantages
- Stabilité (temps, humidité, temp)
- Flexibilité (reprog)
- Reglage min.
- Inconvénients
- Cout élevé pour les app simples
- Vitesse de traitement qui limité la bande passante des signaux à traiter (temps réel)
## Caractéristiques
![](https://i.imgur.com/dlGEJMn.png)
*Chaine de traitement numérique*
Traitement en temps réel:
- Routes les opérations effectuées en $t < T_{e}$
- Parole : $T_{e} = 125 \mu s$
- Audio : $T_{e} = 22,68 \mu s$
- Vibratoire : $T_{e} = 10 \mu s$
- Vidéo : $T_{e} = 0,1 \mu s$
- Utilisation d'architectures adaptées
Comparaison des puissances de calcul
- MIPS ou MOPS (Mega Instruction Per Seconde) pour les DSP à virgule fixe
- MFLOPS pour les DSP à virgule flottante
Multiplication et accumulation rapides
- Spécificités de l'architecture interne
- Multiplication en un seul cycle d'horloge
- Adapté au monde de l'embarqué
- Faible consommation / TDP
- Intégration & Fléxibilité de programmation
- Faible coût et rapidité de développement
- Librairie fournie avec le DSP
## Application typiques de TNS
### FIR
**Question de contrôle: Calcul d'un filtre**
- Filtrage numérique
- Limite aux systèmes linéaires discrets invariants en temps et causaux
- Equation aux différences
- Entre les échantillons d'entrée et sortie
- Filtre non-récursif (context free)
- Filtre FIR : moyenne mobile
- Filtrage numérique récursif
- IIR (Infinite Impulse Response)
- IIR quand $z = 0$
- IIR quand $z \neq 0$
### Filtrage Adaptatif
Filtrage adaptatif : modification des coeficients (Context Sensitive)
- RLMS: Algo récursif des moindres carrés (Wiener-Hopt)
- Voir [cours Optimisation & Filtrage](https://hackmd.io/Z4qd30TlR4apM2nxc-o1lA?view#Algorithme-récursif-des-moindres-carrés-RLMS)
### Autres
![](https://i.imgur.com/7ZV7wq6.png)
- La valeur moyenne :
$$
m_{x} = \frac{1}{N} \sum_{n=0}^{N-1} x(n)
$$
- La puissance moyenne :
$$
P_{x} = \frac{1}{N} \sum_{n=0}{N-1}x(n)^{2}
$$
- Correlation
$$
C_{xy}(k) = \frac{1}{N} \sum_{n=0}^{N-1}y(n).x(n-k)
$$
DSP doivent faire rapidement:
- Multiplication-Accumulation
- MACs : FFT, Filtrage adaptatif, Convolution
- Calcul d'adressage complexe
- Accès linéaire, indexé, bit-reverse
- Avoir une bonne précision
- Filtrage adaptatif requiert une grande précision de calcul
- Filtre IIR: Impact la stabilité
- Type de quantification des données: virgule flottante ou fixe
- Calcul intensif ou répétitif
- Manipuler une quantité importante de données
- Scalaires, Vectorielles, Matricielles
## Domaines d'applications
- Télécommunication
- Suppresseur d'écho
- Modems
- Radiophonie & Vidéophonie
- Automatisation & Contrôle de processus
- Contrôle de vitesse
- Robotique
- Gestion puissance...
## Comparaison des autres processus
![](https://i.imgur.com/DvsdayY.png)
- ASIP: Application Specific Instruction set Processor
- Très couteux, complexe
- ASIC: Application Specific Integrated Circuit
- Investissement très couteux, mise en oeuvre longue
$\Rightarrow$ Les processeurs généraux sont trop lent et énergivores dans ses applications
## Virgule Fixe ou Flottante ?
Deux types de DSP:
- 32 ou 64 bits à virgule flottante
- 16, 24 ou 32 bits en virgule fixe
Le choix dépend des contraintes d'application.
$\Rightarrow$ Un **DSP virgule fixe peut également réaliser des calculs en virgule flottante**.
- Utilisation via une librairie
- Moins bonne efficacité
Le contraire est également possible, mais ne possède pas de réel cas concret.
### Représentation des nombres entiers
- Représentation avec module + signe
- Solution simple
- On ajoute un bit pour le signe (0 $\rightarrow$ + et 1 $\rightarrow$ -)
- Le signe est le **bit de poids fort**
Cette représentation est mal adapté aux additions.
- Réprésentation en complément vrai
- Opération arithmétiques effectuée de manières différentes:
- Par programmation
- Par logique micro-programmée
- Operation suivante: $532_{(10)} - 264_{(10)}$
![](https://i.imgur.com/ghVB6fA.png)
- Equation logique
![](https://i.imgur.com/74od8vZ.png)
## Arthimétique en virgule fixe
- Hypothèse
- A: nombre de bits = $mA$ (partie entière) + $nA$ (partie fractionnaire)
- B: nombre de bits = $mB$ (partie entière) + $nB$ (partie fractionnaire)
- Addition $A+B$
- Choix d'un format identique
- Alignement de la virgule
- Extension du bit de signe
![](https://i.imgur.com/ridq5Na.png)
- Multiplication
- Bit de signe du résultat double
- Recadrage final
- Caler le résultat sur la taille des opérandes
![](https://i.imgur.com/8SjiSuL.png)
# Instruction / Programmation
- L'instruction **REPEAT** permet de répéter $n+1$ fois l'instruction qui suit.
- Le signe $#$ permet d'indiquer qu'il s'agit d'une valeur immédiate. Souvent limité à des valeurs sur 16 bits.
## Adressage Direct
```asm=
MOVW DP,#VarA ; Load DP with page value containing VarA
ADD AL,@VarA ; Add memory location VarA to register AL
MOV @VarB,AL ; Store AL into memory location VarB
; VarA and VarB located in the same 64 word page location
MOVW DP,#VarC ; Location DP with page value containing VarC
ADD AL,@VarC ; Add memory location VarC to register AL
MOV @VarD,AL ; VarC and VarD located in the same 64 word page location
ADD AL,*-SP[5] ; Add 16 bits content from stack location -5 words from the top of stack to AL register
MOV *-SP[8],AL ; Store 16 bits AL register to stack location -8 words
ADDL ACC,*-SP[12] ; Store 32 bits ACC register to stack location -12 words
MOVL *-SP[34],ACC ; Add 32 bits content from ACC register to stack location -34 words
MOV *SP++,AL ; Push content of 16 bits AL register onto the top of stack
MOVL *SP++,P ; Push content of 32 bits P register on to the top of stack
ADD AL,*--SP ; Pop content from top of the stack and add to 16 bits AL register
MOVL ACC,*--SP ; Récupère un mot de 32 bits depuis le haut de la pile et le stock dans l'accumulateur
```
- *SP* pointe sur la prochaine case libre (*SP[1]* pointe sur la dernière case avec des données).
- `ADD DEST,SRC` La destination est avant la source
## Adressage indirect
Copie de *Array1* vers *Array2* avec une boucle :
```asm=
MOVL XAR2,#Array1 ; Load XAR2 with start address of Array1
MOVL XAR3,#Array2 ; Load XAR3 with start address of Array2
MOV @AR0,#N-1 ; Load AR0 with loop count N
Loop: ; Etiquette Loop pour le jump
MOVL ACC,*XAR2++ ; Load ACC with location pointed to by XAR2, post-increment XAR2
MOVL *XAR3++,ACC ; Store ACC with location pointed to by XAR3, post-increment XAR3
BANZ Loop,AR0-- ; Loop until AR0 = 0, post-decrement AR0
```
:::warning
- A la colonne 1, seule les étiquettes commencent. Pour les instructions, elles doivent commencer au moins à la colonne 2.
- L'incrément `++` dépend de la taille du mot
- Ici on a un un processeur de 16 bits donc
- 1 si mot de 16 bits
- 2 si mot de 32 bits
- Pour un STM32 qui est un CPU de 8 bits
- 1 si mot de 8 bits
- 2 si mot de 16 bits
- 4 si mot de 32 bits
:::
```asm=
MOVL XAR2,#Array1+N*2
MOVL XAR3,#Array2+N*2
MOV @AR0,#N-1 ; @ facultatif
Loop:
MOVL ACC,*--XAR2
MOVL *--XAR3,ACC
BANZ Loop,AR0--
```
```asm=
MOVW DP,#Array1Ptr ; Point to Array1 pointer location
; On récupère le pointeur de page qui pointe sur le tableau
MOVL XAR2,@Array1Ptr ; Load XAR2 with pointer to Array1
; On assigne XAR2 vers l'adresse du tableau Array1
MOVB XAR0,#16 ; AR0L = 16, AR0H = 0
MOVB XAR1,#68 ; AR1L = 68, AR1H = 0
MOVL ACC,*+XAR2[AR0] ; Swap content of location Array1[16] with Array1[68]
MOVL P,*+XAR2[AR1]
MOVL *+XAR2[AR1],ACC ; On échange les valeurs entre Array1[16] et Array1[68]
MOVL *+XAR2[AR0],P
```
:::info
Suffice B signifie qu'on travaille sur un octet (soit le poids fort, soit le poids faible)
`XAR0,#16 << #16` pour décaler sur le poids fort
:::
```asm=
MOVW DP,#Array1Ptr
MOVL XAR2,Array1Ptr
MOVL ACC,*+XAR2[2]
MOVL P,*+XAR2[5]
MOVL *+XAR2[5],ACC
MOVL *+XAR2[2],P
```
On permute les valeurs des cases 2 et 5.
## Adressage circulaire
Calcul du filtre FIR $X[n]=data$, $C[n]=coef$
```asm=
MOVW DP,#XPointer ; Récupération du pointer de page
MOVL XAR6,XPointer ; XAR6 pointe sur les données
MOVL XAR7,#C ; XAR7 pointe sur les coeficients (espace programme)
MOVL AR1,#N ; AR1 est le compteur (taille du tableau de données)
SPM -4 ; Set Shift Product Mode
ZAPPA ; Zero ACC,P,O,V,C (Mise à zero des registres et flags)
RPT N-1 ; Répète N fois l'instruction suivante
QMACL P,*AR6%++,*XAR7++ ; ACC = ACC + P >> 4
; P = ((*AR6%++)*(*XAR7++)) >> 32
ADDL ACC,P<<PM ; final accumulate
MOVL XPointer,ARG ; Stockage de XAR6 dans XPointer
MOVL SUM,ACC ; Stockage du résultat dans SUM
```
## Horloge
Horloge CPU : 100 MHz
Quartz : 8 MHz
## Langage C
- Unions : Permet de défnir une même zone mémoire sous 2 aspects différents
- Champs de bits : Permet de découper un élément mémoire indivisible en différents champs
```c=
struct ADCMAXCONV_BITS
{
uint16 MAX_CONV1: 4; // 3:0 Max number of conversions
uint16 MAX_CONV2: 3; // 6:4 Max number of conversions
uint16 rsvd1: 9; // 15:7 reserved
};
```
![](https://i.imgur.com/vqxj8Cu.png)
```c=
union ADCMAXCONV_REG
{
uint16 all;
struct ADCMAXCONV_BITS bit;
};
struct ADC_REGS
{
union ADCTRL1_REF ADCTRL1;
union ADCTRL2_REF ADCTRL2;
union ADCMAXCONV_REG ADCMAXCONV;
};
ADCregs.ADCMAXCONV.bit.MAX_CONV1 = 7;
```