Convertir une onde sinusoïdale en onde triangulaire

la programmation


Pour des raisons, je ne peux pas simplement générer une onde triangulaire de la fréquence dont j’ai besoin, mais j’ai une onde sinusoïdale et une onde carrée à cette fréquence.

Je ne peux pas conserver d’état supplémentaire.

J’ai besoin d’un algorithme pour calculer une onde triangulaire à partir d’une onde sinusoïdale ou d’une onde carrée

Onde triangulaire — HandWiki[^]

Cela contient des formalismes mathématiques, mais je ne comprends pas les formalismes mathématiques.

J’espérais que quelqu’un pourrait appliquer les concepts pertinents contenus dans ce document à du code. Peu importe la langue, du moment qu’elle est portable vers autre chose.

Ce que j’ai essayé :

J’ai essayé de générer l’onde triangulaire par elle-même, mais je dois la générer par morceaux à la fois et garder la phase continue entre les morceaux afin de ne pas obtenir de clics. J’ai une onde sinusoïdale qui suit en utilisant un nombre entier toujours croissant multiplié par une valeur delta basée sur la fréquence, mais ce n’est pas un mouvement de haut en bas – c’est plus comme une dent de scie si j’y applique un modulo, mais encore une fois, J’ai besoin du triangle.

Solution 2

Si vous avez une onde carrée dont vous connaissez l’amplitude et la période, ne pouvez-vous pas simplement créer l’onde triangulaire à partir de celle-ci en utilisant une géométrie simple ?
Onde triangulaire — HandWiki[^]

Si le point de départ de la montée du TW est synchronisé avec la montée du SW, alors tout ce que vous faites est de tracer la diagonale de BL à TR, puis de TL à BR, ce qui est trivial et devrait être rapide et efficace en termes d’espace.

Si la synchronisation est “étape par étape” selon le diagramme dans le lien, alors ce n’est qu’un point de départ de décalage que vous devez prendre en compte – encore une fois une géométrie simple.

Solution 1

De Wikipédia :

Il est possible d’approcher une onde triangulaire avec synthèse additive en additionnant les harmoniques impaires de la fondamentale tout en multipliant une harmonique impaire sur deux par −1 (ou, de manière équivalente, en changeant sa phase par π) et en multipliant l’amplitude des harmoniques par un sur le carré. de leur numéro de mode, n (ce qui équivaut à un sur le carré de leur fréquence relative par rapport au fondamental).

C’est un algorithme simple, et l’article indique qu’il converge assez rapidement vers une onde triangulaire. (MODIFIER: La fondamentale est l’onde sinusoïdale, mais vous le savez probablement.)

Solution 4

J’opterais probablement pour une approche basée sur une table.
Stocker simplement les valeurs de la fonction souhaitée sur le domaine d’intérêt.
Cela donne généralement l’exécution la plus rapide sans aucun problème de timing, au détriment d’un certain espace de stockage.

コメント

タイトルとURLをコピーしました