Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2021-11-30T05:20:53+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Jouons à implémenter une transformée de Fourier rapide !, message #2392472021-11-30T05:20:53+01:00Arius/@Ariushttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p239247<p>Bonjour,</p>
<p>La bêta du contenu « Jouons à implémenter une transformée de Fourier rapide ! » a été désactivée (tuto publié).</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347732021-05-30T17:02:43+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234773<p>Bonjour les agrumes !</p>
<p>La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">Jouons à implémenter une transformée de Fourier rapide !</a> </p></div>
<p>Merci d’avance pour vos commentaires.</p>
<p>Et voilà ! J’espère que je n’ai pas trop spammé l’équipe de validation en mettant à jour le contenu ^^'</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347642021-05-30T15:25:29+02:00luxera/@luxerahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234764<p>J’ai quelques remarques à te faire sur la forme, qui sont détails avant de passer à la validation :</p>
<ul>
<li>la sous-partie <em>Résumé des performances</em> ressemble pas mal à une conclusion, et par ailleurs tu n’as pas de conclusion qui suit : je te suggère donc de passer tout ou partie de cette sous-partie dans la conclusion de la partie;</li>
<li>le tutoriel n’a pas de miniature, or c’est obligatoire : tu devrais pouvoir reprendre une image de ton tuto en la recadrant un peu;</li>
<li>je pense que d’autres sections (comme <em>Programmation et algorithmique</em>) seraient adaptées à ton tuto.</li>
</ul>
<p>C’est à peu près tout pour moi.</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347612021-05-30T14:57:45+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234761<p>Bonjour les agrumes !</p>
<p>La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">Jouons à implémenter une transformée de Fourier rapide !</a> </p></div>
<p>Merci d’avance pour vos commentaires.</p>
<p>Merci pour vos retours, je pense que j’ai tout intégré, sauf la précision sur la continuité vu que c’est fait juste après, et les points d’exclamation parce que j’ai bien un espace avant dans le code Markdown, donc je suppose que c’est l’outil de rendu de Zeste de Savoir qui les retire.</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347592021-05-30T14:14:34+02:00luxera/@luxerahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234759<p>Merci pour la réponse !</p>
<p>Je ne pense pas non plus qu’il faille trop s’y étendre dans le tutoriel. Maintenant, tu as le recul et les données qui confirment l’affirmation du bouquin, et si des gens se posent des questions là-dessus il sera facile de les rediriger sur ton post.</p>
<p>J’allais relever quelques typos mais <a href="/membres/voir/Gawaboumga/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Gawaboumga</span></a> l’a fait mieux que moi pendant que je rédigeais.</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347582021-05-30T14:10:17+02:00Gawaboumga/@Gawaboumgahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234758<p>Hello,</p>
<p>J’ai été étonné par le nombre de changements apportés en si peu de temps, et pour le mieux !</p>
<p>Plus grand chose à dire, alors je mets juste les fautes que j’ai repérées.</p>
<blockquote>
<p>il peut être intéressant d’implémenter et <strong>d'</strong>optimiser sa propre FFT. Une application qui a peu été discutée dans ce tutoriel est le calcul de produits de convolution. Une méthode efficace dans le cas où on convolue des signaux de longueur<strong>s</strong> comparable est </p>
</blockquote>
<blockquote>
<p>Dans cette première partie<strong>,</strong> je vous propose de découvrir comment construire la transformée de Fourier discrète puis comprendre pourquoi la transformée de F<strong>O</strong>urier rapide est utile.</p>
</blockquote>
<blockquote>
<p>Nous utiliserons la suivante : <em>(étant donné ?)</em> pour une fonction f, sa transformée de Fourier \hat{f} est défini<strong>e</strong> par:</p>
</blockquote>
<blockquote>
<p>De la transformée de Fourier à la transformée de Fourier discrète</p>
</blockquote>
<p>Préciser qu’elle est continue ?</p>
<blockquote>
<p>Par exemple<strong>,</strong> si on regarde un signal temporel comme la valeur d’une tension lue sur un voltmètre, on pourrait enregistrer la valeur à chaque tic d’une montre.</p>
</blockquote>
<blockquote>
<p>On échantillonne la transformée de Fourier du signal pour obtenir la transformée de F<strong>O</strong>urier discrète.</p>
</blockquote>
<blockquote>
<p>Avec δ la distribution de Dirac. Voici le graphe que l’on peut obtenir si l’on représente f et g ensemble.</p>
</blockquote>
<p>g est défini juste après.</p>
<blockquote>
<p>les cloches de la transformée du signal échantillon<strong>n</strong>é se sup<strong>p</strong>erposent.</p>
</blockquote>
<blockquote>
<p> Il est clair que l’on souhaite que l’échantillon<strong>n</strong>age soit le plus "fin" possible, pour ne manque aucun détail de la transformée de Fourier** **!</p>
</blockquote>
<p>De manière générale, je ne suis pas convaincu que échantillonn* prennent bien 2 n partout dans le texte.</p>
<blockquote>
<p>Or<strong>,</strong> la transformée de Fourier inverse (l’opération qui permet de retrouver le signal à partir de sa transformée de Fourier) </p>
</blockquote>
<blockquote>
<p>Il faudrait ici justifier que l’on peut inverser les <em>symboles</em> signes somme et intégrale</p>
</blockquote>
<blockquote>
<p>n effet la fonction exp et les opérateurs de division et multiplication son<strong>t</strong> définis pour des scalaires. Cette macro permet d’informer Julia qu’il doit appliquer les opérations scalaires terme<strong>s</strong> à terme.</p>
</blockquote>
<blockquote>
<p>La transformée de Fourier a d’abord un<strong>e</strong> foultitude d’application<strong>s</strong> théorique<strong>s</strong>, que ce soit pour résoudre des équations différentielles, en traitement du signal ou en physique quantique. Elle possède également des applications pratique en optique et en spectroscopie.</p>
</blockquote>
<blockquote>
<p>100 000 000 000 octets de mémoire <em>préciser 100Go ?</em> (un nombre complexe <em>étant</em> est stocké sur 2 flottants)</p>
</blockquote>
<blockquote>
<p>637<strong>espace</strong> 537 millisecondes, soit plus de 10 minutes<strong>espace</strong>!</p>
</blockquote>
<p>De manière générale, j’ai l’impression que ton éditeur de texte est en anglais et colle le point d’exclamation au dernier mot de la phrase.</p>
<blockquote>
<p>D’après notre benchmark, l’algorithme traite une entrée de 1024 points en 23.785<strong>µ</strong>ms.</p>
</blockquote>
<blockquote>
<p>Au plus<strong>,</strong> on a donc log_2(N) tableaux alloués avec des tailles divisées par deux à chaque fois.</p>
</blockquote>
<p>Je sais qu’il y a débat sur l’usage de la virgule après des adverbes dits "charnières" ou des conjonctions de coordination. En fonction de s’ils sont inclus dans le groupement des mots qui suit.</p>
<blockquote>
<p>Autrement dit, cela donne l’idée que l’on pour<strong>r</strong>ait s’épargner toutes ces allocations de tableaux</p>
</blockquote>
<blockquote>
<p>Il y a deux petites subtilités dues à Julia : les tableaux commencent leur numérotation à 1, et on utilise la macro <a href="/membres/voir/inbounds/" rel="nofollow" class="ping ping-link">@<span class="ping-username">inbounds</span></a> pour accélérer un peu le code en désactivant les vérifications de débordement de tableaux.</p>
</blockquote>
<p>Pourquoi ce n’est pas dans un encart warning comme tes précédentes remarques sur le plus ou moins égale ou @. ?</p>
<blockquote>
<p>Le tableau h<strong>,</strong> qui est présenté précédemment<strong>,</strong> est à valeurs complexes</p>
</blockquote>Jouons à implémenter une transformée de Fourier rapide !, message #2347562021-05-30T12:55:14+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234756<p>Salut, merci pour le retour ! <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>je viens de me rendre compte que j’ai oublié d’intégrer la remarque sur le public visé dans l’intro…</p>
<figure><blockquote>
<p>J’ai tout de même une question : dans la section <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/implementons-la-fft/#7-optimisation-des-fonctions-trigonometriques">optimisation des fonctions trigonométriques</a>, tu donnes une méthode de calcul par récurrence en précisant que "Cette relation présente également des intérêts en terme de stabilité numérique." En quoi est-ce avantageux, par rapport à la relation "naïve", que tu utilises pour montrer la validité de cette relation ? Est-ce parce qu’on vient uniquement ajouter ou soustraire des petits nombres, au lieu de commencer par une multiplication ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234755">luxera</a></figcaption></figure>
<p>Je plaide coupable d’avoir un peu pris <em>Numerical Recipes</em> au mot. Texto, voici ce qu’ils indiquent :</p>
<figure><blockquote>
<p>The reason for doing things this way, rather than with the standard (and equivalent)
identities for sums of angles, is that here <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span></span></span></span></span> ̨and <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>β</mi></mrow><annotation encoding="application/x-tex">\beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span></span></span></span></span> do not lose significance if the
incremental <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\delta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03785em;">δ</span></span></span></span></span> is small. Likewise, the adds in equation (5.4.6) should be done in the
order indicated by the square brackets.</p>
</blockquote><figcaption>Numerical Recipes</figcaption></figure>
<p>Donc de ce que j’en comprend, si on utilise la relation bien connue de <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>cos</mi><mo></mo><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\cos(a+b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">cos</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span></span></span></span></span> il y a des chances que l’on trouve des résultats aberrants pour les petites valeurs de <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\delta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03785em;">δ</span></span></span></span></span>. Du coup je me suis demandé à quel point c’était vraiment critique, et pour des incréments de <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>π</mi><mi mathvariant="normal">/</mi><mn>1024</mn></mrow><annotation encoding="application/x-tex">2\pi/1024</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="mord">/</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span></span></span> il faut vraiment le chercher pour faire dérailler la méthode naive, mais on finit quand meme par y arriver en utilisant des flottants demi précision (Float16) autour des points où l’une des deux fonctions s’annulent :</p>
<figure><img src="/media/galleries/5914/67df38ea-6879-4551-84bc-3e8b2cc3a32d.png" alt="En forçant bien, ça casse."><figcaption>En forçant bien, ça casse.</figcaption></figure>
<p>Je ne sais pas si ça vaut le coup d’insister dessus dans le tutoriel par contre ?</p>
<p>Le code pour générer la figure pour celles et ceux qui veulent jouer :</p>
<div class="hljs-code-div hljs-code-julia"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span><span data-count="56"></span><span data-count="57"></span><span data-count="58"></span><span data-count="59"></span><span data-count="60"></span></div><pre><code class="hljs language-julia"><span class="hljs-keyword">using</span> Plots, LaTeXStrings,
background_color = RGB(<span class="hljs-number">250</span>/<span class="hljs-number">255</span>, <span class="hljs-number">250</span>/<span class="hljs-number">255</span>, <span class="hljs-number">250</span>/<span class="hljs-number">255</span>)
blue = RGB(<span class="hljs-number">11</span>/<span class="hljs-number">255</span>, <span class="hljs-number">90</span>/<span class="hljs-number">255</span>, <span class="hljs-number">127</span>/<span class="hljs-number">255</span>)
orange = RGB(<span class="hljs-number">248</span>/<span class="hljs-number">255</span>, <span class="hljs-number">171</span>/<span class="hljs-number">255</span>, <span class="hljs-number">48</span>/<span class="hljs-number">255</span>)
n = <span class="hljs-number">2</span>^<span class="hljs-number">10</span>
T = <span class="hljs-built_in">Float16</span>
cosines_nr, sines_nr = <span class="hljs-keyword">let</span>
res_cos = zeros(T, n)
res_sin = zeros(T, n)
δ = T(<span class="hljs-number">2</span><span class="hljs-literal">π</span>/n)
cj, sj = T(<span class="hljs-number">1</span>),T(<span class="hljs-number">0</span>)
α = <span class="hljs-number">2</span>sin(δ/<span class="hljs-number">2</span>)^<span class="hljs-number">2</span>
β = sin(δ)
<span class="hljs-keyword">for</span> j ∈ <span class="hljs-number">1</span>:n
res_cos[j] = cj
res_sin[j] = sj
cj, sj = cj - (α*cj + β*sj), sj - (α*sj-β*cj)
<span class="hljs-keyword">end</span>
res_cos, res_sin
<span class="hljs-keyword">end</span>
cosines_simple, sines_simple = <span class="hljs-keyword">let</span>
res_cos = zeros(T, n)
res_sin = zeros(T, n)
δ = T(<span class="hljs-number">2</span><span class="hljs-literal">π</span>/n)
cj, sj = T(<span class="hljs-number">1</span>),T(<span class="hljs-number">0</span>)
α = cos(δ)
β = sin(δ)
<span class="hljs-keyword">for</span> j ∈ <span class="hljs-number">1</span>:n
res_cos[j] = cj
res_sin[j] = sj
cj, sj = cj*α - sj*β, cj*β + sj*α
<span class="hljs-keyword">end</span>
res_cos, res_sin
<span class="hljs-keyword">end</span>
cosines_true, sines_true = <span class="hljs-keyword">begin</span>
δ = <span class="hljs-number">2</span><span class="hljs-literal">π</span>/n
θ = range(<span class="hljs-number">0</span>, length=n, step=δ)
cos.(θ), sin.(θ)
<span class="hljs-keyword">end</span>
plot_sines = <span class="hljs-keyword">begin</span>
plot(
θ,
[cosines_true cosines_simple cosines_nr sines_true sines_simple sines_nr],
label=[<span class="hljs-string">"True cosine"</span> <span class="hljs-string">"Naive cosine"</span> <span class="hljs-string">"NR cosine"</span> <span class="hljs-string">"True sine"</span> <span class="hljs-string">"Naive sine"</span> <span class="hljs-string">"NR sine"</span> ],
linestyle=[:solid :dash :dot :solid :dash :dot],
color=[blue blue blue orange orange orange],
background_color=background_color,
border=:box,
xlabel=<span class="hljs-string">L"\theta"</span>,
)
lens!([<span class="hljs-literal">π</span>-<span class="hljs-number">0.5</span>, <span class="hljs-literal">π</span>+<span class="hljs-number">0.5</span>], [-<span class="hljs-number">1.1</span>, -<span class="hljs-number">0.9</span>], inset=(<span class="hljs-number">1</span>, bbox(<span class="hljs-number">0.5</span>, <span class="hljs-number">0.1</span>, <span class="hljs-number">0.4</span>, <span class="hljs-number">0.4</span>)), border=:box)
<span class="hljs-keyword">end</span>
savefig(plot_sines, <span class="hljs-string">"plot_trigo.png"</span>)
</code></pre></div>Jouons à implémenter une transformée de Fourier rapide !, message #2347552021-05-30T11:22:18+02:00luxera/@luxerahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234755<p>Salut,</p>
<p>Pour moi le tutoriel est clair, et je n’ai pas remarqué d’erreur de fond.</p>
<p>J’ai tout de même une question : dans la section <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/implementons-la-fft/#7-optimisation-des-fonctions-trigonometriques">optimisation des fonctions trigonométriques</a>, tu donnes une méthode de calcul par récurrence en précisant que "Cette relation présente également des intérêts en terme de stabilité numérique." En quoi est-ce avantageux, par rapport à la relation "naïve", que tu utilises pour montrer la validité de cette relation ? Est-ce parce qu’on vient uniquement ajouter ou soustraire des petits nombres, au lieu de commencer par une multiplication ?</p>
<p>Par ailleurs, j’appuie la remarque de <a href="/membres/voir/zeqL/" rel="nofollow" class="ping ping-link">@<span class="ping-username">zeqL</span></a> concernant le public visé : ce serait bien de mettre une petite phrase dans l’introduction pour préciser ce que tu nous a dit ici.</p>
<p>Sinon, pour avoir suivi rapidement l’historique, je trouve que tu as nettement amélioré la structure et la lisibilité, ce qui est une bonne chose !</p>Jouons à implémenter une transformée de Fourier rapide !, message #2347342021-05-29T17:08:53+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234734<p>Bonjour les agrumes !</p>
<p>La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">Jouons à implémenter une transformée de Fourier rapide !</a> </p></div>
<p>Merci d’avance pour vos commentaires.</p>Jouons à implémenter une transformée de Fourier rapide !, message #2346512021-05-27T10:08:38+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234651<p>Salut,</p>
<p>Merci pour ton retour, <em>a priori</em> le public visé a déjà utilisé une transformée de Fourier, sans pour autant l’avoir déjà implémenté. Je comprends les remarques sur la forme et j’ai quelques idées pour rendre ça plus visuel, surtout la première partie. Je peux potentiellement faire des GIF animés aussi, je verrais ce qui rend le mieux !</p>Jouons à implémenter une transformée de Fourier rapide !, message #2346422021-05-26T23:59:48+02:00zeqL/@zeqLhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234642<p>Salut,</p>
<p>Je n’ai pas lu en détails car je n’ai pas le niveau mathématique suffisant, néanmoins quelques remarques :</p>
<ul>
<li>A qui s’adresse cet article ? Quel est le public visé ?</li>
<li>Retravailler la forme pour que ce soit un peu plus aéré, plus facile à lire</li>
</ul>
<p>Pour le premier point, ça serait pas mal de mettre une indication dans l’introduction. Là comme ça, quand je survole l’article, je vois plein d’équations à base de sigma, d’intégrales, pfiiuu ça fait un peu peur <img src="/static/smileys/svg/siffle.svg" alt=":-°" class="smiley"><br>
De même il y a quelques blocs de code avec de gros pavés textuels. On rejoint là la remarque sur la forme. </p>
<p>Je comprend que l’objectif n’est pas de faire une présentation détaillée de la FFT, sujet assez traité sur le net, mais ne mettre que des équations et aucun graphique alors qu’on parle d’échantillonnage, je trouve ça vraiment dommage.<br>
C’est probablement un parti pris de rester dans la partie mathématique, mais les applications de la FFT sont concrètes, par exemple dans les oscilloscopes.</p>
<p>L’article est relativement long, mais c’est en partie dû aux nombreuses équations et blocs de code. Néanmoins mettre cet article en tutoriel avec deux parties distinctes : une première où tu introduit la transformée de Fourrier et la FFT au niveau mathématique et une seconde sur la partie code et optimisation; ça ferait quelque chose de plus clair et surtout enlèverait une sorte de poids sur la longueur de l’article. </p>Jouons à implémenter une transformée de Fourier rapide !, message #2346412021-05-26T23:52:36+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234641<p>Bonjour les agrumes !</p>
<p>La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">Jouons à implémenter une transformée de Fourier rapide !</a> </p></div>
<p>Merci d’avance pour vos commentaires.</p>
<hr>
<p>Et voici les dernières remarques intégrées. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"> S’il n’y a pas d’autres remarques d’ici à vendredi soir je l’enverrais en validation.</p>
<figure><blockquote>
<p>Ca m’a également fait tilt, mais éventuellement mentionner la matrice de Vandermonde avec la forme matricielle ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234637">Gawaboumga</a></figcaption></figure>
<p>Oui tout à fait ! D’ailleurs cette matrice de Vandermonde permet de visualiser la FFT comme un algorithme qui peut servir à multiplier deux polynômes. J’ai mis un lien vers <a href="https://www.youtube.com/watch?v=h7apO7q16V0">cette vidéo</a> que j’aime beaucoup dans le tutoriel.</p>Jouons à implémenter une transformée de Fourier rapide !, message #2346372021-05-26T21:47:56+02:00Gawaboumga/@Gawaboumgahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234637<p>Hello,</p>
<p>Désolé, je n’ai fait que survoler les modifications que tu as apportées. Et, a priori, elles me conviennent !</p>
<blockquote>
<p>J’ai du mal à voir comment tourner ça. Je ne suis pas certain de comprendre si ce qui te dérange est que j’assimile la transformée de Fourier du signal à l’évaluation de cette transformée sur tous les points qui nous intéressent, ou si c’est plus simplement la tournure de ma phrase qui n’est pas claire ?</p>
</blockquote>
<p>Ce que je voulais exprimer, c’est que dans l’expression de la transformée de Fourier:</p>
<p>$$ \hat{f}(\nu) = \int_{-\infty}<sup>{+\infty} f(x) e</sup>{-2i\pi \nu x} dx $$</p>
<p>Tu as deux variables <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">x</span></span></span></span></span> (dépendante) et <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ν</mi></mrow><annotation encoding="application/x-tex">\nu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.06366em;">ν</span></span></span></span></span> (indépendante), mais tu parles également de "valeur" pour désigner <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>f</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>ν</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\hat{f}(\nu)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2078799999999998em;vertical-align:-0.25em;"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9578799999999998em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.26344em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.08332999999999999em;"><span class="mord">^</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.06366em;">ν</span><span class="mclose">)</span></span></span></span></span>. Cf:</p>
<blockquote>
<p>c’est à dire que l’on stocke la valeur du signal pour une suite de valeurs de sa variable. Dans le cas de la FFT, on échantillonne avec un pas constant. Par exemple si on regarde un signal temporel comme la valeur d’une tension lue sur un voltmètre, on pourait enregistrer la valeur à chaque tic d’une montre.</p>
</blockquote>
<p>Donc, quand tu parles de la "valeur du signal pour des valeurs de sa variable", je ne trouve vraiment pas cela clair. Surtout que DFT permet de calculer la "représentation spectrale discrète du signal échantillonné", on ne s’intéresse pas au "signal" à proprement parler mais à son spectre. Quitte à remplacer "de sa variable" par <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ν</mi></mrow><annotation encoding="application/x-tex">\nu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.06366em;">ν</span></span></span></span></span> ou parler de l’évaluation du spectre du signal. Je ne sais pas si c’est plus clair.</p>
<p>PS: on pour<strong>r</strong>ait.</p>
<blockquote>
<p>Pour le coup je préfère <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span></span>, *∗ est souvent associé au produit de convolution en physique et en traitement du signal.</p>
</blockquote>
<p>Tu as parfaitement raison, j’avais oublié la notation du produit de convolution !</p>
<blockquote>
<p>Par contre je ne suis pas super à l’aise sur la deuxième partie de ta remarque, donc si tu as un peu de biblio vers laquelle m’orienter (ou même orienter le lecteur) je suis preneur.</p>
</blockquote>
<p>Je dois admettre ne pas pouvoir aider davantage. Les algorithmes que tu as proposés et celui officiel sont tous différents. En ce sens, qu’au delà de la vitesse d’exécution ou de la consommation mémoire, tu évoquais à juste titre que:</p>
<blockquote>
<p>Je ne peut traiter que des tableaux dont la taille est une puissance de 2;</p>
</blockquote>
<p>Cela me semble très important comme différence à mentionner ! Je me demandais également si les résultats étaient "strictement égaux" pour une large variété de fonctions et pas seulement ton exemple. La fonction <em>rand</em> de Julia doit sans doute retourner des nombres entre 0 et 1 qui ont l’avantage de généralement très bien se comporter en arithmétique floatante. Chaque opération sur des floats peut introduire des erreurs et certaines peuvent en introduire plus que d’autres. C’était le sujet de ma réflexion mais si personne n’a le niveau pour répondre précisément à ce genre de questions, tant pis …</p>
<hr>
<p>Ca m’a également fait tilt, mais éventuellement mentionner la matrice de Vandermonde avec la forme matricielle ?</p>Jouons à implémenter une transformée de Fourier rapide !, message #2345712021-05-25T23:07:05+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234571<p>Bonjour les agrumes !</p>
<p>La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">Jouons à implémenter une transformée de Fourier rapide !</a> </p></div>
<p>Merci d’avance pour vos commentaires.</p>
<hr>
<p>Merci à tous les deux pour vos retours, j’ai essayé de les incorporer au mieux !</p>
<figure><blockquote>
<p>Je suis même assez impressionné que l’implémentation en Julia arrive au niveau d’une implémentation de référence de FFTW. Tu as une idée des raisons qui font que ton implémentation arrive à être meilleure sur certaines entrées d’ailleurs ? Je suis assez curieux… <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"></p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234566">Næ</a></figcaption></figure>
<p>Je ne connais pas en profondeur le code source de FFTW, mais comme ça j’ai trois hypothèses : </p>
<ol>
<li>(à mon avis la plus probable, en tout cas celles qui joue le plus) L’implémentation du reverse bit ordering <em>ad-hoc</em> dans mon code. En pratique cela constitue un très gros raccourci dont FFTW ne peut probablement pas savoir qu’il peut l’utiliser (condition sur la taille des tableaux etc);</li>
<li>Je ne peut traiter que des tableaux dont la taille est une puissance de 2;</li>
<li>FFTW est une bibliothèque externe en C que Julia doit appeler, il y a peut-être un très léger surcoût</li>
</ol>
<figure><blockquote>
<p>Quelques doutes sur cette affirmation. Il y a des chances que le stack - une partie de la mémoire - soit employé, non ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234569">Gawaboumga</a></figcaption></figure>
<p>Oui tout à fait, j’avais encore la tête dans mon Arduino en écrivant ça je crois. <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"></p>
<figure><blockquote>
<p>J’essayerais d’éviter la confusion entre la valeur de la variable, et l’"évaluation" (la valeur ou un autre terme) de la transformée.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234569">Gawaboumga</a></figcaption></figure>
<p>J’ai du mal à voir comment tourner ça. Je ne suis pas certain de comprendre si ce qui te dérange est que j’assimile la transformée de Fourier du signal à l’évaluation de cette transformée sur tous les points qui nous intéressent, ou si c’est plus simplement la tournure de ma phrase qui n’est pas claire ?</p>
<figure><blockquote>
<p>Personnellement, je ne suis pas fan de symbole "X", j’aurais préféré un "*".</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234569">Gawaboumga</a></figcaption></figure>
<p>Pour le coup je préfère <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span></span>, <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∗</mo></mrow><annotation encoding="application/x-tex">*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.46528em;vertical-align:0em;"></span><span class="mord">∗</span></span></span></span></span> est souvent associé au produit de convolution en physique et en traitement du signal.</p>
<figure><blockquote>
<p>Petite référence du livre =) Que ce soit dans l’introduction ou dans le texte.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234569">Gawaboumga</a></figcaption></figure>
<p>Et… je viens de me rendre compte en rédigeant ce message que j’ai oublié de m’occuper de ça. Je le derais la modification demain.</p>
<figure><blockquote>
<p>Il faudrait peut-être parler à la fin des différences entre les algorithmes proposés, que ce soit l’officiel FFTW! ou le dernier FFT4. Peut-être que la perte de temps vient du "padding" rajouter par FFTW ou du changement de format dans les données (voir la ligne: real.(b[1:end÷2]) ≈ c[1:2:end] && imag.(b[1:end÷2]) ≈ c[2:2:end]). Quid de leur stabilité numérique, de leur erreur intrinsèque, de complexité asymptotique (ne pas répondre O(NlogN)O(N \log N)O(NlogN) =) )</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/#p234569">Gawaboumga</a></figcaption></figure>
<p>Idem, j’ai oublié de faire la modification. Par contre je ne suis pas super à l’aise sur la deuxième partie de ta remarque, donc si tu as un peu de biblio vers laquelle m’orienter (ou même orienter le lecteur) je suis preneur.</p>
<p><strong>Edit:</strong> Bon en fait il y a <a href="https://www.researchgate.net/publication/2986439_The_Design_and_implementation_of_FFTW3">un papier qui parle du design de FFTW</a>. Je vais essayer de parler de tout ça sans trop dire de bêtises (ça commence à s’éloigner de mon domaine d’expertise)</p>Jouons à implémenter une transformée de Fourier rapide !, message #2345692021-05-25T22:09:24+02:00Gawaboumga/@Gawaboumgahttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234569<p>Hello,</p>
<p>Je pense que le point évoqué par Næ est assez central. Considérer la notion de transformée de Fourier comme acquise est tout à fait acceptable vu que ce n’est pas le sujet de ce tutoriel. Mais pourquoi alors épiloguer sur la définition de celle discrète, si ce n’est pour introduire, soit des applications pratiques ou un contexte historique. Rien n’empêcherait de résoudre le problème de manière purement symbolique et de calculer le résultat de la transformée à la demande en suivant d’autres algorithmes d’évaluation d’intégrales par exemple.</p>
<p>Il faudrait peut-être parler à la fin des différences entre les algorithmes proposés, que ce soit l’officiel FFTW! ou le dernier FFT4. Peut-être que la perte de temps vient du "padding" rajouter par FFTW ou du changement de format dans les données (voir la ligne: real.(b[1:end÷2]) ≈ c[1:2:end] && imag.(b[1:end÷2]) ≈ c[2:2:end]). Quid de leur stabilité numérique, de leur erreur intrinsèque, de complexité asymptotique (ne pas répondre <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>N</mi><mi>log</mi><mo></mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(N \log N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span></span> =) )</p>
<p>Sinon, voici les remarques purement textuelles:</p>
<blockquote>
<p>Nous utiliserons la suivante : pour une fonction f, sa transformée de Fourier f chapeau est</p>
</blockquote>
<p>J’aurais rajouté un: "défini par/comme suit:"</p>
<blockquote>
<p>Comme on l’a vu, la transformée de Fourier est définie de manière continue.</p>
</blockquote>
<p>Non, on ne l’a pas vu ensemble =)</p>
<blockquote>
<p>Or, notre ordinateur ne dispose que d’une taille finie de mémoire, donc pour représenter un signal quelconque, nous ne pouvons utiliser qu’un nombre fini de valeurs.</p>
</blockquote>
<p>L’implication du "donc" est hors-sujet. Il faudrait reformuler du style "Or, pour représenter un signal quelconque, notre ordinateur ne dispose que d’une taille finie de mémoire"</p>
<blockquote>
<p>On échantillonne (ou discrétise) le signal à analyser, c’est à dire que l’on stocke la valeur du signal pour une suite de valeurs de sa variable.</p>
</blockquote>
<p>J’essayerais d’éviter la confusion entre la valeur de la variable, et l’"évaluation" (la valeur ou un autre terme) de la transformée.</p>
<blockquote>
<p>Avec \deltaδ la distribution de Dirac.</p>
</blockquote>
<p>Éventuellement rajouter la définition de la fonction de Dirac.</p>
<blockquote>
<p>g = ш_T X f</p>
</blockquote>
<p>Personnellement, je ne suis pas fan de symbole "X", j’aurais préféré un "*".</p>
<blockquote>
<p>Le choix du fenêtrage n’est absolument pas anodin, et peut mener à des problèmes innatendus si on l’ignore.</p>
</blockquote>
<p>Inattendus</p>
<blockquote>
<p>alors sa transformée de Fourier inverse se périodique de période 1/νs</p>
</blockquote>
<p>Se périodique ? Ca m’a fait penser à "rotationer" =)</p>
<blockquote>
<p>On peut donc implémenter relativement ce calcul !</p>
</blockquote>
<p>Mais oui c’est clair !</p>
<blockquote>
<p>Dans le code julia un symbole @.</p>
</blockquote>
<p>Je ne sais pas lire Julia mais c’est quoi "@." alors qu’il y a une précision sur le "+/- égale"</p>
<blockquote>
<p>Notre implémentation est donc vraiment lente et possède une empreinte mémoire très élevée par comparaison avec l’implémentation de référence ! Pour améliorer cela, nous allons implémenter la transformée de Fourier rapide.</p>
</blockquote>
<p>Peut-être préciser que le facteur est 5000 ?</p>
<blockquote>
<p>Cela qu’en calculant deux transformées de Fourier de longueur N/2,</p>
</blockquote>
<p>Mais oui c’est clair !</p>
<blockquote>
<p>cela dessine naturelement une implémentation récursive de la FFT.</p>
</blockquote>
<p>naturellement</p>
<blockquote>
<p>La seule subtilité est qu’il ne faut réaliser l’inversion qu’une fois par case</p>
</blockquote>
<p>Cela m’a fait buggé le mot "case" parce qu’il s’agit du premier emploi du terme sans spécifier ce qu’il désigne.</p>
<blockquote>
<p>(cela signifie que le compilateur place les quelques variables intermédiaires dans des registres du compilateur)</p>
</blockquote>
<p>Quelques doutes sur cette affirmation. Il y a des chances que le stack - une partie de la mémoire - soit employé, non ?</p>
<blockquote>
<p>Afin d’économiser de l’espace de stockage, on peut penser à utiliser cette moitié de tableau pour stocker noss nombres complexes.</p>
</blockquote>
<p>Outre la type "nos" nombres complexes. La phrase juste avant précise qu’on s’intéresse (le plus souvent) aux signaux réels alors pourquoi conserver des nombres complexes ? La suite des phrases n’est pas cohérente.</p>
<blockquote>
<p>Numerical Recipes on peut lire (section 5.4 "Recurrence Relations and Clenshaw’s Recurrence Formula", page 219 de la troisième édition)</p>
</blockquote>
<p>Petite référence du livre =) Que ce soit dans l’introduction ou dans le texte.</p>
<blockquote>
<p>my_fft_4(x)</p>
</blockquote>
<p>Inversion des benchmarks par rapport à tous ceux présentés précédemment.</p>
<blockquote>
<p>Im et Re</p>
</blockquote>
<p>Je conforte ce que dit Næ, l’écriture gothique est illisible. J’ai du mal à interpréter la formule de récurrence des termes.
</p>Jouons à implémenter une transformée de Fourier rapide !, message #2345662021-05-25T20:36:52+02:00Næ/@N%C3%A6https://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234566<p>Je trouve ça assez chouette comme genre de tutoriel, qui rentre pas mal dans les détails, mais avec plusieurs niveaux de “difficulté” qui arrivent progressivement.</p>
<p>J’ai fait une première lecture rapide, trop rapide pour pouvoir formuler encore des retours précis sur les détails, mais j’ai quand même quelques points qui me sont venus à l’esprit.</p>
<p>Je pense qu’il manque peut-être une motivation un peu générale ; tu l’as dit au tout début, la vocation de ce tutoriel n’est pas de “présenter la transformée de Fourier”. Je comprends que ce n’est pas forcément le lieu pour faire une introduction de l’objet mathématique, et que ce n’est pas l’objet du tutoriel. Je pense néanmoins que quelques points “historiques’ qui ont motivé la recherche d’un algo efficace pour calculer des transformées de Fourier pourraient quand même valoir le coup d’être mentionnés et rester pertinent pour ton public. Une manière de voir ça est que tout au long du tutoriel, l’étalon que tu utilises pour voir où en est ton implémentation est celui de la comparaison avec une implémentation de référence. Je trouve que c’est intéressant, et démystifie un peu les boîtes noires que peuvent être ce genre d’implémentation. Mais je pense aussi que ça pourrait gagner en pédagogie en expliquant typiquement pourquoi la première implémentation naïve n’est pas suffisante : en voyant les chiffres on pourrait se dire que quelques dizaines de millisecondes ça reste quand même assez rapide. Peut-être qu’une analyse de complexité avec des ordres de grandeur pour montrer que ce n’est pas suffisant si on veut appliquer des filtres sur une vidéo en temps réel ou je ne sais quelle autre application pourrait-être assez efficace.</p>
<p>Autre point, même en connaissant déjà l’idée sous-jacente, j’avoue avoir eu un peu de mal à lire les schémas qui motivent l’utilisation de la permutation inverse de bits. Je sais que c’est toujours plus facile à critiquer qu’à faire les schémas efficaces, mais ça vaudrait peut-être le coup aussi de soit l’alléger / le décomposer, soit détailler un peu plus la légende (peut-être en donnant un exemple de lecture des différents éléments ?).</p>
<p>Petit détails plus formels : </p>
<ul>
<li>il manque un chapeau au moment du calcul de <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>f</mi><mo>^</mo></mover><mo stretchy="false">[</mo><mi>n</mi><mo>+</mo><mi>N</mi><mi mathvariant="normal">/</mi><mn>2</mn><mo stretchy="false">]</mo><mtext></mtext></mrow><annotation encoding="application/x-tex">\hat{f}[n+N/2]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2078799999999998em;vertical-align:-0.25em;"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9578799999999998em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.26344em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.08332999999999999em;"><span class="mord">^</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord">/</span><span class="mord">2</span><span class="mclose">]</span><span class="mord"></span></span></span></span></span> pour trouver la formule de la "première FFT"</li>
<li>je trouve (mais c’est très personnel et absolument discutable) la notation des parties réelles et imaginaires avec des caractères gothiques un peu lourde visuellement, surtout dans des séquences un peu longues de calcul où ils interviennent à pas mal de reprises (Section "Calcul en place" pour le cas d’un signal réel notamment), j’ai l’impression que <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Re</mtext><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">[</mo><mi>k</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{Re}(x_i[k])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Re</span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mclose">]</span><span class="mclose">)</span></span></span></span></span> se lit plus facilement que <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="fraktur">R</mi><mrow><mo fence="true">{</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">[</mo><mi>k</mi><mo stretchy="false">]</mo><mo fence="true">}</mo></mrow></mrow><annotation encoding="application/x-tex">\mathfrak{R}\left\{x_i[k]\right\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathfrak">R</span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">{</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mclose">]</span><span class="mclose delimcenter" style="top:0em;">}</span></span></span></span></span></span></li>
</ul>
<p>Voilà, c’était en vrac quelques idées comme ça. Au delà de ça, c’était intéressant, même si je connaissais déjà une partie du contenu, j’ai quand même appris des choses, notamment sur les astuces d’implémentation et d’évaluation des fonctions trigonométriques sur des suites arithmétiques. Je suis même assez impressionné que l’implémentation en Julia arrive au niveau d’une implémentation de référence de FFTW. Tu as une idée des raisons qui font que ton implémentation arrive à être meilleure sur certaines entrées d’ailleurs ? Je suis assez curieux… <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"></p>Jouons à implémenter une transformée de Fourier rapide !, message #2345412021-05-25T00:04:17+02:00klafyvel/@klafyvelhttps://zestedesavoir.com/forums/sujet/15373/jouons-a-implementer-une-transformee-de-fourier-rapide/?page=1#p234541<p>Tout le monde se secoue ! <img src="/static/smileys/svg/heureux.svg" alt=":D" class="smiley"></p>
<p>J’ai commencé (dimanche 23 mai 2021 à 14h53) la rédaction d’un tutoriel au doux nom
de « Jouons à implémenter une transformée de Fourier rapide ! » et j’ai pour objectif de proposer en validation
un texte aux petits oignons. Je fais donc appel à votre bonté sans
limites pour dénicher le moindre pépin, que ce soit à propos
du fond ou de la forme. Vous pourrez consulter la bêta à votre guise à
l’adresse suivante :</p>
<div class="align-center"><p> <a href="https://zestedesavoir.com/contenus/beta/3939/jouons-a-implementer-une-transformee-de-fourier-rapide/">À présent, c’est à vous !</a> </p></div>
<p>Merci !</p>
<p>Hello, pour un projet sur mon temps libre (que je présenterais peut-être plus tard) j’ai eu besoin d’implémenter une FFT efficace. Après quelques semaines à potasser <em>Numerical Recipes</em>, je me suis dit que ce serait sympa d’écrire un petit contenu qui résume ce que j’ai pu (ré)apprendre. J’espère que le format de mini-tuto est adapté, mais je peux changer au besoin.</p>
<p>La totalité du fond est présente, mais j’ai des doutes sur la forme : je ne suis pas très expérimenté en terme de vulgarisation, et en plus je me suis lancé le défi d’écrire tout ça ce week-end. Il y a donc probablement beaucoup à redire ! Mais j’ai très envie d’apprendre à vulgariser correctement, et j’attends donc avec impatience vos retours. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Telecom, message #1996592019-02-27T21:19:13+01:00Drakop/@Drakophttps://zestedesavoir.com/forums/sujet/12157/telecom/?page=1#p199659<p>Merci beaucoup pour ton aide ! </p>Telecom, message #1995982019-02-27T00:10:25+01:00Renault/@Renaulthttps://zestedesavoir.com/forums/sujet/12157/telecom/?page=1#p199598<blockquote>
<p>-Pour moi transmission 5Ghz -> Fréquence porteuse.</p>
</blockquote>
<p>C’est correct.</p>
<blockquote>
<p>-Transmission simultanée de cos(2pif0t) et sin(2pif0t) -> aucune idée la pour le coup.</p>
</blockquote>
<p>Les fonctions cosinus et sinus sont identiques avec un déphasage de pi/2. Donc pour une fréquence donnée, grâce au déphasage entre les deux signaux qui est identique tout le long de la transmission, tu peux émettre et reconstituer parfaitement les deux signaux.</p>
<p>Cela ne poserait un problème qu’en cas d’opposition de phase, où le signal résultant serait nul et donc non interprétable.</p>
<blockquote>
<p>-3 choses qui change lorsque j’augmente la bande passante -> le "canal" / place disponible, ?, ?</p>
</blockquote>
<p>Ton système prendra en effet plus de place dans le spectre radio, laissant moins la possibilité de communiquer aux autres via une autre fréquence. Cela peut augmenter de fait les interférences avec les usages voisins si cela réduit la marge entre les deux usages.</p>
<p>Ton système sera aussi plus sensible au bruit et plus complexe, car analyser un spectre large est plus complexe qu’un spectre étroit.</p>
<p>Dans le cas des télécoms, cela permet d’augmenter le nombre d’usagers. Par exemple une cellule téléphonique, si un téléphone a besoin pour communiquer de 4 kHz de largeur de spectre pour son usage propre (nombre non réaliste), ta cellule pourra avoir 100 téléphones en simultanée avec 400 kHz de bande passante. Mais 10 seulement avec 40 kHz. Tu vois le principe ?</p>
<p>Suivant la même logique, tu augmentes les débits par utilisateur si tu as une plus grande bande passante, car tu peux exploiter plus de spectre pour échanger des données.</p>
<blockquote>
<p>-3 choses qui change lorsque j’augmente la fréquence -> le débit, ?, ?</p>
</blockquote>
<p>Tu augmentes effectivement le débit disponible. Mais tu diminues aussi la portée de ton signal. Une haute fréquence se transmet moins bien dans l’atmosphère et traverse moins bien les obstacles comme les murs. C’est pourquoi les antennes téléphoniques ont des fréquences allant de 800 MHz à 5 GHz suivant le protocole, pour permettre une variété telle qu’on choisit la fréquence adaptée au besoin local. En ville on peut privilégier un mix à haute fréquence pour le débit avec du basse fréquence pour améliorer la portée dans les bâtiments.</p>Telecom, message #1995862019-02-26T19:42:30+01:00Drakop/@Drakophttps://zestedesavoir.com/forums/sujet/12157/telecom/?page=1#p199586<p>Bonjour merci pour votre message !</p>
<p>En fait c’est un exercice (ou j’ai raté) que j’ai eu lors d’un examen (On a eu 2 jours de cours et 1 exam à la fin de la semaine) et j’aurai voulu savoir ou j’ai fait des erreurs.</p>
<p>-Pour la première question j’aurai dit que la bande passante augmente mais je ne sais pas vraiment comment justifier cela.</p>
<p>-Pour moi transmission 5Ghz -> Fréquence porteuse.</p>
<p>-Transmission simultanée de cos(2pif0t) et sin(2pif0t) -> aucune idée la pour le coup.</p>
<p>-3 choses qui change lorsque j’augmente la bande passante -> le "canal" / place disponible, ?, ?</p>
<p>-3 choses qui change lorsque j’augmente la fréquence -> le débit, ?, ?</p>Telecom, message #1995802019-02-26T16:38:06+01:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/12157/telecom/?page=1#p199580<p>Bonjour,</p>
<p>J’imagine que tu ne nous demande pas de faire ton exercice à ta place, et donc que tu as déjà réfléchi au problème.</p>
<p>Qu’est-ce que tu n’as pas compris dans ces questions ? Où en es-tu de tes réflexions ? Quels points précis te posent problème et pourquoi ?</p>