• Aucun résultat trouvé

9.2.1

Description générale

La carte d’acquisition ultrarapide présentée à la section8.3permet d’utiliser une horloge de référence externe afin de synchroniser l’acquisition avec d’autres appareils. En particulier, il est ainsi possible de synchroniser la mesure avec la photoexcitation de la jonction tunnel. Dans ce cas, si le rapport λ

=

fe/f0 entre

la fréquence d’échantillonnage feet la fréquence de photoexcitation f0 est un

nombre entier, λ correspondra exactement au nombre d’échantillons associés à une période de f0; c’est ni plus ni moins que la période en termes de nombre d’échantillons. Ainsi, chaque échantillon peut être associé à une phase précise de la photoexcitation selon son index, de manière similaire à ce qui est décrit à la section7.6.1. Il est alors possible d’implémenter l’analogue du calcul des autocorrélations résolues en phase de la section7.6.3.

Notons que la synchronisation entre la source et la carte d’acquisition est primordiale pour effectuer des mesures résolues en phase ; simplement ajuster fe et f0 n’est pas suffisant. En effet, si les appareils ne partagent pas une référence

d’horloge, leurs références respectives peuvent subir des dérives ou présenter un désaccord en fréquence. Puisque les mesures sont moyennées sur de longues périodes, une telle désynchronisation — même minime — implique que λ n’est plus entier et les mesures faites en présumant que les phases sont résolues se voient plutôt moyennées sur toute la période.

Les sous-sections qui suivent présentent l’algorithme et le code utilisés pour calculer les autocorrélations résolues en phase du signal.

9.2.2

Description des algorithmes

Soit un élément de vecteur xi avec 0

i

<

N représentant une mesure de N échantillons acquis à la fréquence d’échantillonnage fe, elle-même synchronisée en phase avec une source à la fréquence f0 tel que fe/f0

=

λet commensurable

avec celle-ci tel que λ

N. La source de référence permet donc de résoudre

un nombre λ de phases φ séparées de 2]/λ radians. On défini l’index de phase

ϕ

=

φλ/2], tel que ϕ

N et 0

ϕ

<

λ, qui représente les λ phases résolues

et les relies à la phase réelle φ en radian. Ainsi, l’ensemble des échantillons respectant xϕ+jλavec j

Ntel que ϕ

+

<

N seront associés au même index

de phase ϕ et donc à la même phase φ.

Concrètement, si fe

=

32 GHz et f0

=

4 GHz, on a alors une référence

de phase d’une période de λ

=

8 échantillons et on distingue λ

=

8 phases φ

=

0 , ]/4 ,

· · ·

, 7]/4 correspondant aux index de phase ϕ

=

0 , 1 ,

· · ·

, 7.

On cherche ici à calculer la version discrète de l’autocovariance résolue en phase de la trace temporelle xi, tel que discuté à la section 7.6.3. On calcule l’autocovariance plutôt que l’autocorrélation pour les mêmes raisons qu’à la section9.1. En pratique, on cherche simplement à généraliser le ak de l’équation (9.7) pour obtenir un nombre λ de aϕ,k adaptés à la situation résolue en phase. On note que, grâce à la propriété de symétrie (7.159), on peut se concentrer sur les valeurs de k positives et reconstruire les valeurs négatives par la suite.

Remarquons que, pour chaque index de phase ϕ, on peut conceptuellement séparer les données en blocs de période λ pour obtenir le nombre αϕd’échantillons

associés à ϕ, soit

αϕ

=

N//λ

Blocs complets

+

<

N%λK

Bloc partiel potentiel

, (9.18)

avec//dénotant la division entière, % représentant l’opération modulo18 et où

le crochet double J · K représente le crochet d’Iverson [116, §1.4 ; 117, §1] qui indique une comparaison logique évaluée à 1 si elle est respectée et à 0 sinon. Similairement, la phase de référence ϕ et le décalage en k viennent limiter le nombre de blocs participant au calcul de l’autocovariance résolue en phase aϕ,k; on obtient le nombre nϕ,k de blocs participant au calcul de aϕ,k via

nϕ,k

=

α(ϕ+k)%λ

Blocs phase décalée

+

k)//λ Blocs sautés au début

. (9.19)

Remarquons que nϕ,k

=

+k,0, par symétrie des effets de bords. On peut dès lors définir la version discrète de l’autocovariance résolue en phase19 par

aϕ,k

=

n1 ϕ,k nϕ,k−1

j=0 (xϕ+

µϕ,k,0) (xϕ++k

µϕ,k,k) (9.20) avec µϕ,k,b

=

1 nϕ,k nϕ,k−1

j=0 ++b (9.21) pour b

N et 0

b

k, (9.22)

la moyenne partielle effectuée sur les beéchantillons des n

ϕ,k blocs considérés. À l’instar de la démarche de la section9.1.2, on peut réexprimer cette équation

18. La définition du modulo de [95, §1.2.4] diffère de celle utilisée en C++, mais les deux concordent pour des opérandes positifs.

sous la forme aϕ,k

=

nϕ,k−1

j=0 +jλxϕ++k nϕ,k

µϕ,k,0µϕ,k,k, (9.23)

ou encore sous une forme plus propice au calcul numérique par accumulateurs entiers, soit aϕ,k

=

nrϕ,k ϕ,k

(

βϕ,k nϕ,k ) ( M+k)%λ

γϕ,k nϕ,k ) , (9.24)

avec les accumulateurs de type autocorrélation et moyenne non normalisés

rϕ,k

=

nϕ,k1

j=0 +jλxϕ++k et

=

αψ−1

j=0 + (9.25)

ainsi qu’avec les corrections de bords

βϕ,k

=

αϕ−1

j=nϕ,k + et γϕ,k

=

+k)//λ−1

j=0 x+k)%λ+jλ. (9.26)

On utilise l’indice ψ pour souligner le fait que deux indices de Mψ, soit ψ

=

ϕ et

ψ

=

+

k)%λ, contribuent à aϕ,k.

On retrouve la situation non-résolue en phase en posant λ

=

1, ce qui

implique que seul l’index de phase ϕ

=

0 est accessible ; les équations (9.18) et

(9.19) impliquent alors α0

=

N et n0,k

=

N

k. En substituant ces résultats

dans (9.25), (9.26) et (9.24) — et en comparant à (9.8), (9.9) et (9.7) — on trouve

r0,k

=

rk, M0

=

M, β0,k

=

βk et γ0,k

=

γk, (9.27)

si bien que

a0,k

=

ak pour λ

=

1. (9.28)

présentée à la section9.1.

Il est aussi possible d’obtenir l’autocovariance non-résolue en phase dans le cas λ

̸=

1, avec très peu d’impact sur le temps de calcul, en adaptant légèrement l’approche résolue en phase. En effet, on remarque que, par construction, on a

N

=

λ−1

ϕ=0 αϕ et N

k

=

λ−1

ϕ=0 nϕ,k, (9.29)

de telle sorte que

rk

=

λ−1

ϕ=0 rϕ,k, M

=

λ−1

ϕ=0 Mϕ, (9.30) βk

=

λ−1

ϕ=0 βϕ,k et γk

=

λ−1

ϕ=0 γϕ,k. (9.31)

Cependant, il est important de remarquer que, dû aux effets de bords ainsi qu’aux produits et divisions de (9.24), on a

ak

̸=

1 λ λ−1

ϕ=0 aϕ,k, (9.32)

bien que cette expression tende vers l’égalité dans la limite N

∞; quand les effets de bords sont négligeables.

C’est donc dire que les accumulateurs de (9.25) et (9.26) — de pair avec les relations (9.29), (9.30) et (9.31) — permettent de calculer le ak non résolu en phase selon l’équation (9.7). Tout comme le calcul de aϕ,k, le calcul de ak se fait à la toute fin de l’acquisition de donnée. Du point de vue de la performance, il est donc à toutes fins pratiques gratuit de calculer ak en plus de aϕ,k lors de mesures résolues en phase.

9.2.3

Code et interface

Le code utilisé pour calculer l’autocovariance résolue en phase du signal est incorporé à celui des autocovariances régulières et est disponible à l’annexe B.2.2. La structure de base de la classe résolue en phase est héritée de la classe d’autocorrélation régulière par produit direct. Elle est donc très similaire à cette dernière du point de vue des considérations numériques des accumulateurs, de l’utilisation des nombres à virgule flottante à précision arbitraire, aux types de données supportés et à l’utilisation de OpenMP — voir la section9.1.3pour plus de détails sur la partie du code commune aux deux approches. Les fichiers spécifiques à la situation résolue en phase sont identifiés par le mot Phi dans leurs noms.

Les classes résolues en phases sont accessibles à travers la fabrique ACorrUpTo de l’interface Python acorrs_otf.py. Il suffit de passer l’argument phi=λ à ACorrUpTopour calculer les λ autocovariances résolues en phases ; si phi est nul ou False, l’autocorrélation régulière sera utilisée. Une fois l’accumulation terminée, les autocorrélations résolues en phases sont accessibles à travers l’attribut res de la classe, alors que l’autocorrélation régulière est accessible par l’attribut res0.

Notons que l’accumulation résolue en phase est légèrement plus lente que celle du cas régulier par produit direct, et que l’optimisation par transformée de Fourier20ne s’y applique pas ; il est donc inutile de l’utiliser dans une situation

sans référence de phase.

L’extrait de code qui suit est une modification de celui de la section9.1.3 pour la situation résolue en phase.

1 import numpy as np

2 from acorrs_otf import ACorrUpTo

3 # Instantification préalable. On peut aussi instantifier avec des données en 4 # second argument, e.g. "a = ACorrUpTo(100,x)", *x* sera alors accumulé.

5 # Considérons acq. à 32GSa/s et une référence de phase à 4GHz, donc 8 phases. 6 a = ACorrUpTo(100, 'int16', phi=8) # 100 première autocovariances, pour 8 phases. 7 # Simulons 10 mesures 16bit signées

8 for n in range(10):

9 # *x* simule une trace temporelle expérimentale

10 x = np.random.randint(-2**15,2**15, size=2**20, dtype=np.int16) 11 a(x) # On accumule dans l'objet *a*

12 # a.res et a.res0 contiennent les moyennes d'ensemble des autocovariances 13 # résolues en phase et régulière des dix *x*.

14 print a.res, a.res0 # Affiche à la suite les résultats résolus en phase ou non.