Zna ktos moze algorytm to przerabiania sygnalu audio z jendego formatu (np: 44.100kHz 16bit stereo) na inny (np: 8Khz 8bit mono) ?? [stuk]
Konwersja z stereo 44 kHZ 16bit do mono 22 kHZ 8bit {wszystko w PCM, operacje wykonujesz na poszczególnych próbkach dzwięku}
- Dodaj stereo1 do stereo2 (wymaga 32 bitowych zmiennych)
- Podziel przez 2 (już mamy mono 44kHZ 16bit)
- Podziel przez 256 (mamy już 44kHZ 8bit) (najlepiej po prostu shr 8)
- 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ę
Od siebie dodam tylko tyle, że znacznie wydajniej będzie najpierw usunąć n-te próbki, a dopiero potem przeprowadzać na nich operacje.
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);
}
}
Może zamist usuwać co 2gą próbkę licz z dwóch średnią ??
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]