CCINP Informatique PSI 2021

Thème de l'épreuve Autour des montres multisport
Principaux outils utilisés programmation, chaînes de caractères, listes, SQL
Mots clefs montres, norme NMEA, trame, rythme cardiaque, pics, transformée de Fourier, base de données

Corrigé

 :
👈 gratuite pour tous les corrigés si tu crées un compte
👈 l'accès aux indications de tous les corrigés ne coûte que 1 € ⬅ clique ici
👈 gratuite pour tous les corrigés si tu crées un compte
- - - - -
👈 gratuite pour ce corrigé si tu crées un compte
- - - - - - - - - - - - - - - - -

Énoncé complet

(télécharger le PDF)
                                                           

Rapport du jury

(télécharger le PDF)
        

Énoncé obtenu par reconnaissance optique des caractères


SESSION 2021 @ PSISIN

CONCOURS
COMMUN
INP

ÉPREUVE MUTUALISÉE AVEC E3A-POLYTECH

ÉPREUVE SPÉCIFIQUE - FILIÈRE PSI

INFORMATIQUE

Durée : 3 heures

N.B. : le candidat attachera la plus grande importance à la clarté, à la 
précision et à la concision de la rédaction.
Si un candidat est amené à repérer ce qui peut lui sembler être une erreur 
d'énoncé, il le signalera sur sa copie
et devra poursuivre sa composition en expliquant les raisons des initiatives 
qu'il a été amené à prendre.

RAPPEL DES CONSIGNES

e _ Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la 
rédaction de votre composition ; d'autres
couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les 
schémas et la mise en évidence
des résultats.

e Ne pas utiliser de correcteur.
«_ Écrire le mot FIN à la fin de votre composition.

Les calculatrices sont interdites.

Le sujet est composé de trois parties indépendantes.

L'épreuve est à traiter en langage Python. La syntaxe de Python est rappelée en 
Annexe en fin de
sujet.

Les différents algorithmes doivent être rendus dans leur forme définitive sur 
le document réponse dans
l'espace réservé à cet effet en respectant les éléments de syntaxe du langage 
(les brouillons ne sont
pas acceptés).

La réponse ne doit pas se cantonner à la rédaction de l'algorithme sans 
explication, les programmes
doivent être expliqués et commentés.

Énoncé et Annexes : 12 pages
Document Réponse : 8 pages

Seul le Document Réponse doit être rendu dans son intégralité.

1/12
Autour des montres multisports

Présentation

On s'intéresse dans ce sujet aux montres multisport, en déve-
loppement croissant depuis les dix dernières années.

Ces montres permettent aux sportifs amateurs ou profession-
nels d'enregistrer diverses données physiques et physiologiques.
Elles permettent maintenant de connaître sa position GPS, d'en-
registrer un trajet et tous les paramètres associés, de suivre un
trajet prédéfini. Les plus sophistiquées intègrent également un altimèêtre, un 
baromètre, un thermo-
mètre, une boussole, un lecteur MP3, etc.

On se limite dans ce sujet à :

- l'acquisition et le traitement des données GPS sur un parcours : partie ] ;

- l'acquisition du rythme cardiaque : partie IT;

- le partage des activités : partie LIT.
Dans tout le sujet, on supposera que les bibliothèques numpy 
etmatplotlib.pyplot sont importées
par from numpy import * et from matplotlib.pyplot import *

Partie I - Acquisition et traitement des données GPS

I.1 - Introduction

Dans la montre, un module électronique capte les signaux GPS à l'aide d'une 
antenne et décode ces
signaux pour générer une chaîne de caractères constituée de plusieurs lignes. 
On ne s'intéresse qu'au
traitement de cette chaîne de caractères qui est transmise par le module GPS.

Les données envoyées par le récepteur GPS suivent la norme NMEAO83 définie dans 
l'annexe 1. On
suppose que la variable donneesGPS est une chaîne de caractères reçue par le 
récepteur. Cette chaîne
contient plusieurs lignes dont le séparateur est le caractère spécial " \n". 
Pour la lisibilité, cette chaîne
est afhichée avec les sauts de ligne.

"SGPRMC,092828.00,A,4754.68988,N,00154.69147,E,0.444,,070619,,A*7C\n
SGPVTG,,T,,M,0.444,N,0.822,K,A*2F\n
$GPGGA,092828.00,4754.68988,N,00154.69147,E,1,04,2.61,84.3,M,46.5,M,,*64\n
$GPGSA,A,3,25,29,24,32,,,.,,,,3.99,2.61,3.02*0E\n

$SGPGS V,3,1,11,02,32,075,,04,,,22,06,15,037,,12,47,072,16*4A\n

$SGPGS V,3,2,11,14,38,276,11,24,18,141,19,25,80,353,24,29,56,196,30*7F\n
$SGPGS V,3,3,11,31,34,306,25,32,35,250,36,33,32,202,27*4F\n
$GPGLL,4754.68986,N,00154.69154,E,092828.00,A,A*6B\n"

2/12
L.2 - Récupération des données brutes

L'objectif est de récupérer l'heure, la latitude, la longitude et l'altitude 
dans les données de la trame
GPGGA (voir annexe 1). Cette procédure va se décomposer en 3 étapes :

- récupérer la trame GPGGA dans la série de trames reçues ;

- vérifier la validité de la trame ;

- extraire les données.

Pour répondre aux questions suivantes, 1l est conseillé d'utiliser les 
propriétés et fonctions sur les
caractères et chaînes de caractères données en annexe 2.

Pour récupérer la trame GPGGA, on a écrit la fonction recupererGPGGA(chaine) 
(donnée sur le
Document Réponse) qui prend en argument la chaîne de caractères chaine et qui 
renvoie la ligne
correspondant à la trame GPGGA s1 elle existe sous forme de liste découpée 
suivant les virgules.
Sinon elle renvoie une liste vide.

La fonction indice_GPGGA(listeChaine) renvoie l'indice de l'élément contenant " 
$GPGGA" de
listeChaine.

Q1. Expliquer les lignes 2 à 8 de cette fonction.

Q2. Écrire une fonction indice_GPGGA(listeChaine) prenant en argument une liste 
de chaînes
de caractères et qui renvoie l'indice de la position de la chaîne contenant " 
$GPGGA" quand elle
existe ou la longueur de listeChaïne sinon. Vous utiliserez une boucle while.

Q3. Donner l'instruction à écrire pour récupérer la trame GPGGA de la variable 
donneesGPsS et la
stocker dans la variable 1isteGPGGABrute.

I.3 - Test de validité de la trame GPGGA

Pour que la trame soit valide, il faut vérifier que :

- les valeurs soient présentes ;
par exemple, la trame "$GPGGA,09281 1.00,,,,,0,00,99.99,,..,,*65\n" n'est pas 
valide ;

- le coefficient de précision soit inférieur à 5 ;

- Ja somme de contrôle soit valide. La somme de contrôle est obtenue par une 
opération " ou ex-
clusif "entre une représentation binaire de chaque caractère entre '$' et '*" 
(ces deux caractères
étant exclus). Sa valeur dans la trame est donnée en base hexadécimale.

On suppose dans cette sous-partie que la trame, constituée de 14 éléments, a 
été récupérée et stockée
dans 1isteGPGGABrute soit 1c1 :

listeGPGGABrute= ["'GPGGA", '092828.602', '4754.68988', 'N°', '60154.69147°, 
'E', 'l',
04", '2.61', '84.3, 'M, '46.5', M', '"64']

Pour les questions suivantes, trame correspond à une variable ayant la même 
forme que
listeGPGGABrute.

Q4. Ecrire une fonction testPresence(trame) qui prend en argument la liste de 
chaînes de
caractères trame correspondant à une trame GPGGA et qui renvoie True s1 les 
données sont
présentes et non vides, False sinon.

Q5. Ecrire une fonction testPrecision(trame) qui prend en argument la liste de 
chaînes de
caractères trame correspondant à une trame GPGGA et qui renvoie True s1 la 
précision est
inférieure à 5, False sinon.

3/12
On donne dans le Document Réponse une fonction testSC(trame) qui prend la liste 
de chaînes
de caractères trame correspondant à une trame GPGGA et qui renvoie True s1 la 
trame est valide,
False sinon.

Q6. Donner la valeur renvoyée par la fonction testSC appliquée à la liste 
['GPG", "AO" ].
Donner notamment la valeur de la variable csHex. On donne les résultats 
suivants :
bin(ord('G')) renvoie '6b®01000111', bin(ord('P')) renvoie ''6b601616060600".
bin(ord("*')) renvoie '6b00101010', bin(ord('A')) renvoie 'Ob0160060001,
bin(ord('®@")) renvoie '6bO6110060.

L.4 - Récupération des données

La trame étant valide, on recherche maintenant à récupérer les données qui nous 
intéressent en les
stockant dans le format adéquat :

l'horaire exprimé en secondes ;

la latitude exprimée en degrés (0 correspond à l'équateur, elle varie de -- 90° 
à 90°). Au Nord
l'angle sera compté positivement et au Sud négativement ;

la longitude exprimée en degrés (0 correspond au méridien de Greenwich, elle 
varie de -- 180°
à 180"). L'Ouest sera compté positivement et l'Est négativement ;

- l'altitude exprimée en mètres.
Pour la latitude, comme la longitude, les minutes d'angle sont toujours 
représentées avec 8 caractères

(dont la virgule) alors que les degrés sont représentés avec 2 ou 3 caractères.

Q7. Écrire une fonction convHoraire(chHoraire) qui prend en argument la chaîne 
de caractères
chHoraire représentant l'horaire avec le format de la norme GPGGA (092828.00 
correspon-
dant à 09 h 28 min 28,00 secondes) et qui renvoie la valeur de l'horaire 
exprimé en secondes.

QS8. Écrire une fonction convAngle(chAngle,chCard) qui prend en argument la 
chaîne de ca-
ractères chAngle correspondant à la latitude ou la longitude, ainsi que la 
chaîne de caractères
chCard correspondant à la direction (N/S ou E/O) et qui renvoie le flottant 
signé correspondant
à la valeur de l'angle en degré (il faudra convertir les minutes d'angle en 
valeur décimale).

Q9. Compléter l'ébauche de la fonction recupDonnees(trame) qui prend en 
argument trame
correspondant à une trame GPGGA et qui renvoie une liste de 4 réels contenant 
(Heure, Lati-
tude, Longitude, Altitude).

LS - Sauvegarde d'une activité

Lors d'une activité, on récupère toutes les secondes :

- les données du GPS : horaire (en seconde), latitude (en degré), longitude (en 
degré) et altitude

(en mètre) ;

- la fréquence cardiaque.
Toutes les secondes, ces 5 données sont enregistrées dans un fichier texte, en 
les séparant par une
virgule. Chaque ligne du fichier correspond à un "point" de mesure.
Exemple d'une ligne du fichier texte : "34108,47.91 
1498,001.911526,0084.3,105\n".
L'horaire, en secondes, est un entier représenté avec 5 caractères. On garde 6 
chiffres après la virgule
pour les angles en degrés. La partie entière de l'altitude est représentée avec 
4 caractères et on prend
une précision au décimèêtre. La fréquence cardiaque est un entier représenté 
avec 3 caractères. Tous
les caractères sont stockés sur 1 octet (asc1i).

Q10. On suppose que l'on réalise une activité d'une heure. Donner l'ordre de 
grandeur de la taille
mémoire en octets du fichier texte généré. Dans le cahier des charges, on 
impose que la montre
peut sauvegarder 200 h d'activités. Donner l'ordre de grandeur de la taille 
mémoire nécessaire
au stockage des données pour répondre au cahier des charges.

4/12
La mémoire des montres est de l'ordre de 20 Mo.
Q11. Proposer une solution permettant de ne pas dépasser la mémoire disponible.

Partie II - Acquisition du rythme cardiaque

Lors d'une activité sportive, les montres multisport permettent 
l'enregistrement et la consultation du
rythme cardiaque. Cela permet au sportif de contrôler son effort et d'optimiser 
ses performances.
Cette donnée est intéressante durant les compétitions et les entraînements.

La première méthode utilisée est d'enregistrer l'ElectroCardioGramme (ECG). On 
mesure l'activité
électrique du coeur à l'aide d'électrodes. Cette méthode nécessite d'installer 
une ceinture cardiothora-
cique qui mesure et envoie les données à la montre par Bluetooth ou ANT + en 
fonction des marques.

La seconde méthode est la PhotoPlestysmoGraphie (PPG) ou Oxymétrie de
pouls. L'hémoglobine, lorsqu'elle est chargée en oxygène, absorbe davan-
tage les infrarouges que lorsqu'elle n'est pas chargée en oxygène. On peut
donc avec un émetteur et un récepteur infrarouge mesurer en temps réel la
saturation en oxygène du sang et en déduire le rythme cardiaque. En centre
hospitalier, le capteur est positionné au bout d'un doigt. L'épaisseur de peau
étant faible et la zone très vascularisée, on utilise des longueurs d'onde
" optimales " de l'ordre de 800 nm (lumière rouge). Dans les montres, la
prise de mesure s'effectue au poignet. La peau y étant plus épaisse, on uti-
lise des longueurs d'onde de l'ordre de 570 nm (lumière verte) qui pénètrent
mieux les tissus.

Le capteur PPG renvoie une valeur de longueur d'onde avec un temps 
d'échantillonnage 7°, = 0,025.
Tous les 7}, on enregistre la valeur de ce signal (sans unité) dans une liste 
notée signal et le temps
(en s) dans une liste notée temps. Chaque élément de la liste signal est un 
nombre entier, image de
la quantité d'infrarouge absorbée.

HIT)

£
3 500
©
É
D
5 400
5
5 300 A) A AN | f\ A\ \ | \ A
. R COIN UV |
200 ;
0 I 2 3 4 5 6

Temps (s)

Figure 1 - Mesure PPG : tracé de la liste signal en fonction de la liste temps

Un essai d'une durée d'environ 6 secondes permet de tracer la courbe de la 
figure 1.

5/12
On observe que la valeur du signal infrarouge se décompose en deux valeurs :
- une valeur quasi constante, de l'ordre de 300 sur la figure 1, qui correspond 
à l'absorption due
aux tISSUS, au flux veineux et à une partie constante du flux artériel ;
- une partie variable due exclusivement à la variation du flux artériel.

IL.1 - Application d'un filtre passe-bas

Pour atténuer certaines perturbations, on applique un filtre passe-bas. Il est 
caractérisé par l'équation
différentielle : à
[
+27 fe S(t) = 2x fe e(t) (1)
où e(f) est le signal d'entrée du filtre, s(7) le signal en sortie du filtre et 
f. la fréquence de coupure du
filtre.

On peut intégrer l'équation (1) sur un intervalle [f, f + T,] et poser :

t+T,
St + dt) = S(f) + 2x. [ (e(u) -- s(u)) du. (2)

On obtient un signal discrétisé avec une fréquence d'échantillonnage f, = 1/T..
On note e, = e(f,) et sx = s(f7) les valeurs respectives des signaux d'entrée e 
et de sortie s à l'instant #4.

Q12. Montrer qu'on obtient, après discrétisation et en appliquant la méthode 
des trapèzes pour cal-
culer une valeur approchée de l'intégrale dans l'équation (2), la relation de 
récurrence sui-
vante : (1 --G) 5x + G(ey:1 + ex)

--= 3
Sx+1 1+G (3)

où G est une constante dont vous donnerez l'expression en fonction des 
paramètres f. et f..

Q13. Écrire la fonction filtrage(e,G) d'argument e tableau du signal d'entrée, 
G la constante
définie précédemment et qui renvoie le tableau de valeurs du signal filtré.

IL.2 - Méthode 1 - Récupération des pics

Le signal ayant été filtré, une première méthode consiste à récupérer les

instants des pics, puis d'en déduire la fréquence cardiaque à partir du temps 
P..
l

entre deux pics consécutifs.

Pour repérer un pic, nous allons prendre trois points de mesures consécutifs Pit
P;, P;,1 et P;,:. On considère que l'on trouve un pic si :

- Ja valeur en P;,, est supérieure à la valeur en P;;

- Ja valeur en P;,, est supérieure à la valeur en P;,; ;

- les valeurs des trois points sont supérieures à une valeur seuil m1-
nimale (par exemple 550 sur la figure 1) afin de ne trouver que des
extrema " valides ".

Pour récupérer chaque pic, 1l est inutile de travailler sur l'ensemble du 
signal, mais 1l faut prendre
suffisamment de points pour être certain d'avoir un pic. La fréquence cardiaque 
au repos usuelle étant
de 60 pulsations par minute, soit un pic par seconde, on fait le choix de 
travailler, par sécurité, sur un
intervalle de 3 s, ce qui correspond à des fenêtres de 150 points avec notre 
temps d'échantillonnage
de 0,02 5. Cette partie du signal sera notée extSignal.

Q14. Compléter le test du while de la fonction detectionPics(extSignal, seuil) 
qui prend en
argument extSignal, liste des données du signal partiel avec 150 points de 
mesure, ainsi que
la valeur minimale seuil et qui renvoie l'indice du premier " pic " dans la 
partie extSignal
du signal traité.

6/12
Q15. Commenter précisément la fonction pulsationCardiaque(signal,Te,seuil) qui 
prend
en argument signal, liste des données du signal complet, Te le temps 
d'échantillonnage en
seconde et seuil la valeur du seuil de détection. Expliciter ce que représente 
la valeur ren-
voyée.

IL.3 - Méthode 2 - Transformée de Fourier discrète

Une seconde méthode consiste à effectuer une étude fréquentielle du signal. 
Pour cela, on applique
aux données une Transformation de Fourier Discrète (TFD).

Pour un signal s de N échantillons obtenus à une fréquence j,, la TFD du 
signal, notée S (&k), est

donnée par :
N-1

S (k) -- > ne KN pour O>> chaine = 'Ceci est un test.\nOn peut mettre une tabulation entre a et
b : atb."

>>> print(chaine)

Ceci est un test.

On peut mettre une tabulation entre a et b : a b.

11/12
Fonctions sur les chaînes de caractères
Une chaîne de caractères est gérée comme une liste.
Exemple : chaine = "Concours Commun INP \n".

chaine[5] --u
chaine[9:15] -- Commun

Renvoie le 1ème terme de la chaine

Renvoie la chaîne comprise entre le ième et le
Jjième-Î] terme

Découpe la chaîne au caractère désigné, par
défaut 'espace'.

chaine!{1l]
chainel[1:];l

chaine.split('C') --  [",

'oncours ", 'ommun INP \n'l

chaine.split()

bin(int1) Convertit un entier en la chaîne de caractères | bin(12) -- '6b1100"
de son expression binaire, précédée de 'Ob'
pour indiquer la base binaire

hex(int1) Convertit un entier en la chaîne de caractères | hex(12) -- 'Oxc'

de son expression hexadécimale, précédée de | hex(O0b601610600) -- '6x50"

'0x' pour indiquer la base héxadécimale

Annexe 3 - Ou Exclusif

La fonction Ou Exclusif renvoie le ou exclusif bit à bit de deux entiers.
Exemple : 10 ° 15 renvoie 5

ou en représentation binaire : bin(@b16010 6b1111) renvoie '6b6101".

Annexe 4 - Fonctions sur les tableaux et les listes
Remarque : sous Python, l'import du module numpy permet de réaliser des 
opérations pratiques sur
les tableaux : from numpy import *. Les indices de ces tableaux commencent à 0.

Python

L=[1,2,3] (liste)

leau à
tableau à une dimension v=array([1,2,31]) (vecteur)

créer un vecteur rempli de 0 de taille n zeros(n)

accéder à un élément

V[0] renvoie 1 (L[®] également)

ayouter un élément

L.append(5) uniquement sur les listes

tableau à deux dimensions (matrice)

M=array(([1,2,3],[3,4,5]))

accéder à un élément M[1,2] donne 5

extraire une portion de tableau (2 premières co-

M[:,0:21
lonnes)
extraire la colonne 1 M[:,1]
extraire la ligne 1 M[1,:]

tableau de 0 ( 2 lignes, 3 colonnes) zeros((2,3))

a = array([l1,2,31])

b = a.reschape(3,l)
print(b)

>>> array ([[1],[2],[3]])

Transformer une ligne en colonne

a = array([[1,2,31,[4,5,6],[17,8,91]1])
b = array([1,2,3])

print(a.dot(b))

>>> array ([14,32,50])

produit matrice-vecteur

12/12

IMPRIMERIE NATIONALE - 211170 - D'après documents fournis

Numéro N
d'inscription
C Nom :

| N D Numéro
de table

CONCOURS »

COMMUN Prénom :
Née) le

Filière: PSI Session: 2021

Épreuve de: INFORMATIQUE

+ Remplir soigneusement l'en-tête de chaque feuille avant de commencer à 
composer
+ Rédiger avec un stylo non effaçable bleu ou noir
Consignes ° Ne rien écrire dans les marges (gauche et droite)
+ Numéroter chaque page (cadre en bas à droite)
* Placer les feuilles A3 ouvertes, dans le même sens et dans l'ordre

Emplacement
QR Code

PSISIN

DOCUMENT RÉPONSE

Ce Document Réponse doit être rendu dans son intégralité.

Q1 - Expliquer les lignes 2 à 8

def recuperer GPGGA( chaine ):
chaineDecoupe=chaine.split("\n')
IndGGA = indice GPGGA(chaineDecoupe)
ligne = {]
if indGGA != len(chaineDecoupe ):
ligne = chaineDecoupe[indGGAlI][1:]
ligne = ligne.split(",')
ligne .pop(len(ligne ) ---2)
return ligne

© © I ON 1 R © D

- Écriture de la fonction indice _GPGGA(lListeChaine)

1/8

NE RIEN ÉCRIRE DANS CE CADRE

Q3 - Instruction permettant de créer listeGPGGABrute

- Écriture de la fonction testPresence (trame)

- Écriture de la fonction testPreci sion(trame)

Q6 - Valeur de csHex et valeur renvoyée par testSC(['GPG','"*A0"])

def testCS(trame ):

somme=trame[| ---1]|[1:]

CS =0

for chaine in tramel[:-1\|:
for ch in chaine

cs=cs ord(ch)
csHex=hex(cs)[2:|
return csHex==somme

218

- Écriture de la fonction convHoraire (chHoraire)

- Écriture de la fonction convAngle (chAngle, chCard)

Q9 - Complétion de la fonction recupDonnees(trame)

def recupDonnes (trame ):
Horaire =................
Latitude =...............
Longitude =..............

Altitude =...............

318

Q10 - Espace mémoire pour stocker une activité d'une heure. Espace mémoire pour 
stocker 200 h

D

Q11 - Solution ne la tité de mémoire di ible

12 - Démonstration de la relation de récurrence

13 - Écriture de la fonction filtrage(e,G)

418

Ge sum _

CONCOURS
COMMUN
INP

Numéro
d'inscription N

de table

Prénom :

Née) le

Emplacement
QR Code

Filière: PSI Session: 2021

Épreuve de: INFORMATIQUE

+ Remplir soigneusement l'en-tête de chaque feuille avant de commencer à 
composer
+ Rédiger avec un stylo non effaçable bleu ou noir
Consignes ° Ne rien écrire dans les marges (gauche et droite)
+ Numéroter chaque page (cadre en bas à droite)
* Placer les feuilles A3 ouvertes, dans le même sens et dans l'ordre

PSISIN

Q14 - Complétion du test de la fonction detectionPics(extSignal,seuil)

def detectionPics(extSignal , seuil ):

PO ,PI1,P2=extSignall:3]
1 =]
while 1