konwersja dzwieku

0

Zna ktos moze algorytm to przerabiania sygnalu audio z jendego formatu (np: 44.100kHz 16bit stereo) na inny (np: 8Khz 8bit mono) ?? [stuk]

0

Konwersja z stereo 44 kHZ 16bit do mono 22 kHZ 8bit {wszystko w PCM, operacje wykonujesz na poszczególnych próbkach dzwięku}

  1. Dodaj stereo1 do stereo2 (wymaga 32 bitowych zmiennych)
  2. Podziel przez 2 (już mamy mono 44kHZ 16bit)
  3. Podziel przez 256 (mamy już 44kHZ 8bit) (najlepiej po prostu shr 8)
  4. Zapisz pomijając co drugą próbkę (mamy mono 22kHZ 8bit)

zapisując co piątą będziesz miał 8,8kHZ

pozdr.

// ikari ma rację

0

Od siebie dodam tylko tyle, że znacznie wydajniej będzie najpierw usunąć n-te próbki, a dopiero potem przeprowadzać na nich operacje.

0

Sama konwersje już mam, ale przy przerabianiu z 11khz lub 22khz na 8khz powstaja znieksztalcenia glosu i przeskakiwanie probek...

oto kod ktory uzywam, jak sie pozbyc przeskakiwania ??

void conversion()
{
for(long n = 0; n < len; n++)
{
memset(ibuf,0,ibuflen);
memset(obuf,0,obuflen);
wavGetSampleBuf(wavi,ibuf,ibuflen,n * ibuflen);
for(long i = 0; i < 8000; i++)
{
long pos = wavi->FMTChunk.BytesPerSample * (int)(i * (wavi->FMTChunk.SamplingRate / 8000.0f));
int ch1 = 0,ch2 = 0;
if(wavi->FMTChunk.BitsPerSample == 8 )
{
if(wavi->FMTChunk.Channels == 2)
{
ch1 = ibuf[pos];
ch2 = ibuf[pos + 1];
}
else
{
ch1 = ibuf[pos];
ch2 = ch1;
}
obuf[i] = (ch1 + ch2) / 2;
}
else
{
if(wavi->FMTChunk.Channels == 2)
{
ch1 = 256 * ibuf[pos + 1] + ibuf[pos];
ch2 = 256 * ibuf[pos + 3] + ibuf[pos + 2];
}
else
{
ch1 = 256 * ibuf[pos + 1] + ibuf[pos];
ch2 = ch1;
}
obuf[i] = (ch1 + ch2) / 512 + 128;
}
}
wavPutSampleBuf(wavo,obuf,obuflen,n * obuflen);
}
}

0

Może zamist usuwać co 2gą próbkę licz z dwóch średnią ??

0

Witam !

trzeba uwzglednic w algorytmie to, ze 22kHz czy tez 11kHz, zadna miara nie jest calkowita wielokrotnoscia 8 kHZ! a to oznacza ze usuwajac co n-ta probke, tak naprawde zmieniamy polozenie w czasie tych ktore zostaja, a to juz jest znieksztalcenie fazy w odtwarzanym przebiegu i to daje bledy.
ja bym proponowal zrobic tak:

  • wyznaczyc czas probki od poczatku utworu (1 / 8kHz*numer probki)
  • sprawdzic czy pokrywa sie on z probka w wavie o 22 lub 11kHz, jak tak to skopiowac probke
  • jak nie to interpolacja jak w poscie powyzej z sasiadujacych dwoch probek

powodzenia! [cya]

1 użytkowników online, w tym zalogowanych: 0, gości: 1