Question

Ceci est mon "week-end". problème de passe-temps.

J'ai des formes d'onde à cycle unique très appréciées dans les mémoires ROM d'un synthétiseur classique.

Ce sont des échantillons de 8 bits (256 valeurs possibles).

Parce qu'ils ne sont que 8 bits, le bruit de fond est assez élevé. Ceci est dû à une erreur de quantification. L'erreur de quantification est assez étrange. Cela dérange un peu toutes les fréquences.

Je voudrais prendre ces cycles et faire "propre" Versions 16 bits d'entre eux. (Oui, je sais que les gens adorent les versions sales. Je vais donc permettre à l’utilisateur d’interpoler entre sale et propre, quel que soit le degré de leur choix.)

Cela semble impossible, non, parce que j'ai perdu les 8 bits les plus bas pour toujours, non? Mais cela me trotte dans la tête depuis un moment et je suis sûr de pouvoir le faire.

N'oubliez pas qu'il s'agit de formes d'onde à cycle unique qui sont répétées à maintes reprises pour la lecture. Il s'agit donc d'un cas particulier. (Bien sûr, le synthé fait toutes sortes de choses pour rendre le son intéressant, y compris les enveloppes, les modulations, les filtres de fondu enchaîné, etc.)

Pour chaque échantillon d’octets, je sais vraiment que c’est l’une des 256 valeurs de la version 16 bits. (Imaginez le processus inverse, où la valeur de 16 bits est tronquée ou arrondie à 8 bits.)

Ma fonction d'évaluation tente d'obtenir le niveau de bruit minimal. Je devrais pouvoir en juger avec une ou plusieurs FFT.

Des tests exhaustifs prendraient probablement une éternité, je pourrais donc effectuer un premier passage à basse résolution. Ou dois-je simplement pousser de manière aléatoire des valeurs choisies de manière aléatoire (dans les valeurs connues qui conserveraient la même version 8 bits) et effectuer l'évaluation et conserver la version la plus propre? Ou y a-t-il quelque chose de plus rapide que je puisse faire? Est-ce que je risque de tomber dans les minimums locaux alors qu'il pourrait y avoir de meilleurs minimums ailleurs dans l'espace de recherche? Cela m'est arrivé dans d'autres situations similaires.

Y a-t-il des suppositions initiales que je peux faire, peut-être en regardant les valeurs voisines?

Modifier: Plusieurs personnes ont souligné le fait que le problème est plus facile si je supprime l'exigence selon laquelle la nouvelle forme d'onde échantillonnerait à l'original. C'est vrai. En fait, si je ne cherche que des sons plus nets, la solution est simple.

Était-ce utile?

La solution

En suivant l'approche de votre question, je suggérerais d'examiner les algorithmes d'escalade, etc.

http://en.wikipedia.org/wiki/Hill_climbing contient plus d’informations et la boîte latérale contient des liens vers d’autres algorithmes plus appropriés.

L’intelligence artificielle est comme une alchimie - nous n’avons jamais atteint le but final, mais beaucoup de bonnes choses sont sorties en cours de route.

Autres conseils

Vous pouvez insérer votre échantillon 8 bits existant dans l'octet de poids fort de votre nouvel échantillon 16 bits, puis utiliser l'octet de poids faible pour interpoler linéaire : nouveaux points de données 16 bits entre chaque échantillon original de 8 bits.

Ceci relierait essentiellement une ligne droite 16 bits entre chacun de vos échantillons 8 bits d'origine, en utilisant plusieurs nouveaux échantillons. Cela semblerait beaucoup plus silencieux que ce que vous avez maintenant, à savoir un saut soudain de 8 bits entre les deux échantillons originaux.

Vous pouvez également essayer d'appliquer un filtrage passe-bas . a>.

Eh bien, je m'attendrais à un filtrage du FIR (IIR si vous avez vraiment besoin de cycles de traitement, mais le FIR peut donner de meilleurs résultats sans instabilité) pour éliminer le bruit. Vous devrez jouer avec pour obtenir l’effet souhaité, mais le problème fondamental est de lisser les contours nets de l’audio créé en l’échantillonnant à une résolution de 8 bits. Je donnerais une large naissance à la fréquence centrale de l'audio et ferais un filtre passe-bas, puis j'écouterais pour m'assurer que je ne le sonnais pas comme "plat". avec le filtre que j'ai choisi.

Mais c’est difficile, vous ne pouvez faire que beaucoup, les 8 bits inférieurs sont perdus, le mieux que vous puissiez faire est de les approcher.

Il est presque impossible de supprimer le bruit qui ressemble à votre signal. Si vous commencez à tweking dans votre bande de fréquences, cela supprimera le signal qui vous intéresse.

Pour le suréchantillonnage, comme vous utilisez déjà une FFT, vous pouvez ajouter des zéros à la fin du signal du domaine fréquentiel et effectuer une FFT inverse. Cela préserve complètement les informations de fréquence et de phase du signal d'origine, bien qu'il diffuse la même énergie sur plusieurs échantillons. Si vous modifiez les échantillons à 8 bits en 8 bits, cela ne posera pas trop de problème. Mais je le fais habituellement avec un facteur de gain entier avant de faire la transformation.

Pete

Modifier: Les commentaires sont un peu longs, je vais donc en parler.

Les pics de la sortie FFT sont des pics harmoniques causés par la quantification. J'ai tendance à penser à eux différemment du bruit de fond. Comme vous l'avez dit, vous pouvez utiliser le dither pour éliminer l'amplitude des pics harmoniques et aplanir le bruit de fond, mais vous perdez tout signal sur le bruit sur la partie plate de votre bruit de fond. En ce qui concerne la FFT. Lorsque vous interpolez en utilisant cette méthode, elle conserve la même énergie et se propage sur un plus grand nombre d'échantillons, ce qui réduit l'amplitude. Donc, avant de faire l'inverse, donnez plus d'énergie à votre signal en le multipliant par un facteur de gain.

Les signaux sont-ils simples / complexes, ou ont-ils des bords durs? c'est-à-dire un triangle, des ondes carrées, etc. Je suppose qu'ils ont une continuité d'un cycle à l'autre, est-ce valable? Si tel est le cas, vous pouvez également augmenter la résolution de votre FFT pour localiser plus précisément les fréquences en augmentant le nombre de cycles de signaux transmis à votre FFT. Si vous pouvez identifier précisément les fréquences utilisées, en supposant qu’elles soient quelque peu discrètes, vous pourrez peut-être recréer complètement le signal souhaité.

L'exigence de troncature 16 bits à 8 bits produira des résultats qui ne correspondent pas à la source d'origine. (Cela rend donc plus difficile la recherche d'une réponse optimale.) Généralement, vous produisez une forme d'onde à point fixe en essayant "d'obtenir la correspondance la plus proche". cela signifie arrondir au nombre le plus proche (la jonction est une opération au sol). C'est très probablement comment ils ont été générés à l'origine. Ajouter 0.5 (dans ce cas 0.5 = 128) et ensuite répartir la sortie vous permettrait de générer des résultats plus précis. Si cela ne vous inquiète pas, alors d'accord, mais cela aura certainement un effet négatif sur la précision.

MISE À JOUR: Pourquoi? Parce que l'objectif d'échantillonnage d'un signal est de pouvoir reproduire le plus possible le signal. Si le seuil de conversion est mal défini sur l'échantillonnage, toute votre erreur est d'un côté du signal et n'est pas bien répartie et centrée sur zéro. Sur ces systèmes, vous essayez généralement de maximiser l’utilisation de la plage dynamique disponible, en particulier si vous avez une résolution faible, telle qu’un convertisseur ADC 8 bits.

Band versions limitées? S'ils sont filtrés à des fréquences différentes, je suppose que c'était pour vous permettre de jouer le même son sans distorsions lorsque vous sortiez trop loin de l'autre variation. Un peu comme le mappage dans les graphiques. Je soupçonne que les deux signaux sont identiques et que différents filtres de repliement sont appliqués, ce qui peut être utile pour reproduire l’original. Ils doivent constituer le même signal de base avec différentes convolutions appliquées.

Il peut exister une approche simple prenant avantage de la périodicité des formes d’ondes. Et si vous:

  1. Créez une forme d'onde de 16 bits où les octets de poids fort sont la forme d'onde et les octets de poids faible sont nuls - appelez-le x [n].

  2. Calculez la transformée de Fourier discrète de x [n] = X [w].

  3. Faire un signal Y [w] = (dBMag (X [w]) > Seuil)? X [w]: 0, où dBMag (k) = 10 * log10 (réel (k) ^ 2 + imag (k) ^ 2) et Threshold est peut-être de 40 dB, sur la base de 8 bits représentant une plage dynamique d'environ 48 dB, et autorisant environ 1,5 bits de bruit.

  4. Transformez Y [w] pour obtenir y [n], votre nouvelle forme d'onde 16 bits.

  5. Si y [n] ne sonne pas bien, dites-le avec un bruit de niveau très faible.

Notes:

A. Cette technique ne fonctionne que dans les formes d'onde d'origine qui sont exactement périodiques!

B. L’étape 5 peut être remplacée par la définition du paramètre "0". valeurs aléatoires dans Y [w] à l’étape 3, vous devez expérimenter un peu pour voir ce qui fonctionne le mieux.

Cela semble plus facile (du moins pour moi) qu’une approche d’optimisation. Mais y [n] tronqué ne sera probablement pas égal à vos formes d'onde originales. Je ne suis pas sûr de l'importance de cette contrainte. Je pense que cette approche générera des formes d’onde qui sonneront bien.

scroll top