Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

DirectX-DirectSound i C# ,problem zvuk

[es] :: .NET :: .NET Desktop razvoj :: DirectX-DirectSound i C# ,problem zvuk

[ Pregleda: 2584 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

PremierApostile
Oslo, Norway

Član broj: 74986
Poruke: 68
*.ns.ac.yu.



+4 Profil

icon DirectX-DirectSound i C# ,problem zvuk25.06.2007. u 13:47 - pre 204 meseci
Imam problem sa reprodukcijom zvuka.
Ovako podesavam parametre za reprodukciju:
Code:

 format = new WaveFormat();
             format.BitsPerSample =16;
             format.Channels = 1;
             format.BlockAlign = 2;
             format.FormatTag = WaveFormatTag.Pcm;
             format.SamplesPerSecond = 22050; 
             format.AverageBytesPerSecond = format.SamplesPerSecond * format.BlockAlign;
             // buffer description
             BufferDescription desc = new BufferDescription(format);
             desc.ControlFrequency = true;
             desc.BufferBytes = format.AverageBytesPerSecond/20 ;
             desc.ControlVolume = true;
             deviceSound.SetCooperativeLevel(argControl , CooperativeLevel.Priority );
             secBuffer = new SecondaryBuffer(desc, deviceSound);
             secBuffer.Volume =0;
             secBuffer.Frequency = SignalSampleFrequency;

SignalSampleFrequency mi je frekvencija koju sam prosledio "pre" ovog koda.
Ovo mi je funkcija gde vrsim reprodukciju

Code:

  public void Play(ref System.Collections.ArrayList argArrayList)
        {
         

            int j = 0;  
            for (int i = argArrayList.Count - 50; i < argArrayList.Count; i++)
            {
                soundArray[j] =Convert.ToInt16  (argArrayList[i]);
               // soundArray[j]=Convert.ToInt16(argArrayList[i])<<4;
                j++;
            }
            
            secBuffer.Write(0, soundArray , LockFlag.None  );
            secBuffer.Play(0, BufferPlayFlags.Default  );
            
            
           
        }

U argArrayList se nalaze brojne vrednosti,i sada u zavisnosti od frekvencije ,meni bi bilo pozeljno da se cuje kao razlicit sum.
Imam generator funkcija koji mi je zakacen na uredjaj.U aplikaciji sa tog uredjaja uzimam podatke.Problem mi je sto mi se ne cuju pravilno sinusoide.Npr cujem i na 10 Hz,a bogami i na 40 KHz promenu signala.
Da li mozda neko moze da mi pomogne i nasluti gresku :)
Svako može, a poneko zna.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk26.06.2007. u 13:40 - pre 204 meseci
Ok, kao prvo nema teorijske sanse da pustas 40khz zvuk na 22050Hz sampling frekvenciji. Po Nyquis-Shannon teoremi ili, ako se dobro secam ETFa, "teoremi odabiranja" maksimalna frekvencija signala koji mozes samplovati (reprodukovati) je dva puta manja od frekvencije semplovanja. Tj. maksimalna frekvencija zvuka koju ti mozes da postignes sa 22050Hz samplingom je 11050Hz.

Dalje sampling frequency mora da odgovara frekvenciji u bufferu. Ako npr imas 300Hz signal samplovan u 44Khz bufferu a pustis taj buffer na 22Khz cuces zvuk od 150Hz, zato sto se buffer "trosi" sporije. Mozda je to razlog sto ne cujes zvuk u ocekivanoj frekvenciji...

Takodje mi play metod malo sumnjiv, sta zapravo postizes sa zadnjih 50 elemenata? Iz ova dva dela kod nije bas lako naslutiti gde je tvoja greska..
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

PremierApostile
Oslo, Norway

Član broj: 74986
Poruke: 68
*.ADSL.neobee.net.



+4 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk26.06.2007. u 15:33 - pre 204 meseci
Citat:
mmix: Ok, kao prvo nema teorijske sanse da pustas 40khz zvuk na 22050Hz sampling frekvenciji. Po Nyquis-Shannon teoremi ili, ako se dobro secam ETFa, "teoremi odabiranja" maksimalna frekvencija signala koji mozes samplovati (reprodukovati) je dva puta manja od frekvencije semplovanja. Tj. maksimalna frekvencija zvuka koju ti mozes da postignes sa 22050Hz samplingom je 11050Hz.

Dalje sampling frequency mora da odgovara frekvenciji u bufferu. Ako npr imas 300Hz signal samplovan u 44Khz bufferu a pustis taj buffer na 22Khz cuces zvuk od 150Hz, zato sto se buffer "trosi" sporije. Mozda je to razlog sto ne cujes zvuk u ocekivanoj frekvenciji...

Takodje mi play metod malo sumnjiv, sta zapravo postizes sa zadnjih 50 elemenata? Iz ova dva dela kod nije bas lako naslutiti gde je tvoja greska..

Ja treba na zvucnik da posaljem EMG signal( Signal sa misicnih tkiva) .
Taj signal je max 5Khz.
Play metod sam promenio.Ne moze ovako da radi .Uzimao sam 50 elemenata i to "slao na zvucnike" ,a to je zanemarljivo malo u odnosu na brzinu samplinga tj na 22050. Nisam razumeo kako si mislio da se buffer trosi sporije.

format.BitsPerSample =16;-Ako moze pitanje sto se tice ovog.Da li to znaci da svaki element mora biti u opsegu od 0-2^16-1,i
kako na taj nacin slati negativne brojeve. Da li deliti opseg na dva ista dela ili ...

Na kraju ,mislim da mozda i nije problem ovde.Imam u Main Formi timer sa tick-om od 50 ms.Mislim da je tu problem.Jer u roku od 50 ms mnostvo posla obavljam,racunar ne stize to da mi odradi.Pocne da svira ,ja ga prekidam na 50 ms ,i tako samo cujem pocetak onog sto se nalazi u bufferu.Ako povecam timer,jos veci problemi jer dobijam vise podataka.
Mukama nikad kraja !!! :-).
U svakom slucaju Hvala na svim odgovorima do sada ,to mnogo znaci :-)!!!
Svako može, a poneko zna.
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.dsl.siol.net.



+1 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk26.06.2007. u 19:44 - pre 204 meseci
Zvuk se digitialno zapisuje tako sto se prirodna sinusoida koja ima beskonacno poddelova u svakoj jedinici vremena prebacuje u digitalan zapis koji ima diskretne celobrojne vrednosti. Vrednost sinusoide (y osa) u jedinici vremena (x osa) predstavlja fizicki polozaj membrane zvucnika koji proizvodi zvuk na osnovu sinusoide koja mu se dovodi kao signal, drugim recima sinusoida signala predstavlja put membrane zvucnika kroz vreme. U digitalnom smislu (duzina zvuka * samle rate) predstavlja x osu, dok bitdepth predstavlja y osu digitalizovane sinusoide zvuka. Kada imas 8-bitni zvuk imas na raspolaganju 255 tj. (+-127 + 0) polozaja membrane, dok kod 16-bitnog imas 65535, tj. (+-32767 + 0), znaci 16-bitni zvuk ima mnogo finiji korak membrane pa samim tim i finiji zvuk. Sample rate sa druge strane predstavlja sa koliko je 8-bitnih ili 16-bitnih integera predstavljena 1 sekunda zvuka. Znaci sample rate sa jedne (x) i bit depth sa druge (y) predstavljaju "rezoluciju" zvuka. Ono sto ti je mmix opisao kao Nyqist teoremu u stvari znaci da zvuk zapisan ili pusten na 22050 Hz sample rate-u nema dovoljnu rezoluciju da opise zvuk od 20 KHz, jer mu trebaju 2 integera za 1 treptaj membrane zvucnika, znaci minimalna x rezolucija od 40KHz.

Zvuk koji je fizicki snimljen sa 22050 Hz sample rate-om kada pustis na 44100 sample rate trajace 2x krace, tj. dobices pitch-bend efekat, kao kad ubrzas snimljenu audio-kasetu. Znaci da bi na 44100 izlaz doveo 22050 zvuk moras sporije "trositi" bafer odnosno svaku vrednost davati 2x, u suprotnom ces dobiti pomenuti pitch-bend. U slucaju celobrojno deljivih sample rate-ova je to lako, problemi nastaju kad treba da konvertujes 32KHz na 22.050 Khz :) Bolje resenje je da i bafer i izlazni device setujes na isti sample rate.

Ako sam nesto zayebo nek me neki ETF-ovac ispravi, ja sam samo ubogi gimnazijalac :)
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk27.06.2007. u 13:54 - pre 204 meseci
@_v!rus_: nisi los za jednog ubogog gimnazijalca

@PremierApostile: ok, da vidimo ovako, korak po korak:

Tebi stize ulazni signal 0-5kHz, po nekom sampling rate-u i u digitalnom opsegu od 0-4095, da bi to islo lepo na zvucnike, moras da obavis sledece korake:

1. Normalizacija. To podrazumeva dva koraka:
- spustanje realne "nule" signala na nulti polozaj membrane, ako se secas svog proslog post-a, najbrzi i najjednostavniji nacin je da jednostavno svakom semplu oduzmes 2048 (da napravis opseg od -2048 do +2047). Iako postoje i durgi algoritmi za ovo, ja pretpostavljam da tebi signal vec ima fiksnu "nulu" na vrednosti 2048 posto pominjes sinusioide.
- normalizacija snage, tj pojacavanje signala. Svaki sample pomnozi sa 16 (ili shiftuj levo za 4 mesta sa predznakom, sto ti dodje na isto al je brze) da bi dobio samplove u opsegu -32768 do 32767. Ovde takodje postoje drugi algoritmi, ali za tvoje potrbe ovo ce raditi.

Time si normalizovao signal za pustanje na audio hardveru, sad treba da resis problem pitch-bend efekta, sto rece virus. Da bi to resio, moras da znas koji je sample rate tvog ulaznog signala. Bez toga ne vredi nista. Pretpostavljam da ti dobijas samplove iz neke biblioteke koja je dosla uz uredjaj za merenje, tako da dokumentacija za uredjaj verovatno to ima. Ako se taj sample frequency razlikuje od onih podrzanih od strane audio hardera (a to su 11025Hz, 22050 i 44100Hz, 48000Hz i novije kartice sa 96000Hz) onda moras da prodjes kroz proces koji se zove "resampling" koji ide u dva "ukusa"
Downsampling kad spustas sample rate (npr sa 12000Hz na 8000Hz) i Upsampling koji ide u obrnutom smeru.
Postoji dosta algoritama za ove procese, a ja bih ti dao sledece preporuke:

- uvek radi Upsampling ako je moguce. Tj ako imas sampling frequency na 12000Hz, bolje radi upsample na 22050Hz nego downsample na 11025.
- ako imas samo sinusoide, onda izaberi najbrzi i najjednostavniji algoritam. resampling sinusioda koliko se secam (a ovo stvarno uzmi sa rezervom) slabo ili uopste ne izaziva aliasing efekat jer u furijerovoj seriji nema koeficijente na visim harmonicima koji su podlozni distorziji, samim tim ne zahteva low-pass filter.

pogeldaj malo na netu, npr ovaj link je fin http://www.dspguru.com/info/faqs/mrfaq.htm


Tek takav normalizovan i resamplovan signal izbaci na audio karticu i cuces i ispravan oblik i ispravnu frekvenciju. Ne zaboravi da karticu podesis na sampling rate koji odgovara resamplovanoj vrednosti...

Alternativno resenje bi bilo da mozes da kotrnolises sampling rate mernog uredjaja. AKo bi mogao da podesis merni uredjaj da ti daje 22050Hz sampling rate onda mozes da preskocis ceo proces resapmlinga.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk27.06.2007. u 18:30 - pre 204 meseci
Citat:
mmix: ako imas samo sinusoide, onda izaberi najbrzi i najjednostavniji algoritam. resampling sinusioda koliko se secam (a ovo stvarno uzmi sa rezervom) slabo ili uopste ne izaziva aliasing efekat jer u furijerovoj seriji nema koeficijente na visim harmonicima koji su podlozni distorziji, samim tim ne zahteva low-pass filter.

Ok, ignorisi ovo, sad sam se raspitao. Iako sam ulazni signal nema koeficijente u visim harmonicima, tokom procesa upsamplinga se uvode vestacke "nule" u signal sto proizvodi vise harmonike u signalu pre ulaska u filter. Tako da ipak mora low-pass filter bez obzira sto ce rezultat iza filtera opet biti sinusoida bez visih harmonika.

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

PremierApostile
Oslo, Norway

Član broj: 74986
Poruke: 68
*.ADSL.neobee.net.



+4 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk27.06.2007. u 19:28 - pre 204 meseci
Pre svega da se zahvalim na ovolikoj pozrtvovanosti .U eri kapitalizma besplatno dobiti ovako kvalitetne i korisne informacije se moze dobiti samo od VELIKIH ljudi. :-)
Ne zaboravi da karticu podesis na sampling rate koji odgovara resamplovanoj vrednosti....
Ovo ne razumem ,tj kako da podesim karticu.Da li to podesavanje podrazumeva setovanje frekvencije u Secondary Bufferu.
Posto ja unosim pri konekciji na device sampling frekvenciju koja ide u rasponu od 1kHz do 10 KHz Upsampling mi ne gine ... .

Radi se o signalu koji ima velike promene frekvencije u odredjenim trenucima,hocu da kazem da nemam neke finese u zapisu.
Prethodnu recenicu sam napisao cisto da se informisem ,da ne bi uvodio Upsampling gde bi imao dodatne racunske operacije i trosio procesorsko vreme,da li bi mogao da npr. ako mi je sample frekvencija signala 10 kHz ili 5 KHz da u buffer koji cu kasnije slati na zvucnik umesto jednog elementa saljem dva ista elementa( ili cetiri ako je frekvencija 5KHz) i na taj nacin "povecam" frekvenciju. Sve ovo radim ako mi je u formatu podesen wave format na 22050 Hz.
Svako može, a poneko zna.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk27.06.2007. u 21:25 - pre 204 meseci
Mani ti kapitalizam, meni niko nije naplatio to znanje, pa necu ni ja nikom, u prevodu otislo po nabavnoj ceni Malo promene od baza i bindovanja uvek dobro dodje.

Citat:
PremierApostile: Ovo ne razumem ,tj kako da podesim karticu.Da li to podesavanje podrazumeva setovanje frekvencije u Secondary Bufferu. Posto ja unosim pri konekciji na device sampling frekvenciju koja ide u rasponu od 1kHz do 10 KHz Upsampling mi ne gine ...


format.SamplesPerSecond ti odredjuje broj samplova po sekundi u baferu, tj sampling frekvenciju tvog signala. Sad kako pricamo o ovome, pokusavam da se setim gde tacno, ali mislim da sam negde svojevremeno procitao da sam DirectX ima resampling engine u sebi. Sto ce reci probaj da postavis format.SamplesPerSecond na tvoju ulaznu frekvenciju, ako je ovaj hunch u pravu DirectX ce sam resamplovati taj sekundarni buffer pre nego ga srovali u primary buffer zvucne kartice. To bi ti resilo problem prilicno fino.

E sad, rpe nego to uradis, mislim po tvom odgovoru da brkas dve stvari, frekvenciju ulaznog signala i frekvenciju semplovanja. TO su dve totalno razlicite stvari. Frekvencija tvoje sinusoide je frekvencija signala, taj signal se sampluje (ocitava) svkaih 1/Fs sekundi gde je Fs - frekvencija semplovanja. Za reprodukciju ti je vazna frekvencija semplovanja, ne frekvencija ulaznog signala.


E da, ne odgovorih ti na pitanje. "Kartica" je u tvom programu predstavljena kao Device objekat. Pretpostavljam da si jednu isntancirao i prebacio mode u CooperativeLevel.Normal. Time si nazalost tvoju DX sesiju zakucao u 22Khz/8bit/stereo modu, kad kazem zakucao mislim DX te je pridruzio drugim kooperativnim sesijama i svi delite pristup primarnom baferu u ovom formatu. To takodje pretpostavljam znaci da ce svi buferi koji nisu u ovom formatu biti resamplovani automatski (ne znam toliko o tome jos). Ako hoces da tvoj program kontrolise primarni buffer, moras da predjes u visi mod (CooperativeLevel.Priority). Ali ako tvoj ulazni signal ne prelazi 10Khz onda ti je normalan mod sasvim zadovoljavajuci.

[Ovu poruku je menjao mmix dana 27.06.2007. u 22:37 GMT+1]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

PremierApostile
Oslo, Norway

Član broj: 74986
Poruke: 68
*.ADSL.neobee.net.



+4 Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk27.06.2007. u 21:36 - pre 204 meseci
Razumeo sam i ranije tu razliku ,al previse( mada nikad nije previse) sam se uneo u ovaj problem ,jer mi zadaje prilicne probleme,pa sam poceo da "lupetam " oko tih frekvencija. Ispada samo da mi je problem u razlicitim Frekv.semplovanja.
Sta da ti kazem na kraju ,nego jedno veliko hvala.

Svako može, a poneko zna.
 
Odgovor na temu

PeraKojovic
Petar Kojovic
Novi Sad

Član broj: 95569
Poruke: 56
*.metrohive.neobee.net.



Profil

icon Re: DirectX-DirectSound i C# ,problem zvuk30.06.2007. u 18:51 - pre 204 meseci
Prijatelju Bogi,

(mozda)resenje ti je sledece:

1. na tajmer od 50ms punis neki bafer sa podacima sa EMG hardvera (slucajno znam, preko USB DLLa)
2. ako tacno znas koliko podataka dobijes za tih 50ms onda je to super, tj. znaces koliko podataka
moras da reprodukujes u tih 50ms
3. ako radis reprodukciju na 11.000Hz, to znaci da dobijene podatke UpSample-ujes (jer ces ih sigurno
imati manje od 555 vrednosti na 50ms). Jedan od nacina je da ako su ti podaci multipli ka 555 da
vrednosti multipliciras do 555 vrednosti za pustanje Play metodom na svakih 50ms.
Primer: Stigne ti 185 podataka, multipliciras svaki 3 puta, cime ne menjas pitch jer ces to reprodukovati
na 11.000Hz
4. ne treba da te podsecam da to pustanje moras da radis u posebnom tredu, ili da asinhrono pozoves
metodu play svakih 50ms

Ajde probaj malo, pa ako ti ne ide, javi, znamo i mi da "pevamo"...


P.S. nadam se da ste ovaj vikend pili, i da ti se mozak razbistrio...

Pozdrav,
Pera
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: DirectX-DirectSound i C# ,problem zvuk

[ Pregleda: 2584 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.