Forum » Programiranje » C++ - real time sound pitch RPi
C++ - real time sound pitch RPi
Mohimm ::
Pozdravljeni,
Na Raspberry Pi želim v realnem času glede na podan vhod spreminjati pitch zvoka.
Uporabljam SoundTouch knjižnico, ki sprejema in podaja wav vzorce kot float. Za predvajanje uporabljam SDL2, ki uporablja Uint8.
Ker je edini način, ki sem ga uspel pripraviti do delovanja (izhod iz soundToucha-> kopiral del vzorca in spreminjal tip-> SDL stream), izredno počasen, me zanima ali obstaja kakšna hitrejša in kvalitetna opcija z isto funkcionalnostjo.
Po brskanju po internetu nisem našel drugih knjižnic, ki bi omogočale spreminjanje pitch-a ali predvajanje vzorcev na isti način kot si želim jaz. .
Je imel morda kdo že podoben problem, in ga uspešno rešil, ali predlaga smer v katero naj iščem.
Hvala in lep pozdrav.
Na Raspberry Pi želim v realnem času glede na podan vhod spreminjati pitch zvoka.
Uporabljam SoundTouch knjižnico, ki sprejema in podaja wav vzorce kot float. Za predvajanje uporabljam SDL2, ki uporablja Uint8.
Ker je edini način, ki sem ga uspel pripraviti do delovanja (izhod iz soundToucha-> kopiral del vzorca in spreminjal tip-> SDL stream), izredno počasen, me zanima ali obstaja kakšna hitrejša in kvalitetna opcija z isto funkcionalnostjo.
Po brskanju po internetu nisem našel drugih knjižnic, ki bi omogočale spreminjanje pitch-a ali predvajanje vzorcev na isti način kot si želim jaz. .
Je imel morda kdo že podoben problem, in ga uspešno rešil, ali predlaga smer v katero naj iščem.
Hvala in lep pozdrav.
smoke ::
Kje pa sploh imaš ozko grlo? Si mogoče kaj čez profiler spustil?
Spreminjanje pitcha zvoka je vbistvu spreminjanje frekvence signala, višja kot je frekvenca, višji je pitch in obratno. Če je problem v SoundTouchu lahko probaš ročno podvzorčit/nadvzorčit svoj signal in ga predvajat z enako frekvenco kot je bil originalni signal vzorčen.
Čeprav, mislim da imaš problem ker preveč kopiraš buffer z vzorci naokoli. Če imaš zvok, ki je bil vzorčen s frekvenco 44.1 kHz pomeni da imaš za vsako sekundo zvoka 176400 zlogov podatkov in kopirat to okoli je kar potratno.
Če lahko, prilepi link do izvorne kode sem.
LP
Spreminjanje pitcha zvoka je vbistvu spreminjanje frekvence signala, višja kot je frekvenca, višji je pitch in obratno. Če je problem v SoundTouchu lahko probaš ročno podvzorčit/nadvzorčit svoj signal in ga predvajat z enako frekvenco kot je bil originalni signal vzorčen.
Čeprav, mislim da imaš problem ker preveč kopiraš buffer z vzorci naokoli. Če imaš zvok, ki je bil vzorčen s frekvenco 44.1 kHz pomeni da imaš za vsako sekundo zvoka 176400 zlogov podatkov in kopirat to okoli je kar potratno.
Če lahko, prilepi link do izvorne kode sem.
LP
Mohimm ::
Hvala za nasvete. Zaradi relativne enostavnosti kode, sem prepričan da je problem v kopiranju. Do trenutne rešitve sem prišel na podoben način kot predlagan (spreminjamo sample rate).
Primer kode:
Ampak ima dva problema:
Zaradi SDL_CloseAudio in SDL_OpenAudio (naredi se nov process) v zvoku nastanejo kratke prekinitve. Če tega ne naredim se sample rate ne spremeni. Kot sem uspel najti v dokumentaciji, ne moreš spreminjati freq. vzorčenja po tem ko si klical SDL_OpenAudio.
Trenutno uporabljamo placeholder zvoke, in je sound pitch OK. Bojim se da ob tem preprostem pitchanju nastanejo prehude popačitve ob uporabi pravih samplov (jih še nimam). Zato sem tudi želel uporabiti soundTouch, ki to naredi manj naivno + ni prekinitev ker samo menjamo pointerje stream-u.
Naslednja zadeva ki jo bom probaval, je imeti odprta dva SDL_OpenAudio stream-a in medtem ko enega spreminjam drugi predvaja. Vendar je tu več časovne režije, da se stream-a ne prekrivata/ni lukenj. S tem nadaljujem jutri.
Hvala že vnaprej za nasvete.
Primer kode:
//.... SDL_LockAudio(); audio_spec.freq = 44100 + (pitch * 5); //spremeni stream ki ga uporablja SDLaudioCallback audio_len = sound_len[sprememba]; audio_pos = sound_buf[sprememba]; SDL_CloseAudio(); if(SDL_OpenAudio(&audio_spec,NULL) < 0){ cout << "Failed opening audio device\n" << SDL_GetError() <<endl; return 1; } SDL_PauseAudio(0); //predvaja naprej zvok SDL_UnlockAudio(); //....
Ampak ima dva problema:
Zaradi SDL_CloseAudio in SDL_OpenAudio (naredi se nov process) v zvoku nastanejo kratke prekinitve. Če tega ne naredim se sample rate ne spremeni. Kot sem uspel najti v dokumentaciji, ne moreš spreminjati freq. vzorčenja po tem ko si klical SDL_OpenAudio.
Trenutno uporabljamo placeholder zvoke, in je sound pitch OK. Bojim se da ob tem preprostem pitchanju nastanejo prehude popačitve ob uporabi pravih samplov (jih še nimam). Zato sem tudi želel uporabiti soundTouch, ki to naredi manj naivno + ni prekinitev ker samo menjamo pointerje stream-u.
Naslednja zadeva ki jo bom probaval, je imeti odprta dva SDL_OpenAudio stream-a in medtem ko enega spreminjam drugi predvaja. Vendar je tu več časovne režije, da se stream-a ne prekrivata/ni lukenj. S tem nadaljujem jutri.
Hvala že vnaprej za nasvete.
Randomness ::
Malo čudno si se tega lotil. Ti moraš prevzorčiti audio signal in ne nastavljati frekvence predvajanja.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Nakup wifi zvočnika (Bose, Sonos,...)Oddelek: Zvok in slika | 1217 (961) | gregc1 |
» | Radio in trije različni prostoriOddelek: Zvok in slika | 5612 (4348) | Ales |
⊘ | DTS AudioOddelek: Zvok in slika | 6452 (3973) | gregyk |
» | Wolfeinstain ET - LINUX !Oddelek: Igre | 2162 (1715) | WamPIRe- |
» | Mplayer in problem z zvokomOddelek: Operacijski sistemi | 801 (760) | 2g00d4u |