2017-08-01 2 views
0

J'ai écrit un normalisateur de fichier wave rapide en C# en utilisant naudio.Normalizer rapide pour les fichiers wav ne fonctionne pas comme prévu

Actuellement, il verrouille le thread et crée des fichiers de 1 Ko. sm est le plus haut sommet du fichier

using (WaveFileReader reader = new WaveFileReader(aktuellerPfad)) 
{ 
    using (WaveFileWriter writer = new WaveFileWriter("temp.wav", reader.WaveFormat)) 
    { 
     byte[] bytesBuffer = new byte[reader.Length]; 
     int read = reader.Read(bytesBuffer, 0, bytesBuffer.Length); 
     writer.WriteSample(read *32768/sm); 
    } 
} 
+1

Quelle est la question? Qu'est-ce qui ne fonctionne pas comme prévu? –

+0

Vous essayez d'écrire la valeur de sortie int read (qui est une valeur scalaire représentant le nombre d'échantillons lus) au lieu du buffer d'octets. Je pense que la solution de @ErAcube est ce dont vous avez besoin. – Alicia

Répondre

3

Vous devez faire opération mathématique dans un tampon audio pour normaliser le signal. Les étapes de normalisation seraient:

a. Lire le tampon audio pendant que vous faites. (Bien que, je préférerais lire en morceaux).

byte[] bytesBuffer = new byte[reader.Length]; 
    reader.Read(bytesBuffer, 0, bytesBuffer.Length); 

b. Calculer la valeur du multiplicateur. Il existe différentes façons de calculer la valeur. Je ne sais pas comment vous calculez mais il semble que la valeur est 32768/sm. Je qualifierais de multiplicateur de "mul".

c. Maintenant parcourez le tampon et multipliez la valeur avec le multiplicateur.

for (int i = 0; i < bytesBuffer.Length; i++) 
    { 
     bytesBuffer[i] = bytesBuffer[i] * mul; 
    } 

d. Enfin, écrivez des échantillons dans un fichier.

writer.WriteSamples(bytesBuffer, 0, bytesBuffer.Length); 
+1

Je voudrais également vérifier que la valeur de 'sm' n'est pas 0 avant de l'utiliser pour diviser. – Alicia