web-dev-qa-db-fra.com

Lecture et traitement des données des fichiers WAV en C / C ++

Je fais actuellement un projet d'école très très important. J'ai besoin d'extraire les informations d'un fichier WAVE en C/C++ et d'utiliser les informations pour obtenir le LPC d'un signal vocal. Mais, pour ce faire, je dois effectuer un prétraitement du signal, comme faire le passage à zéro et l'analyse d'énergie, entre autres. Ce qui signifie que j'ai besoin du signe et d'une vraie valeur. Le problème est que je ne sais pas comment obtenir des informations utiles et le format correct pour cela. J'ai déjà lu tous les champs du fichier, mais je ne suis pas sûr de bien le faire. Des suggestions, s'il vous plaît?

Voici comment je lis le fichier en ce moment:

readI = fread (& bps, 1, 2, audio); printf ("bits par échantillon =% d\n", bps);

Merci d'avance.

13
Luxk

Ma première recommandation serait d'utiliser une sorte de bibliothèque pour vous aider. La plupart des solutions sonores semblent exagérées, donc une simple bibliothèque (comme celle recommandée dans le commentaire de votre question, libsndfile ) devrait faire l'affaire.

Si vous voulez simplement savoir comment lire les fichiers WAV afin de pouvoir écrire les vôtres (car votre école pourrait tourner le nez en vous demandant d'utiliser une bibliothèque comme toute autre personne ordinaire), une recherche rapide sur Google vous donnera toutes les informations que vous besoin ainsi que certaines personnes qui ont déjà écrit de nombreux tutoriels sur la lecture du format .wav .

Si vous ne l'obtenez toujours pas, voici une partie de mon propre code où je lis l'en-tête et tous les autres morceaux du fichier de données WAV/RIFF jusqu'à ce que j'arrive au morceau de données. Il est basé exclusivement sur la spécification du format WAV . Extraire les données sonores réelles n'est pas très difficile: vous pouvez soit les lire brutes et les utiliser brutes, soit effectuer une conversion vers un format avec lequel vous seriez plus à l'aise en interne (données PCM 32 bits non compressées ou quelque chose).

Lorsque vous examinez le code ci-dessous, remplacez reader.Read...( ... ) par des appels équivalents fread pour des valeurs entières et des tailles d'octets du type indiqué. WavChunks est une énumération qui correspond aux valeurs Little Endian des ID à l'intérieur d'un bloc de fichier WAV, et la variable format est l'un des types de types de format Wav pouvant être contenus dans le fichier Format de fichier WAV:

enum class WavChunks {
    RiffHeader = 0x46464952,
    WavRiff = 0x54651475,
    Format = 0x020746d66,
    LabeledText = 0x478747C6,
    Instrumentation = 0x478747C6,
    Sample = 0x6C706D73,
    Fact = 0x47361666,
    Data = 0x61746164,
    Junk = 0x4b4e554a,
};

enum class WavFormat {
    PulseCodeModulation = 0x01,
    IEEEFloatingPoint = 0x03,
    ALaw = 0x06,
    MuLaw = 0x07,
    IMAADPCM = 0x11,
    YamahaITUG723ADPCM = 0x16,
    GSM610 = 0x31,
    ITUG721ADPCM = 0x40,
    MPEG = 0x50,
    Extensible = 0xFFFE
};

int32 chunkid = 0;
bool datachunk = false;
while ( !datachunk ) {
    chunkid = reader.ReadInt32( );
    switch ( (WavChunks)chunkid ) {
    case WavChunks::Format:
        formatsize = reader.ReadInt32( );
        format = (WavFormat)reader.ReadInt16( );
        channels = (Channels)reader.ReadInt16( );
        channelcount = (int)channels;
        samplerate = reader.ReadInt32( );
        bitspersecond = reader.ReadInt32( );
        formatblockalign = reader.ReadInt16( );
        bitdepth = reader.ReadInt16( );
        if ( formatsize == 18 ) {
            int32 extradata = reader.ReadInt16( );
            reader.Seek( extradata, SeekOrigin::Current );
        }
        break;
    case WavChunks::RiffHeader:
        headerid = chunkid;
        memsize = reader.ReadInt32( );
        riffstyle = reader.ReadInt32( );
        break;
    case WavChunks::Data:
        datachunk = true;
        datasize = reader.ReadInt32( );
        break;
    default:
        int32 skipsize = reader.ReadInt32( );
        reader.Seek( skipsize, SeekOrigin::Current );
        break;
    }
}
16
user1357649