Delphi - Odczyt próbek z pliku Wav

Delphi - Odczyt próbek z pliku Wav
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Witam.

Przeglądałem Google i znalazłem co najmniej kilka stron ale nie potrafię wydobyć z nich potrzebnych informacji
http://4programmers.net/Delphi/Artyku%C5%82y/Odtwarzanie_wave_z_WinAPI?sid=c350625937fba824abd57807226982ac
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

  1. Jakie wartości są zapisane w pliku Wav - chce się upewnić.

  2. chcę się upewnić jaka jest długość próbki żeby ja pobrać z pliku Wav, zakładam że to można to zrobić array of Word (chyba że Signal?).

  3. Po pobraniu danych próbki do tabeli muszę to wyświetlić jak oscyloskop (takie EKG serca, zniekształcona sinusoida itp.) a nie w postaci słupków z wartościami tylko na plusie.

mam dane:

Kopiuj
source.Size: 132268

Naglówek
fHeader.riff :RIFF
fNaglowek.len :132260
fHeader.cWavFmt :WAVEfmt 
fNaglowek.dwHdrLen :16
fNaglowek.wFormat :1
fNaglowek.wNumChannels :1
fNaglowek.dwSampleRate :22050
fNaglowek.dwBytesPerSec :44100
fNaglowek.wBlockAlign :2
fNaglowek.wBitsPerSample :16
fNaglowek.cData :data
fNaglowek.dwDataLen :132224

fWaveData.Position: 44
fWaveData.Size: 132268

wyliczenia:

Kopiuj
   fDlgProbki:= fNaglowek.wBitsPerSample * fNaglowek.wNumChannels;              // domniemana długość próbki
   fDlgNaglowek:= sizeof(TWavNaglowek);
   fProbkiMax := fWaveData.Size  - fDlgNaglowek;
   fProbkiMax := fProbkiMax div fDlgProbki;                        // ilość próbek

Pobieranie danych:

Kopiuj
type
   TTbofWord = array of Word;


procedure TMyWave.GetProbka(NrProbki: Integer; var data: TTbofWord);
var
   t : integer;
   tmp: Word;
begin
   SetLength(data, fDlgProbki);

   if (fWaveData.Size <= sizeof(TWavNaglowek)) or
      (NrProbki>ProbkiMax)
   then begin
      for t := 0 to Length(data)-1 do data[t] := 0;
      exit;
   end;

   for t := 0 to Length(data)-1 do begin
     fWaveData.Seek(fDlgNaglowek + NrProbki*fDlgProbki +t*SizeOf(tmp), soFromBeginning);
     fWaveData.Read(tmp, SizeOf(tmp));
     data[t]:= tmp;
   end;
end;
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
0
Integers napisał(a)
  1. Jakie wartości są zapisane w pliku Wav - chce się upewnić.
    To zależy, WAV to kontener strumienia audio, a nie konkretny format kodowania. W pliku WAV może być na przykład strumień mp3. Najczęściej jednak wav stosuje się do zapisu audio niekompresowanego (PCM) ale i wtedy może być to mono, stereo, o różnej rozdzielczości (8 lub 16 bitów) i o różnej częstotliwości próbkowania. Należałoby zawsze sprawdzać, czy masz rzeczywiście PCM i o jakich dokładnie parametrach.
  1. Po pobraniu danych próbki do tabeli muszę to wyświetlić jak oscyloskop (takie EKG serca, zniekształcona sinusoida itp.) a nie w postaci słupków z wartościami tylko na plusie.
    W przypadku najbardziej typowego formatu 16-bit signed PCM pojedynczy sampel przyjmuje wartości z zakresu -32768..+32767 (czyli nie word, a shortint). Z tego już wykres powinieneś móc narysować...
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Dzięki, ten shortint załatwił sprawę, a wiesz coś na temat długości próbki bo nie jestem pewny czy dobrze ją wyznaczyłem w powyższym przykładzie?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.