2009-12-12 23 views
0

J'ai implémenté un algorithme de base Karplus-Strong.
Le tampon de remplissage, qui se remplit de bruit blanc, émet un échantillon à partir de l'avant et ajoute la moyenne des deux premiers éléments à la fin et supprime le premier élément. Répétez le dernier pour les étapes.Extension de Karplus-Strong avec filtre passe-bas

Pour de meilleurs résultats et le contrôle sur eux, j'ai essayé d'implémenter une version étendue de l'algorithme.
Par conséquent, au lieu d'un filtre de moyennage j'ai besoin d'un filtre de fréquence comme un filtre passe-bas.
Mon filtre moyenne a deux entrées et une sortie: avg (a, b) = (a + b)/2

L'exemple de code sur la page wikipedia donne autant de sorties que les entrées.
http://en.wikipedia.org/wiki/Low-pass_filter

I ont trouvé d'autres versions (mathématiques) comme:
http://cnx.org/content/m15490/latest/
H (z) = (1+ (1/z))/2
Je suppose que z est un nombre complexe.

Les deux versions ont deux entrées mais aussi deux sorties.
Comment puis-je obtenir une valeur significative?
Ou dois-je réécrire de plus grandes parties de l'algorithme?
Si c'est le cas, où puis-je trouver une bonne explication?

Répondre

2

Votre filtre est une spécialisation du filtre Finite Impulse Response. Vous utilisez le moving average method pour sélectionner les coefficients, en utilisant N = 1. Il s'agit déjà d'un filtre passe-bas.

Le calcul du coefficient et de l'ordre pour que le filtre l'adapte à une réponse en fréquence spécifique implique des calculs complexes. La meilleure chose à faire est d'utiliser un logiciel pour calculer les coefficients si la moyenne mobile ne correspond pas à votre facture. Matlab est le choix habituel, GNU Octave est une option open source.

+0

Merci pour la réponse. Je ne savais pas que j'utilise déjà un filtre passe-bas. Ensuite, j'ai besoin d'un plus avancé avec des paramètres. Merci pour les conseils pour calculer le coefficient et la commande. Je vais probablement utiliser cela dans le futur. Mais le problème actuel est l'implémentation d'un tel filtre. –

+0

L'implémentation est * très simple *: y = c0 * x [0] + c1 * x [1] ... Définir de bonnes valeurs pour c est la partie la plus difficile. –

+0

Oui, c'est simple. Explique aussi pourquoi la moyenne est un filtre passe-bas. (a + b)/2 => 0,5 * a + 0,5 * b. Question répondue et acceptée. Je suppose que la haute et la basse de la bande est également simple? Si oui, pourriez-vous également écrire ces algorithmes? –

0

Les filtres peuvent exprimé dans plusieurs façons:

  1. Sur la plaine complexe, votre exemple H (z) = (1+ (1/z))/2
  2. En tant que filtre, y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
  3. Dans le domaine des fréquences, Y [f] = H [f] * X [f]

la seconde de ces derniers est en fait une convolution des matrices H et x. C'est aussi le plus facile à comprendre.

La réponse précédente expliquait par où commencer la construction d'un filtre. En supposant que vous ayez vos coefficients de filtre, les h, il s'agit simplement de sommer les coefficients non négatifs.

Je crois que je vois ce que vous demandez. Bien que vous n'ayez pas besoin de plus d'une sortie. A partir de la page Wikipédia l'algorithme de synthèse de chaîne Karplus-Strong a besoin d'un tampon de longueur L. Si nous avons des coefficients de filtre M (h) qui donne une sortie de la forme,

y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

La synthèse Karplus-Strong de here utilise un tampon en anneau pour contenir les dernières sorties L, y[i-1],...,y[i-L].Ceci est initialisé pour être le x[i] valeurs de bruit pour i<=L; cependant, pour i>Lx[i]=0. L'algorithme sera efficace dans l'espace car vous ne stockez que les valeurs L. Le signal x[i] pour i>L vient d'être ajouté au tampon circulaire. Enfin, à titre d'avertissement, si vous ne faites pas attention au nombre de coefficients h et aux valeurs, les sorties y peuvent ne pas avoir le comportement souhaité.

+0

Je ne connais presque rien à ce sujet, alors peut-être que je l'ai mal implémenté. J'ai utilisé l'explication de: http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html (pas mes devoirs) et d'après cela le ringbuffer est utilisé comme délai et feedback. L'étape de mise à jour ne prend également que deux entrées. Et l'audio généré sonne comme une guitare. Si vous pensez toujours que toutes les valeurs de la mémoire tampon devraient être utilisées, pourriez-vous expliquer davantage? –

+0

Je travaillais d'un coup d'œil à l'article de la [page Wikipedia] [1]. Il a 'y [n] = x [n] + 0.5 * (y [nN] + y [n- (N + 1)])' plutôt que 'y [n] = x [n] + 0.5 * (y [n-1] + y [n-2]) 'c'est ce que j'ai supposé. Donc, vous semblez avoir raison sur la façon dont le tampon est construit. La page princeton ajoute également une diminution de 0,996 à la moyenne dans le tampon. Je ne vois aucune raison pour laquelle vous ne pouvez pas avoir plus que deux éléments filtrés ensemble. Mais votre kilométrage variera, donc vous devrez expérimenter, quant à ce qui sonne le mieux. [1] http://www.jstor.org/pss/3680063 –

+0

J'ai édité ma réponse pour corriger mon malentendu. –