Question

Je suis en train de ré-échantillonner un signal (sonore) d'une fréquence d'échantillonnage, à un taux d'échantillonnage plus élevé. Malheureusement, il a besoin d'une sorte de filtre, comme certains « aliasing » semble se produire, et je ne suis pas familier avec les filtres. Voici ce que je suis venu avec:

int i, j, a, b, z;

a = 44100;
b = 8363;

// upsample by a
for(i = z = 0; i < samplen; i++)
    for(j = 0; j < a; j++)
        cbuf[z++] = sampdata[i];

// some filter goes here???

// downsample by b
for(j = i = 0; i < z; i += b)
    buf[j++] = cbuf[i];

Le nouvel échantillon est très similaire à l'original, mais il a une sorte de bruit. Pouvez-vous s'il vous plaît me dire ce filtre que je dois ajouter, et de préférence un code lié à ce filtre?

Son original: http://www.mediafire.com/?9gnga1in52d6t4x son réchantillonné: http://www.mediafire.com/?x34h7ggk8n9k8z1

Était-ce utile?

La solution

Ne pas utiliser une interpolation linéaire à moins que les deux fréquences d'échantillonnage (source et destination) sont bien au-dessus de la plus haute fréquence dans vos données. Il est un très mauvais filtre passe-bas.

Qu'est-ce que vous voulez est un interpoler filtre passe-bas avec une bande d'arrêt commençant en dessous de la moitié de la plus faible des deux taux d'échantillonnage que vous traitez. Les méthodes courantes de mettre en œuvre ce sont suréchantillonnage / sous-échantillonnage en utilisant des filtres RII, et en utilisant des filtres FIR en phase poly. Un interpolateur sinc fonctionne aussi bien fenêtré pour cela si vous n'avez pas besoin de performances en temps réel, et ne veulent pas upsample / Downsample. Voici un fenêtré sinc interpoler filtre passe-bas dans base , qui devrait être trivial convertir en C.

Si vous voulez utiliser le filtrage IIR, voici canonique livre de recettes pour les filtres biquad IIR .

Si vous voulez la meilleure explication de la théorie de ré-échantillonnage audio, voici la page rééchantillonnage Stanford CCRMA .

Autres conseils

Avez-vous pensé à utiliser une bibliothèque spécialisée pour cela, tels que libsamplerate ?

Il est tout à fait portable et il est développé par des gens qui savent comment faire des choses comme ça correctement. Même si vous ne l'utilisez pas directement, vous trouverez peut-être les algorithmes qu'elle met en œuvre tout à fait intéressant.

Quelques commentaires, bien que je ne devine à votre intention réelle:

  • Vous-échantillonnage à un taux 44100 fois le taux d'échantillonnage d'origine. Par exemple, si votre entrée est à 10kHz votre cbuf[] intermédiaire serait à 441MHz qui est un peu haute pour la plupart des analyses audio. En supposant que vous voulez cbuf[] être à 44100Hz alors vous suffit de créer 44100/OrigSampleRate d'échantillons dans cbuf[] par échantillon dans sampdata[].
  • Vous incrémente z deux fois dans la boucle jusqu'à l'échantillonnage. Il en résulte dans tous les éléments impairs de cbuf[] d'avoir leurs valeurs d'origine. Je crois que cela se traduit en fin de compte dans le buf[] final ayant des éléments impairs non valides qui peuvent être la source de votre bruit. Il y a aussi un dépassement de mémoire tampon potentiel CBUF si vous n'avez pas créé avec au moins deux fois le nombre requis d'éléments.
  • Comme mentionné par Steve une interpolation linéaire est généralement le plus simple qui crée un bon résultat lors de la mise échantillonnage. Plus compliqué sur-échantillonnage peut être fait si on le souhaite (polynômes, splines, etc ...). De même, lorsque sous-échantillonnage, vous voudrez peut-être des échantillons moyens au lieu de simplement tronquer.

Le meilleur code rééchantillonnage je jamais rencontré: http://shibatch.sourceforge.net/

Prenez la source, et essayer d'apprendre quelque chose. Il est dans un état désagréable, mais les résultats de cette resampler sont bien au-dessus tout le reste.

Utilisez FFMPEG et avcodec directement. Voici un bon exemple montrant comment faire ceci:

http://tdistler.com/projects/audio-resampling-with-ffmpeg

Avant de rééchantillonnez à un taux d'échantillonnage plus bas, vous devez filtre passe-bas l'original moins de 1/2 fois la vitesse d'échantillonnage ou vous présenter des artefacts alizing. Le spectre se replier sur elle-même pour des fréquences de plus de 1/2 de la fréquence d'échantillonnage. Donc, si vous voulez Rééchantillonne 11025 de 44100 vous devez filtrer le 44100 lowpassa à 1/2 de 11025 ou 5500 Hz puisque la fidélité de la reproduction diminue avec des bandes passantes plus faibles de son mieux pour le faire avec une amplitude maximum comme 10db d'amplitude. Pour 16 bits signés la valeur est comme 10 ^ (- 10/20) * 2 ^ (16-1) ou 10362 +/- pour amplitude max. Les algorithmes exacts peuvent être trouvés en ligne car il devrait y avoir aucun droit intellectuel pour ces anciens et des idées de base. Après avoir fait tous les calculs sans doubles virgule flottante de précision arrondi vous autour des résultats à leurs valeurs entières appropriées et interpoler sur l'échelle de temps exactement où celui défini INTERCEPTIONS l'autre. Elle exige une imagination et de la mémoire et de l'expérience précédente qui vous met alors tout à fait dans le domaine du programmeur de la physique mathématique. : -O: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top