» »

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.

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

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:
//....
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Nakup wifi zvočnika (Bose, Sonos,...)

Oddelek: Zvok in slika
51093 (837) gregc1
»

Radio in trije različni prostori

Oddelek: Zvok in slika
345228 (3964) Ales

DTS Audio

Oddelek: Zvok in slika
296266 (3787) gregyk
»

Wolfeinstain ET - LINUX !

Oddelek: Igre
322103 (1656) WamPIRe-
»

Mplayer in problem z zvokom

Oddelek: Operacijski sistemi
7737 (696) 2g00d4u

Več podobnih tem