Le rééchantillonnage un échantillon sonore, ce filtre dois-je utiliser?
Je suis en train de ré-échantillonner un signal sonore (exemple) à partir d'un taux d'échantillonnage, à un taux d'échantillonnage plus élevé.
Malheureusement, elle 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 j'ai trouvé:
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 semblable à l'original, mais il a une sorte de bruit.
Pouvez-vous s'il vous plaît dites-moi ce filtre j'ai besoin de l'ajouter, et, de préférence, un peu de code liées à ce filtre?
Son Original: http://www.mediafire.com/?9gnga1in52d6t4x
Re-son: http://www.mediafire.com/?x34h7ggk8n9k8z1
Commencer avec une simple interpolation linéaire: au lieu de définir
cbuf[z]
à sampdata[i]
, il sampdata[i] + (j/(double)a)(sampdata[i+1] - sampdata[i])
. Je ne sais pas assez sur son traitement pour savoir si c'est encore loin d'être suffisant, mais il va vous tenir occupé jusqu'à ce que quelqu'un qui connaît leurs trucs 🙂 Vous pouvez aussi avoir besoin d'anti-alias le sous-échantillonner.OriginalL'auteur X-N2O | 2010-12-08
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser une interpolation linéaire à moins que les deux taux d'échantillonnage (source et destination) sont bien au-dessus de la fréquence la plus élevée dans vos données. C'est une très mauvaise filtre passe-bas.
Ce que vous voulez est une interpolation filtre passe-bas avec une bande de départ en-dessous de la moitié de la plus faible des deux taux d'échantillonnage que vous travaillez avec. Les mêmes méthodes de mise en œuvre de ce sont de suréchantillonnage/sous-échantillonnage à l'aide de filtres IIR, et à l'aide de poly-phase des filtres FIR. Une fenêtre Sinc interpolateur fonctionne également bien pour cela que si vous n'avez pas besoin de performances en temps réel, et vous ne voulez pas de suréchantillonner/sous-échantillonner. Voici un Fenêtré interpolation Sinc filtre passe-bas de Base, qui doit être facile à convertir en C.
Si vous souhaitez utiliser le filtrage IIR, voici les canonique Livre de recettes pour les biquadratique filtres IIR.
Si vous voulez la meilleure explication de l'audio rééchantillonnage de la théorie, voici CCRMA de Stanford de Rééchantillonnage page.
C'est seulement compliqué si vous souhaitez que les résultats de son est de bonne qualité. 🙂
OriginalL'auteur hotpaw2
Avez-vous envisagé d'utiliser une bibliothèque spécialisée pour cela, comme que libsamplerate?
Il est tout à fait portable et il est développé par des gens qui savent faire des choses comme ça correctement. Même si vous ne l'utilisez pas directement, vous pouvez trouver les algorithmes qu'il met en œuvre tout à fait intéressant.
sox file1 -r [newsamplerate] file2
OriginalL'auteur thkala
Quelques commentaires, bien que je ne fais que deviner à votre intention réelle:
cbuf[]
serait à 441MHz qui est un peu élevé pour la plupart d'analyse audio. En supposant que vous voulezcbuf[]
être à 44100Hz, alors vous avez seulement besoin de créer44100/OrigSampleRate
d'échantillons danscbuf[]
par exemple danssampdata[]
.z
deux fois dans le haut-échantillonnage de la boucle. Il en résulte dans tous les impair d'éléments decbuf[]
avoir leurs valeurs d'origine. Je crois que cela en fin de compte les résultats de la finalebuf[]
non valides impair d'éléments qui peuvent être à la source du bruit. Il y a aussi un risque de débordement de la mémoire tampon dans cbuf si vous n'avez pas le créer avec au moins deux fois le nombre d'éléments.OriginalL'auteur uesp
Meilleur rééchantillonnage code que j'ai jamais rencontré: http://shibatch.sourceforge.net/
Prendre la source, et essayer d'apprendre quelque chose d'elle. Il est en mauvaise condition, mais les résultats de cette resampler sont loin au-dessus de tout le reste.
OriginalL'auteur Daniel Mošmondor
Utiliser FFMpeg et avcodec directement. Voici un bon exemple montrant comment le faire:
http://tdistler.com/projects/audio-resampling-with-ffmpeg
OriginalL'auteur jhakeem
Avant de ré-échantillonner à une fréquence d'échantillonnage, vous DEVEZ filtre passe-bas de l'original de moins de 1/2 fois le taux d'échantillonnage ou de se présenter alizing artefacts. Le spectre va se replier sur lui-même pour des fréquences plus de la 1/2 de la fréquence d'échantillonnage. Donc, si vous voulez ré-échantillonner à 11025 de 44100 vous devez filtrer les 44100 lowpassa à 1/2 de 11025 ou 5500 Hz depuis fidélité de reproduction diminue avec de faibles bandes passantes de son mieux pour le faire avec max l'amplitude de -10Db de l'amplitude. Pour signés de 16 bits de la valeur, c'est comme 10^(-10/20)*2^(16-1) ou 10362 +/- pour le maximum d'amplitude. Les algorithmes exacts peuvent être trouvés en ligne car il devrait y avoir pas de droits de propriété intellectuelle pour ces vieilles idées de base. Après avoir fait tous les calculs sans arrondi virgule flottante double précision, alors vous arrondir les résultats à leurs valeurs entières et d'interpoler sur l'échelle de temps exactement où l'un intercepte les autres. Il nécessite de l'imagination et de la mémoire et de l'expérience que puis vous met dans le domaine du mathématicien physique programmeur. :-O 🙂
OriginalL'auteur geoff