<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>C | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/fr/tag/c/</link>
      <atom:link href="https://antoine.weill-duflos.fr/fr/tag/c/index.xml" rel="self" type="application/rss+xml" />
    <description>C</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>fr-fr</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>C</title>
      <link>https://antoine.weill-duflos.fr/fr/tag/c/</link>
    </image>
    
    <item>
      <title>Déterrer un TIPE de 17 ans : écrans tactiles SAW, différences finies, et une simulation à moitié perdue</title>
      <link>https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/</guid>
      <description>&lt;p&gt;















&lt;figure  id=&#34;figure-le-montage-expérimental-du-tipe-2009-photographié-pendant-le-projet-un-petit-haut-parleur-posé-sur-la-plaque-sert-de-source-à-fréquence-unique-les-deux-câbles-noirs-en-bas-sont-les-microphones-utilisés-pour-écouter-la-plaque-la-grille-3-par-3-dessinée-sur-une-page-de-calendrier-est-le-motif-de-test-le-titre-manuscrit-visible-sur-le-papier-est-le-titre-de-travail-du-tipe&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Le banc d&amp;rsquo;essai de 2009 : une page de calendrier utilisée comme grille à 9 positions, une petite breadboard à gauche, un haut-parleur sur un support, deux câbles micro noirs descendant vers le bas de la plaque, avec un titre manuscrit qui dit « Étude de la propagation d&amp;rsquo;ondes dans le contexte des écrans tactiles »&#34; srcset=&#34;
               /fr/post/tipe-saw-revival/featured_hu_cac2643de57f00c8.webp 400w,
               /fr/post/tipe-saw-revival/featured_hu_576179a7f776739a.webp 760w,
               /fr/post/tipe-saw-revival/featured_hu_dbec4f19b0494587.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/featured_hu_cac2643de57f00c8.webp&#34;
               width=&#34;760&#34;
               height=&#34;570&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Le montage expérimental du TIPE 2009, photographié pendant le projet. Un petit haut-parleur posé sur la plaque sert de source à fréquence unique. Les deux câbles noirs en bas sont les microphones utilisés pour écouter la plaque. La grille 3 par 3 dessinée sur une page de calendrier est le motif de test. Le titre manuscrit visible sur le papier est le titre de travail du TIPE.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&#34;la-moitié-que-jai-pu-retrouver&#34;&gt;La moitié que j&amp;rsquo;ai pu retrouver&lt;/h2&gt;
&lt;p&gt;Pendant des années j&amp;rsquo;ai eu un souvenir avec cette forme : mon &lt;strong&gt;TIPE&lt;/strong&gt; de prépa avait été un projet CUDA. Écrans tactiles à ondes de surface, simulés sur GPU, parallélisés, un peu impressionnants. Le souvenir s&amp;rsquo;avère en partie juste, en partie cassé.&lt;/p&gt;
&lt;p&gt;En avril 2026 je suis parti à la recherche du code. Le NAS OMV que je fais tourner à la maison contient encore une image du disque dur agonisant de mon vieux PC Dell XPS de l&amp;rsquo;époque prépa. Il y a un dossier sous &lt;code&gt;XPS/Antoine/Desktop/&lt;/code&gt; daté du &lt;strong&gt;21 juin 2009&lt;/strong&gt;, avec une simulation complète en &lt;strong&gt;C avec SDL et OpenMP&lt;/strong&gt;. Il y a aussi, séparément, un unique fichier &lt;code&gt;.cu&lt;/code&gt; daté du 19 juin 2009 : un hello-world de 1,2 Ko qui fait une addition vectorielle à 9 threads, posé à côté d&amp;rsquo;un papier téléchargé de Balacey, Chatelard, Faure et Gilles sur CUDA que j&amp;rsquo;avais clairement utilisé comme référence à l&amp;rsquo;époque.&lt;/p&gt;
&lt;p&gt;La version CUDA de la vraie simulation TIPE, celle dont je me souviens avoir écrit et fait tourner sur le GPU du labo, &lt;strong&gt;n&amp;rsquo;est nulle part dans la sauvegarde&lt;/strong&gt;. Elle a existé. J&amp;rsquo;en suis sûr. Elle a disparu : perdue entre des disques durs, perdue dans un dossier qui n&amp;rsquo;a pas survécu au cycle formatage-réinstallation d&amp;rsquo;un XPS qui montrait déjà son âge, perdue de la manière dont un projet de 17 ans sur une machine personnelle finit par perdre ses fichiers. Je n&amp;rsquo;arrive pas à la retrouver.&lt;/p&gt;
&lt;p&gt;Ce que j&amp;rsquo;ai retrouvé, c&amp;rsquo;est le &lt;strong&gt;jumeau CPU&lt;/strong&gt; : la même simulation, la même physique, la même grille d&amp;rsquo;entrée, écrite en C pur avec SDL pour le rendu et OpenMP pour la parallélisation. Le travail CUDA lui-même n&amp;rsquo;a jamais touché de machine de l&amp;rsquo;école : il tournait sur mon propre GPU à la maison, et sur la station de travail flambant neuve d&amp;rsquo;un ami (un PC sérieusement neuf à l&amp;rsquo;époque, assez généreux pour le prêter à un camarade qui bossait sur un TIPE). Que j&amp;rsquo;aie écrit la version CPU comme baseline avant le portage GPU, ou comme repli pour les moments où je n&amp;rsquo;avais accès à aucun des deux GPU, ou simplement parce que le cycle de développement était plus rapide sur CPU, les traces qui pourraient me le dire ont disparu avec le reste. Ce qui reste est une moitié du projet. C&amp;rsquo;est la moitié dont je parle ici, parce que c&amp;rsquo;est la moitié qui est revenue à la vie.&lt;/p&gt;
&lt;h2 id=&#34;de-quoi-le-tipe-traitait-vraiment&#34;&gt;De quoi le TIPE traitait vraiment&lt;/h2&gt;
&lt;p&gt;Le titre complet est sur le calendrier dans la photo plus haut : &lt;em&gt;Étude de la propagation d&amp;rsquo;ondes dans le contexte des écrans tactiles&lt;/em&gt;. L&amp;rsquo;objectif du projet était de &lt;strong&gt;comprendre et de reproduire en partie un écran tactile à ondes de surface (SAW)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si vous avez utilisé une borne d&amp;rsquo;information publique, une machine à sous de casino, ou certains panneaux de contrôle industriels, vous avez probablement touché un écran SAW sans le savoir. Comparé aux écrans résistifs et capacitifs qu&amp;rsquo;on a partout aujourd&amp;rsquo;hui, le SAW a de vrais avantages :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La clarté optique n&amp;rsquo;est pas dégradée.&lt;/strong&gt; Vous touchez une plaque de verre non modifiée. Il n&amp;rsquo;y a pas de couche d&amp;rsquo;ITO devant l&amp;rsquo;écran, donc la luminosité et le contraste de l&amp;rsquo;écran sous-jacent ne sont pas affectés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Il résiste aux rayures.&lt;/strong&gt; Une rayure sur un capteur capacitif change la carte de capacité. Une rayure à la surface d&amp;rsquo;une plaque de verre SAW n&amp;rsquo;affecte presque pas la propagation d&amp;rsquo;une onde sur la plaque.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ça marche avec des gants.&lt;/strong&gt; Le capacitif a besoin d&amp;rsquo;un conducteur. Le SAW a juste besoin d&amp;rsquo;un doigt (ou de n&amp;rsquo;importe quoi qui absorbe les vibrations), donc ça marche en hiver, dans la cuisine, en salle d&amp;rsquo;opération, et dans les usines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ça marche sur du verre blindé.&lt;/strong&gt; La plaque peut être épaisse. C&amp;rsquo;est pour cela que le SAW domine historiquement les bornes publiques, les distributeurs automatiques et les machines de jeu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En contrepartie, on perd deux choses : le SAW est &lt;strong&gt;uniquement à détection au contact&lt;/strong&gt; dans sa forme commerciale (pas de survol), et la &lt;strong&gt;précision spatiale est plus faible&lt;/strong&gt; que le capacitif. Vous n&amp;rsquo;allez pas tracer des traits fins sur un écran SAW. En revanche, vous cliquerez sur de gros boutons de manière fiable pendant dix ans dans une salle d&amp;rsquo;arcade humide.&lt;/p&gt;
&lt;p&gt;Le PDF de la soutenance pose tout ça dans les trois premières slides, et le reste pivote vers la question qui m&amp;rsquo;intéressait dans le projet : &lt;strong&gt;est-ce qu&amp;rsquo;on peut modéliser un écran SAW assez bien pour comprendre pourquoi ça marche, et est-ce qu&amp;rsquo;on peut en construire un dans un labo de physique en CPGE ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une remarque de contexte qui n&amp;rsquo;apparaît pas dans la soutenance. Un ami, &lt;strong&gt;Élie&lt;/strong&gt;, travaillait sur sa propre simulation d&amp;rsquo;ondes en même temps, en parallèle et indépendamment. Son angle était visuel : les &lt;strong&gt;figures d&amp;rsquo;ondes stationnaires&lt;/strong&gt;, l&amp;rsquo;esthétique des figures de Chladni, la même physique qui fait que si vous saupoudrez du sel sur une plaque qui vibre, il s&amp;rsquo;organise sur les nœuds. Mon angle était plus pratique : je voulais pousser l&amp;rsquo;idée d&amp;rsquo;écran tactile au-delà de ce que les écrans SAW commerciaux de l&amp;rsquo;époque pouvaient faire, et essayer de détecter le &lt;strong&gt;multi-touch et les gestes glissés&lt;/strong&gt;. Deux doigts sur la plaque en même temps, chacun décalant le spectre stationnaire à sa façon ; ou un doigt qui se déplace sur la plaque, le spectre évoluant continûment au fur et à mesure. La démo en labo sur la soutenance s&amp;rsquo;arrête au mono-touch statique, parce que neuf sur neuf sur une grille 3 par 3 est ce que j&amp;rsquo;avais réussi à faire fonctionner robustement à temps pour l&amp;rsquo;oral. La simulation elle-même tournait toujours en &lt;strong&gt;excitation continue&lt;/strong&gt; parce que c&amp;rsquo;est ce qu&amp;rsquo;il faut pour le multi-touch et le mouvement : une source sinusoïdale entretenue sur la plaque, les récepteurs en train d&amp;rsquo;écouter, et le spectre qui réagit en temps réel à ce que vous faites sur la surface.&lt;/p&gt;
&lt;h2 id=&#34;la-physique-en-un-peu-moins-quun-cours&#34;&gt;La physique, en un peu moins qu&amp;rsquo;un cours&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;équation d&amp;rsquo;ondes sur une plaque est l&amp;rsquo;équation d&amp;rsquo;ondes linéaire 2D classique, avec la célérité &lt;code&gt;c&lt;/code&gt; fixée par le matériau :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Δz = (1 / c²) · ∂²z / ∂t²
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour un solide isotrope, &lt;code&gt;c&lt;/code&gt; provient des propriétés élastiques : module d&amp;rsquo;Young &lt;code&gt;E&lt;/code&gt;, coefficient de Poisson &lt;code&gt;ν&lt;/code&gt;, masse volumique &lt;code&gt;ρ&lt;/code&gt;. Le PDF traite l&amp;rsquo;exemple du &lt;strong&gt;plexiglas&lt;/strong&gt; (PMMA : &lt;code&gt;E = 2380 MPa&lt;/code&gt;, &lt;code&gt;ν = 0,34&lt;/code&gt;, &lt;code&gt;ρ = 1180 kg/m³&lt;/code&gt;), ce qui donne une célérité d&amp;rsquo;environ &lt;strong&gt;1500 m/s&lt;/strong&gt;. Assez lent pour qu&amp;rsquo;une simulation par différences finies tourne avec un pas de temps raisonnable, assez rapide pour qu&amp;rsquo;une petite plaque ait les modes qu&amp;rsquo;on attendrait d&amp;rsquo;un vrai écran tactile.&lt;/p&gt;
&lt;p&gt;On discrétise l&amp;rsquo;équation de la manière évidente. On échantillonne l&amp;rsquo;espace au pas &lt;code&gt;dx&lt;/code&gt; et le temps au pas &lt;code&gt;dt&lt;/code&gt;, on remplace le laplacien par sa version discrète à 5 points, et on obtient la récurrence explicite :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;z(i, j, k+1) = 2·z(i, j, k) − z(i, j, k−1)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             + (c·Δt / Δx)² · [ z(i−1, j, k) + z(i+1, j, k)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                              + z(i, j−1, k) + z(i, j+1, k)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                              − 4·z(i, j, k) ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est tout le cœur de la simulation. Trois tranches de temps, deux indices, une constante. Chaque cellule n&amp;rsquo;a besoin que de ses quatre voisines et de ses propres valeurs précédentes. &lt;strong&gt;C&amp;rsquo;est massivement parallélisable.&lt;/strong&gt; C&amp;rsquo;est aussi exactement le genre de problème où un CPU dual-core de 2009 avec OpenMP pouvait déjà faire de vrais progrès, et c&amp;rsquo;est précisément ce que fait la simulation.&lt;/p&gt;
&lt;h2 id=&#34;ce-que-fait-la-simulation-cpu&#34;&gt;Ce que fait la simulation CPU&lt;/h2&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-burst-mono-source-sur-une-plaque-carrée-à-bords-fixes-en-plein-vol-le-front-donde-principal-est-un-cercle-qui-sétend-proprement-depuis-la-source-en-haut-au-centre-et-les-fines-stries-verticales-à-lintérieur-du-bol-sont-les-premières-réflexions-sur-les-parois-latérales-qui-reviennent-voilà-à-quoi-ressemble-une-plaque-décran-tactile-saw-quand-on-tape-une-fois-sur-un-émetteur-piézo-et-quon-regarde-londe-sétaler&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Une source ponctuelle unique en haut au centre de la plaque émettant une rafale sinusoïdale finie. Le front d&amp;rsquo;onde s&amp;rsquo;étend en cercles concentriques rouges (amplitude positive) et bleus (amplitude négative), net au bord avant, avec les oscillations qui suivent en train de s&amp;rsquo;estomper doucement derrière. Les premières réflexions sur les parois latérales commencent à revenir vers l&amp;rsquo;intérieur&#34; srcset=&#34;
               /fr/post/tipe-saw-revival/sim-interference_hu_4b512f406bc1ee22.webp 400w,
               /fr/post/tipe-saw-revival/sim-interference_hu_ef1fe9863f744d5e.webp 760w,
               /fr/post/tipe-saw-revival/sim-interference_hu_142836f8d428104a.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/sim-interference_hu_4b512f406bc1ee22.webp&#34;
               width=&#34;524&#34;
               height=&#34;760&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Burst mono-source sur une plaque carrée à bords fixes, en plein vol. Le front d&amp;rsquo;onde principal est un cercle qui s&amp;rsquo;étend proprement depuis la source en haut au centre, et les fines stries verticales à l&amp;rsquo;intérieur du bol sont les premières réflexions sur les parois latérales qui reviennent. Voilà à quoi ressemble une plaque d&amp;rsquo;écran tactile SAW quand on tape une fois sur un émetteur piézo et qu&amp;rsquo;on regarde l&amp;rsquo;onde s&amp;rsquo;étaler.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure&gt;
  &lt;video src=&#34;sim-wave.mp4&#34; autoplay loop muted playsinline preload=&#34;metadata&#34; style=&#34;max-width:100%;height:auto;display:block;margin:0 auto;&#34;&gt;&lt;/video&gt;
  &lt;figcaption&gt;Le même montage mono-source, en mouvement. La source tire une courte rafale sinusoïdale depuis le haut au centre puis se tait ; ce qu&#39;on voit se dérouler est la réponse impulsionnelle de la plaque. Le front d&#39;onde principal s&#39;étend en cercle propre, puis rebondit sur les bords et commence à interférer avec lui-même. Voilà tout le cœur physique de la simulation, bouclé sur un laplacien à 5 points, qui tournait à environ 20 fps dans le code original.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Le code tient dans cinq fichiers C (&lt;code&gt;main.c&lt;/code&gt;, &lt;code&gt;simulation.c&lt;/code&gt;, &lt;code&gt;simulation.h&lt;/code&gt;, &lt;code&gt;events.c&lt;/code&gt;, &lt;code&gt;events.h&lt;/code&gt;) plus un tout petit &lt;code&gt;utilitaire.h&lt;/code&gt; de macros, pour un total sous les 30 Ko de source. Les fonctionnalités qui m&amp;rsquo;intéressaient pour l&amp;rsquo;angle multi-touch étaient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une grille de &lt;strong&gt;501 par 501&lt;/strong&gt; cellules, dessinée pixel par pixel sur une surface SDL, avec une &lt;strong&gt;plaque carrée&lt;/strong&gt; comme bord (la simulation supporte aussi un bord libre et une plaque en disque, plus pertinents pour le côté figures d&amp;rsquo;ondes stationnaires du projet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deux sources oscillantes indépendantes&lt;/strong&gt;, chacune avec une forme d&amp;rsquo;onde sélectionnable (sinus, carré, triangle, libre), une fréquence, une amplitude et une phase. On peut les déplacer sur la plaque à la souris. Deux points d&amp;rsquo;excitation sont utiles dès qu&amp;rsquo;on commence à penser à distinguer plus d&amp;rsquo;un toucher simultané.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Atténuation optionnelle&lt;/strong&gt;, un petit facteur d&amp;rsquo;amortissement de la vitesse, pour éviter qu&amp;rsquo;une simulation rebondisse indéfiniment.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;outil de perturbation&lt;/strong&gt; : on clique quelque part sur la plaque et la simulation impose une condition de repos local à cet endroit, comme un doigt qui touche une vraie plaque. &lt;strong&gt;C&amp;rsquo;est tout l&amp;rsquo;enjeu d&amp;rsquo;un écran tactile SAW, et tout l&amp;rsquo;enjeu de la simulation pour moi.&lt;/strong&gt; Cliquer pour placer un toucher, regarder le champ d&amp;rsquo;ondes changer, regarder ce que voient les récepteurs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sauvegarde et restauration d&amp;rsquo;état&lt;/strong&gt; dans des fichiers texte, mappées sur les touches &lt;code&gt;O&lt;/code&gt; et &lt;code&gt;I&lt;/code&gt; avec le pavé numérique pour choisir le slot. Pratique pour comparer la même configuration avec et sans toucher, ce qui est l&amp;rsquo;expérience sous forme logicielle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pragmas OpenMP&lt;/strong&gt; sur les boucles de mise à jour principales. Le matériel de 2009 était un CPU dual-core ; le portage 2026 tourne confortablement sur n&amp;rsquo;importe quoi de raisonnable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-source-unique-en-haut-doigt-virtuel-placé-en-bas-à-droite-le-front-donde-vient-juste-de-balayer-la-position-du-doigt--les-anneaux-concentriques-secondaires-qui-se-forment-autour-du-cercle-jaune-sont-la-composante-absorbée-et-ré-rayonnée-de-londe-cest-linstant-où-un-récepteur-saw-commencerait-à-enregistrer-un-signal-différent-du-baseline-non-touché&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Une frame du run avec doigt : le front d&amp;rsquo;onde principal vient juste d&amp;rsquo;atteindre un cercle jaune dans le quadrant en bas à droite de la plaque, et on voit des ondulations secondaires qui s&amp;rsquo;étalent depuis ce point alors que l&amp;rsquo;onde est absorbée et diffusée par le doigt simulé&#34; srcset=&#34;
               /fr/post/tipe-saw-revival/sim-touch_hu_eb88f4787bfff26b.webp 400w,
               /fr/post/tipe-saw-revival/sim-touch_hu_49652768ea39c42f.webp 760w,
               /fr/post/tipe-saw-revival/sim-touch_hu_9263ce041f57e767.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/sim-touch_hu_eb88f4787bfff26b.webp&#34;
               width=&#34;524&#34;
               height=&#34;760&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Source unique en haut, doigt virtuel placé en bas à droite. Le front d&amp;rsquo;onde vient juste de balayer la position du doigt ; les anneaux concentriques secondaires qui se forment autour du cercle jaune sont la composante absorbée et ré-rayonnée de l&amp;rsquo;onde. C&amp;rsquo;est l&amp;rsquo;instant où un récepteur SAW commencerait à enregistrer un signal différent du baseline non touché.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure&gt;
  &lt;video src=&#34;sim-touch-spectrum.mp4&#34; autoplay loop muted playsinline preload=&#34;metadata&#34; style=&#34;max-width:100%;height:auto;display:block;margin:0 auto;&#34;&gt;&lt;/video&gt;
  &lt;figcaption&gt;Le même burst mono-source, mais avec un doigt virtuel posé sur la plaque en bas à droite (le cercle jaune). Regardez ce qui se passe quand le front d&#39;onde principal le balaye : l&#39;anneau se brise, des cercles de diffusion secondaires fleurissent depuis le point de contact, et la réponse de la plaque n&#39;est plus symétrique par rapport à l&#39;axe de la source. Voilà tout le principe de l&#39;écran tactile SAW en une boucle. On appuie un doigt, les conditions aux limites du problème d&#39;ondes changent, le champ aux récepteurs change, et la position où on a appuyé devient récupérable à partir de la façon dont l&#39;onde a été perturbée sur son passage.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Une mise au point avant que la suite de cette section ne se lise bizarrement. &lt;strong&gt;Les deux clips ci-dessus sont la simulation en &lt;em&gt;mode burst&lt;/em&gt; : une impulsion sinusoïdale finie, puis silence, enregistrée comme réponse impulsionnelle propre.&lt;/strong&gt; Le mode burst est quelque chose que j&amp;rsquo;ai ajouté au programme en 2026, uniquement parce que ça donne une image fixe lisible et une boucle lisible. Le vrai travail de 2009 tournait en &lt;strong&gt;excitation continue&lt;/strong&gt; : une source sinusoïdale entretenue, les récepteurs qui écoutent, le spectre qui s&amp;rsquo;installe en régime stationnaire, l&amp;rsquo;outil de perturbation qu&amp;rsquo;on déplace en direct. C&amp;rsquo;est le régime où le multi-touch et les gestes glissés ont du sens, parce que les deux sont définis par la façon dont le spectre &lt;em&gt;stationnaire&lt;/em&gt; change au cours du temps, pas par une impulsion isolée. Un burst donne un beau GIF. Une source continue donne la vraie boucle d&amp;rsquo;interaction qui était le sujet du projet.&lt;/p&gt;
&lt;p&gt;La qualité visuelle est franchement bonne. Devant la simulation qui tourne en 2026, avec le laplacien à 5 points qui fait son boulot à soixante images par seconde, on &lt;em&gt;voit&lt;/em&gt; pourquoi ça marche. On touche la plaque, les nœuds bougent, les récepteurs voient un signal différent, la FFT voit un spectre différent, on lit la position dans le spectre. La simulation est l&amp;rsquo;explication.&lt;/p&gt;
&lt;h2 id=&#34;ce-que-jai-bâti-dans-ma-chambre&#34;&gt;Ce que j&amp;rsquo;ai bâti dans ma chambre&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;autre moitié du projet, celle qui justifiait la partie &lt;em&gt;cas concret&lt;/em&gt; de la soutenance, était un vrai banc d&amp;rsquo;essai. C&amp;rsquo;est la photo en haut de ce billet.&lt;/p&gt;
&lt;p&gt;La liste de matériel est courte et plaisante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Une plaque plane&lt;/strong&gt;. La page de calendrier 3 par 3 dans la photo est le motif de test ; la plaque elle-même, je n&amp;rsquo;arrive pas à la reconstruire de mémoire avec confiance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un haut-parleur&lt;/strong&gt; (&lt;code&gt;HP&lt;/code&gt; dans les schémas français), piloté par un générateur de signal à fréquence fixe. C&amp;rsquo;est la source SAW.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deux microphones&lt;/strong&gt; collés près de deux coins de la plaque. Avec seulement deux récepteurs, l&amp;rsquo;estimation de position doit venir de l&amp;rsquo;information spectrale, pas d&amp;rsquo;une triangulation par temps de vol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un ordinateur portable&lt;/strong&gt; qui faisait tourner la bibliothèque Java de tracé de Michael T Flanagan, utilisée pour faire la FFT du signal enregistré et lire les pics dominants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une grille de test 3 par 3&lt;/strong&gt; dessinée sur la surface d&amp;rsquo;essai, numérotée de 1 à 9. La soutenance montre comment le spectre change d&amp;rsquo;une position à l&amp;rsquo;autre ; l&amp;rsquo;étape d&amp;rsquo;estimation de position utilise ces spectres pour classer un nouveau toucher.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-la-chaîne-de-traitement-du-signal-de-la-soutenance-source-en-haut-à-droite-haut-parleur-deux-microphones-en-bas-à-droite-de-la-plaque-ordinateur-portable-au-milieu-fft-en-bas-à-gauche-estimation-de-position-en-haut-à-gauche&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Le diagramme du flux de traitement du signal de la soutenance TIPE : un microcontrôleur pilote un générateur de sinus, qui pilote un haut-parleur collé à la plaque. Deux microphones en bas de la plaque écoutent, l&amp;rsquo;ordinateur portable enregistre, la FFT extrait le spectre, et le système rapporte une position&#34; srcset=&#34;
               /fr/post/tipe-saw-revival/schema_hu_b6d5626ddf9d2ab8.webp 400w,
               /fr/post/tipe-saw-revival/schema_hu_7f893f8e8f416d8.webp 760w,
               /fr/post/tipe-saw-revival/schema_hu_f6f47539d7e3c7f4.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/schema_hu_b6d5626ddf9d2ab8.webp&#34;
               width=&#34;760&#34;
               height=&#34;570&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      La chaîne de traitement du signal de la soutenance. Source en haut à droite (haut-parleur), deux microphones en bas à droite de la plaque, ordinateur portable au milieu, FFT en bas à gauche, estimation de position en haut à gauche.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Le résultat, comme écrit sur la slide de conclusion, est :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;9 sur 9&lt;/strong&gt; positions de test classées correctement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environ 1 cm&lt;/strong&gt; de précision spatiale.&lt;/li&gt;
&lt;li&gt;Quelques erreurs de classification que j&amp;rsquo;ai attribuées à l&amp;rsquo;algorithme plutôt qu&amp;rsquo;à la physique (« algorithme perfectible »).&lt;/li&gt;
&lt;li&gt;Une observation surprenante : la &lt;strong&gt;détection sans contact&lt;/strong&gt; semblait possible. Approcher un doigt près de la plaque, sans la toucher, modifiait déjà le spectre suffisamment pour être détectable. Je n&amp;rsquo;avais pas creusé ça à l&amp;rsquo;époque. En 2026, je relis cette ligne dans les slides et j&amp;rsquo;ai envie d&amp;rsquo;y retourner pour approfondir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;















&lt;figure  id=&#34;figure-densité-spectrale-de-puissance-dun-des-signaux-enregistrés-tracée-dans-le-plotgraph-de-michael-t-flanagan-linformation-dépendante-de-la-position-est-dans-les-amplitudes-relatives-des-harmoniques-ce-que-létape-fft-met-en-évidence&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img alt=&#34;Le spectre acquis dans l&amp;rsquo;outil de tracé de Flanagan : un pic fondamental fort autour de 200 Hz, des pics plus petits aux harmoniques, et un pic beaucoup plus haut près de 1,8 kHz qui est la signature qu&amp;rsquo;utilise l&amp;rsquo;algorithme pour classer la position du toucher&#34; srcset=&#34;
               /fr/post/tipe-saw-revival/spectrum_hu_9940831267449326.webp 400w,
               /fr/post/tipe-saw-revival/spectrum_hu_2f78306086a8e47e.webp 760w,
               /fr/post/tipe-saw-revival/spectrum_hu_79bee8603b9a7d7a.webp 1200w&#34;
               src=&#34;https://antoine.weill-duflos.fr/fr/post/tipe-saw-revival/spectrum_hu_9940831267449326.webp&#34;
               width=&#34;760&#34;
               height=&#34;395&#34;
               loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      Densité spectrale de puissance d&amp;rsquo;un des signaux enregistrés, tracée dans le PlotGraph de Michael T Flanagan. L&amp;rsquo;information dépendante de la position est dans les amplitudes relatives des harmoniques, ce que l&amp;rsquo;étape FFT met en évidence.
    &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Neuf sur neuf, isolément, n&amp;rsquo;a peut-être pas l&amp;rsquo;air spectaculaire. Remettons les contraintes : un labo de physique de CPGE, deux micros bon marché, une seule source à fréquence fixe, aucune calibration, et un tracé FFT en Java. Comme preuve de concept qu&amp;rsquo;on peut construire un système de détection de position fonctionnel avec du matériel d&amp;rsquo;épicerie, ça tient debout.&lt;/p&gt;
&lt;h2 id=&#34;le-portage-2026--sdl-12-vers-sdl-2&#34;&gt;Le portage 2026 : SDL 1.2 vers SDL 2&lt;/h2&gt;
&lt;p&gt;Le code original cible &lt;strong&gt;SDL 1.2&lt;/strong&gt;. SDL 1.2 a atteint sa fin de vie en 2012 et n&amp;rsquo;est plus packagé sur une distribution moderne sous une forme utilisable. Donc la simulation telle que retrouvée sur le NAS ne se compilait pas, ne se linkait pas, et ne tournait pas. La ramener à la vie a été un petit travail mais réel, fait en avril 2026 avec Claude comme partenaire de codage et tracé dans le README du dépôt récupéré. Le diff par rapport à la copie originale est court :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SDL_SetVideoMode&lt;/code&gt; a disparu, remplacé par &lt;code&gt;SDL_CreateWindow&lt;/code&gt; plus &lt;code&gt;SDL_GetWindowSurface&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SDL_Flip(ecran)&lt;/code&gt; a disparu, remplacé par &lt;code&gt;SDL_UpdateWindowSurface(fenetre)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SDL_CreateThread&lt;/code&gt; a gagné un argument &lt;code&gt;name&lt;/code&gt; en SDL 2 qui n&amp;rsquo;existait pas en 1.2, donc les appels ont dû être mis à jour.&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;API clavier est le changement le plus invasif. SDL 2 a séparé les touches en &lt;strong&gt;keycodes&lt;/strong&gt; (quel caractère a été logiquement appuyé) et &lt;strong&gt;scancodes&lt;/strong&gt; (quelle touche physique a été appuyée). Le code original indexait un tableau directement par &lt;code&gt;SDLK_*&lt;/code&gt; et supposait que les valeurs étaient contiguës jusqu&amp;rsquo;à &lt;code&gt;SDLK_LAST + 1&lt;/code&gt;. Elles ne le sont plus en SDL 2. Le correctif a été d&amp;rsquo;indexer par &lt;strong&gt;scancode&lt;/strong&gt; à la place, dimensionné par &lt;code&gt;SDL_NUM_SCANCODES&lt;/code&gt;, et de convertir entre les deux avec &lt;code&gt;SDL_GetScancodeFromKey&lt;/code&gt; à la bonne frontière.&lt;/li&gt;
&lt;li&gt;Une poignée de symboles du pavé numérique ont été renommés (&lt;code&gt;SDLK_KP0&lt;/code&gt; en &lt;code&gt;SDLK_KP_0&lt;/code&gt;, avec le tiret bas).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inline void calcul(...)&lt;/code&gt; a dû devenir &lt;code&gt;static inline&lt;/code&gt; pour que le linker soit content sous gcc moderne, parce que le C99 pur ne fournit pas de définition externe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques bizarreries du code original ont survécu au portage. &lt;code&gt;m_attenuation&lt;/code&gt; est déclaré &lt;code&gt;int&lt;/code&gt; et utilisé à deux endroits qui ne sont pas d&amp;rsquo;accord sur si c&amp;rsquo;est un booléen ou un multiplicateur flottant. La touche &lt;code&gt;SDLK_b&lt;/code&gt; est mappée à deux actions différentes dans la même map de touches et la première de la liste chaînée gagne. Aucune des deux n&amp;rsquo;a d&amp;rsquo;incidence sur l&amp;rsquo;expérience. Les deux m&amp;rsquo;ont fait sourire.&lt;/p&gt;
&lt;p&gt;Le résultat compile avec &lt;strong&gt;MSYS2 mingw64 gcc 11.2.0&lt;/strong&gt; contre &lt;strong&gt;SDL 2.30.10&lt;/strong&gt;, tourne sur Windows sans installeur, et produit la même sortie visuelle que le code original en 2009. Le dépôt récupéré, y compris le binaire et les DLLs, vit sur le NAS de la maison. Je ne l&amp;rsquo;ai pas encore mis sur un host Git public, parce que ce n&amp;rsquo;est pas vraiment mon code à publier.&lt;/p&gt;
&lt;h2 id=&#34;une-coda-de-2013&#34;&gt;Une coda de 2013&lt;/h2&gt;
&lt;p&gt;Quelques années plus tard, vers 2013, j&amp;rsquo;ai rencontré &lt;strong&gt;Charles Hudin&lt;/strong&gt; et j&amp;rsquo;ai appris qu&amp;rsquo;il avait travaillé sur l&amp;rsquo;inverse exact de ce dont parlait mon TIPE. Le papier qui en est sorti, avec mon futur directeur de thèse &lt;strong&gt;Vincent Hayward&lt;/strong&gt; comme co-auteur, est Hudin, Lozada et Hayward, &lt;em&gt;&lt;a href=&#34;https://cim.mcgill.ca/~haptic/devices/pub/CH-JL-VH-TOH-15.pdf&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Localized Tactile Feedback on a Transparent Surface Through Time-Reversal Wave Focusing&lt;/a&gt;&lt;/em&gt;, IEEE Transactions on Haptics 8(2):188 à 198, 2015.&lt;/p&gt;
&lt;p&gt;Même plaque, même équation d&amp;rsquo;ondes 2D, même laplacien à 5 points. Les flèches qui pointent dans l&amp;rsquo;autre sens. Là où mon TIPE utilisait les ondes arrivant à des capteurs sur le bord pour deviner &lt;em&gt;où&lt;/em&gt; un doigt avait été placé, Charles utilisait des signaux retournés temporellement et ré-émis depuis des transducteurs sur le bord pour &lt;em&gt;focaliser&lt;/em&gt; un front d&amp;rsquo;onde sur un point choisi de la plaque, assez brièvement et assez intensément pour créer une sensation tactile localisée juste sous le doigt. Détection d&amp;rsquo;un côté, génération de l&amp;rsquo;autre. La même simulation, jouée à l&amp;rsquo;envers dans le temps.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est le genre de connexion qu&amp;rsquo;on ne voit pas venir. Une fois qu&amp;rsquo;on la voit, un TIPE de 2009 cesse de ressembler à un fichier fermé et commence à ressembler à la première moitié d&amp;rsquo;un fil plus long.&lt;/p&gt;
&lt;h2 id=&#34;ce-qui-mest-resté&#34;&gt;Ce qui m&amp;rsquo;est resté&lt;/h2&gt;
&lt;p&gt;Il y a un motif que je remarque souvent dans ma propre histoire technique. Ce dont je me souviens d&amp;rsquo;un projet n&amp;rsquo;est presque jamais le résultat. C&amp;rsquo;est la &lt;em&gt;technique&lt;/em&gt;, ou parfois juste une seule image. De ce TIPE, ce que j&amp;rsquo;ai retenu c&amp;rsquo;est la &lt;strong&gt;forme&lt;/strong&gt; du problème (un laplacien à 5 points sur une grille régulière reste l&amp;rsquo;introduction canonique à la simulation d&amp;rsquo;ondes), l&amp;rsquo;idée visuelle des lignes nodales qui bougent quand on touche la plaque, et la satisfaction de voir neuf sur neuf sur une matrice de confusion. Le travail CUDA, dont je suis sûr de l&amp;rsquo;avoir fait et dont je ne retrouve pas la source, vit dans ma tête comme une ambition plutôt que comme du code. Et c&amp;rsquo;est très bien aussi. L&amp;rsquo;ambition dont on se souvient assez bien pour la décrire est, avec le recul, plus durable que du code dont on se souvient juste comme d&amp;rsquo;un nom de fichier.&lt;/p&gt;
&lt;p&gt;Récupérer la moitié survivante, fichier par fichier en relisant le code source de 2009, a été son propre petit plaisir archéologique : chaque nom de variable dans le bon style français, chaque appel d&amp;rsquo;API manifestement écrit par un étudiant de CPGE pressé.&lt;/p&gt;
&lt;p&gt;Il y a une petite ironie dans la moitié qui a survécu. La version CUDA était l&amp;rsquo;impressionnante de 2009, celle que j&amp;rsquo;aurais voulu montrer, celle qui aurait fait dresser l&amp;rsquo;oreille du jury. Le jumeau CPU était, par comparaison, le sûr et l&amp;rsquo;évident. Dix-sept ans plus tard, le sûr et l&amp;rsquo;évident est celui qui tourne encore. Un build CUDA de 2009 ne tournerait pas sur un GPU de 2026 sans son propre portage substantiel : les &lt;em&gt;compute capabilities&lt;/em&gt; ont bougé, la toolkit s&amp;rsquo;est réécrite deux fois, la liste de dépréciations est longue. Du code portable avec une API propre survit à du code spécifique à une plateforme avec une API excitante. Voilà, je pense, la vraie leçon de la fouille.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
