L'analyse de wav et le dessin graphique
Je suis en train d'imprimer une onde à partir d'un fichier wav,
mais je suis un peu perdu sur la façon dont la longueur je dois le prendre pour un échantillon.
c'est ce que j'aimerais obtenir (sans les couleurs):
donc de la lecture dans mes données j'utilise le code suivant:
//first we need to read our wav file, so we can get our info:
byte[] wav = File.ReadAllBytes(filename);
//then we are going to get our file's info
info.NumChannnels = wav[22];
info.SampleRate = bytesToInt(wav[24], wav[25]);
//nr of samples is the length - the 44 bytes that where needed for the offset
int samples = (wav.Length - 44) / 2;
//if there are 2 channels, we need to devide the nr of sample in 2
if (info.NumChannnels == 2) samples /= 2;
//create the array
leftChannel = new List<float>();
if (info.NumChannnels == 2) rightChannel = new List<float>();
else rightChannel = null;
int pos = 44; //start of data chunk
for (int i = 0; i < samples; i++) {
leftChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
if (info.NumChannnels == 2) {
rightChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
}
}
BytesToFloat = Convertit 2 octets pour un flotteur entre -1 et 1
Alors maintenant, j'ai 2 listes de données, mais maintenant, comment puis-je combien de numéros que je dois prendre pour la création de 1er ligne?
ce qui me confond le plus:
lorsque vous jouez un morceau, vous pouvez le voir dans la plupart des lecteurs de musique les données suivantes, c'est à mes yeux la représentation de 1 ' échantillon.
mais comment savez-vous la valeur de chacune de ces barres, et la façon dont de nombreux bars il y a dans un échantillon
oui, mais la c'est pas le problème (je pense), j'ai ajouté un peu de texte pour expliquer un peu plus sur ce qui est déroutant moi
Je pense que vous êtes à la recherche d'un spectrogramme? il y a quelques fils sur ce qui pourra vous aider: stackoverflow.com/questions/8781556/spectrogram-and-what-it-is stackoverflow.com/questions/2133651/spectrogram-c-library etc...
Comme Gigasoft fondateur, nous avons une solution qui simplifie la création de graphiques audio wav de données et fournit un exemple de code pour jouer et graphique wav données comme adobe autdition ou nero wave editor. Voir notre petite 18meg v8 cartographie démo et à l'examen de la démo exemple 123. Le téléchargement inclut également WPF et MFC exe. La source pour la lecture, la création de graphiques, et de jouer wav ne pas répondre à toutes les bibliothèques dépendantes et est distillée à un minimum pour les lire.
OriginalL'auteur Kiwi | 2012-11-29
Vous devez vous connecter pour publier un commentaire.
Votre question est à propos de deux différentes visualisations de l'audio. Pour dessiner la forme d'onde, le code que vous avez posté est proche d'être prêt à tirer, mais vous ajoutez une seule participation par exemple à votre liste. Depuis audio est souvent 44100 échantillons par seconde, la forme d'onde pour une durée de 3 minutes de la chanson nécessiterait près de 8 millions de pixels à travers. Donc, ce que vous avez à faire est de lot. Pour tout dire 4410 pixels (c'est à dire 100ms), trouver celui avec la plus haute et la plus basse des valeurs, et ensuite l'utiliser pour tracer la ligne. en fait, vous pouvez généralement s'en tirer avec juste de trouver le max Abs valeur, et le dessin symétrique de la forme d'onde.
Voici un peu de code pour dessiner une base de la forme d'Onde d'un fichier audio dans WPF, à l'aide de NAudio pour un accès plus facile aux valeurs de l'échantillon (il peut faire des fichiers WAV ou MP3). Je n'ai pas compris toute la séparation des canaux gauche et droit, mais qui devrait être assez facile d'ajouter:
La deuxième visualisation est parfois appelé une spectogram ou un analyseur de spectre. Il ne représente pas 1 de l'échantillon, mais représente les fréquences présentes dans un bloc d'échantillons. Pour obtenir cette information dont vous avez besoin pour passer vos échantillons grâce à une transformée de Fourier Rapide (FFT). Habituellement, vous passer à travers les blocs de 1024 échantillons (elle doit être une puissance de 2). Unforunately Fft peut être difficile à utiliser si vous êtes nouveau à la DSP, il y a plusieurs choses que vous devez apprendre à faire:
Vous devriez être capable de trouver de plus amples renseignements sur chacun de ces sujets ici sur StackOverflow. J'ai écrit un peu sur la façon dont vous pouvez utiliser la FFT en C# dans cet article.
OriginalL'auteur Mark Heath