Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C]Odczyt pliku wav, wykreślenie początkowych próbek.

Crisu 09 Maj 2007 00:59 2247 3
  • #1 09 Maj 2007 00:59
    Crisu
    Poziom 9  

    Witam!
    Otoż mam problem z odczytaniem poprawnie pliku wav.
    Za pomocą jakiegos generatora (bodaj audacity) stworzyłem plik wav o parametrach:

    Rozmiar próbki 8 wav
    Szybkosc transmisji bitów 64 kb/s
    Kanały 1
    Czestotliwosć próbkowania audio 8kHz
    Format dźwięku PCM

    i kod

    Code:

    void CProjektDlg::OnWczytajWave()
    {
       char*           buffer = NULL;    //bufor dla danych dźwięku
       unsigned int    BufferSize = 0;


    typedef struct _WAVEHEAD
    {
     struct {
            char            RIFF[4];
            unsigned long   Size;
            char            WAVE[4];
       } RIFF;

     struct {
            char            fmt[4] ;
            unsigned long   BlockSize;
            struct {
            unsigned short  AudioFormat;
            unsigned short  NumChannels;
            unsigned long SampleRate;
            unsigned long ByteRate;
            unsigned short  BlockAlign;
            unsigned short  BitsPerSample;
            } Format;
     } fmt;

     struct {
            char            data[4];
            unsigned long   DataSize;
     } data;
    } WAVEHEAD;




    WAVEHEAD head;        //nasza struktura
    WAVEFORMATEX format;

    double dane =0;
    FILE *plik = fopen("nasz88.wav","rb");
    int ha = fread(&head, sizeof(WAVEHEAD), 1, plik);
    //memcpy(&format,&(head.fmt.Format),sizeof(WAVEFORMATEX));
    //BufferSize=head.data.DataSize;
    buffer = new char[head.data.DataSize]; //mogloby byc bufferSize
    fread(buffer,head.data.DataSize,1,plik);
    fclose(plik);


       for( int i=0; i<1500;i++)
       {
          dane=buffer[i];
          m_wykres.SetRange(0,1500,-300,300);
          m_wykres.PlotXY(i,dane,0);
       }


    m_wykres.SetRange(0,1000,-300,300);


    delete[] buffer;

    }

    Problem taki, że gdy chce wykreślić np 1500 pierwszych próbek , to zamiast sinusoidy wykreśla nei wiadomo co :/
    Jakieś rady ?

    0 3
  • #2 09 Maj 2007 11:24
    Fyszo
    Spec od GSM

    A jaki masz dźwiek w tym wav'ie?

    0
  • #3 09 Maj 2007 12:26
    Crisu
    Poziom 9  

    Rozmiar próbki 8 wav
    Szybkosc transmisji bitów 64 kb/s
    Kanały 1
    Czestotliwosć próbkowania audio 8kHz
    Format dźwięku PCM

    zwykła sinusoida 5-sekundowa

    0
  • #4 10 Maj 2007 17:54
    szelus
    Specjalista - Mikrokontrolery

    U mnie, w działającym programie, struktura WAVEHDR ma jeszcze, na końcu, dwa zerowe bajty wyrównujące jej długość do wielokrotności 4 bajtów.

    Code:

    struct wavhdr
    {
        char rif[4];
        ulong length;
        char wave[4];
        char fmt[4];
        ulong fmtlen;
        ushort fmttag;
        ushort nchn;
        ulong samppsec;
        ulong bytespsec;
        ushort blkalign;
        ushort bitspsampl;
        ushort zero;
       
    } __attribute__ ((packed));


    Poza tym, na wszelki wypadek zadeklarowałem ją jako spakowaną (data też), aby uniknąć jakichkolwiek niespodzianek.

    0