7
votes

Réduire les harmoniques générant une tonalité pure en Java

J'essaie de développer une méthode statique en Java pour générer une tonalité pure.

Dans le début, il semblait facile, mais quand j'ai essayé d'écrire le double tableau vers les haut-parleurs que j'apprécie trop de harmoniques.

Je le teste avec un analyseur de spectre (Sonomètre), puis j'ai également dessiné dans un graphique la matrice résultante. Quand je l'ai fait, j'ai vu le problème:

Il s'agit de la forme de vague, elle est abrupte. Je veux lisser ce tableau, mais je ne sais pas comment le faire.

Ceci est le code: xxx


1 commentaires

Cela ne ressemble pas à un problème de programmation Java; Je ne vois rien de mal avec le code Java. Il faut probablement répondre aux personnes plus familiarisées avec la génération de son. Peut-être que la "forme d'onde" et les étiquettes "sonore-synthèse" seraient plus utiles, bien qu'il n'y ait qu'une poignée de suiveurs.


4 Réponses :


1
votes

Vous devez calculer l'angle et le sinus pour chaque valeur de 'BufferLength', pas de chaque deuxième valeur. Ce que vous faites est essentiellement sous-échantillonnage avec l'interpolation. Je ne vois aucune "symétrie" à ce sujet.


1 commentaires

Peut-être est aussi simple que ceci: pour (int i = 0; i



0
votes

Je ne suis pas vraiment sûr, mais je pense que je suis confus à propos de @ejp parlait de: j'avais besoin d'obtenir chaque valeur étape par étape. Symétrie C'était une méthode rapide mais pire sur la qualité du signal.

Ceci est le nouveau code: xxx


3 commentaires

Cette mise en œuvre est correcte, mais, d'autre part, je vois le gros problème à ce sujet. Les harmoniques que j'obtiens sont plus liées sur la phase de forme d'onde. Il est tout à fait nécessaire à l'aide de fréquences centrales divisibles par samplate pour le premier échantillon dans un tampon était le prochain exemple de dernier échantillon dans le tampon précédent. Je pense que c'est plus ou moins une explication compréhensible, n'est-ce pas?


Finalement, je l'ai trouvé! F0 doit être un multiple de (fs / tampersize). À propos, F0 ne sera pas un entier plutôt un double ou presque meilleur un flotteur pour gagner un peu de vitesse.


F0 doit seulement être un double. Si ce serait un flotteur, nous perdons parfois des informations.



3
votes

Écrire la même valeur à deux emplacements consécutifs introduit une étape dans la forme d'onde. Toute déviation d'une courbe sine lisse ajoute des harmoniques. Si vous voulez une tonalité pure, ne faites pas cela. Si vous voulez faire cela, ne vous attendez pas à une tonalité pure.


0 commentaires

0
votes

Ceci est le code définitif: xxx

un principal () pour le tester: xxx


0 commentaires