Gå til innhold

Hente rådata fra lydkort


Anbefalte innlegg

Jeg ønsker å lage et instrument som kan måle responstiden til LCD skjermer, kontrast, lysstyrke, osv...

 

Til dette skal jeg bruke en 5mm diameter silisium photodiode for å måle intensiteten til lyset ut fra LCD skjermen. Fotodioden tenkes motert i et sylinder som skal holds inntil skjermen slik at kun en liten del av skjermens overflate blir målt. Videre blir strømmen som er proposjonal med intensiteten forsterket med en transimpedance forsterker. Riktig forsterkning velges slik at signalet ikke overstiger 1V.

 

Responsen måles følgende: et videoklipp med alternerende svart/hvit bilde blir spilt (30FPS). Signalet fra forsterkeren skal ideelt være firkantpulser med duty cycle lik 50%. Men pga tregheten i LCD krystallene vil det være en rise/fall respons. Ved å måle tiden det tar fra 10% til 90% får vi rise time. Tilsvarende på fall time.

 

Kontrasten måles følgende: samme videoklipp. Max verdi på pulsen blir dividert på min verdi. Dette tallet er kontrasten til LCD pannelet og skal ligge over 200.

 

Intensitet måles følgende: Max verdi på pulsene blir målt. Denne verdien representerer en spenning. strømmen generert av photodioden regnes ut ved å dividere på forsterkningen. Intensiteten finnes ved å dele på responsiviteten til photodioden (A/W).

 

Dette kan enkelt gjøres ved å bruke oscilloskop. For at dette instrumentet skal være lett å bruke og helts ingen teknisk kunnskap skal være nødvendig. Derfor ønsker jeg å digitalisere (ADC) forsterkerutgangen og benytte digital signal behandling til å finne responstiden, kontrasten og lysstyrken. Jeg ser for meg et lite program med GUI som guider deg gjennom prosessen. Helst skal programmet ha et vindu som genererer pulsene beskrevet over (med justerbar frekvens og farge). Sample verdiene kan programmet hente fra lydkortet. 10kS/s er godt nok. Da får du rundt 25 sampler i et tidsinterval på 2.5ms som skulle dekke behovet for kontrast og lysstyrke målingene. Maks samplingsfreksvens er 44.1kS/s med lydkortet. Dette burde være nok til å måle responstiden.

 

Kan noen hjelpe med å lage en C-kode snutt som f.eks. leser henter inn 1s med rå data fra lydkortet og sette verdiene i en 44100 elementer lang vektor. Gui tror jeg det enklest å lage med JAVA (for meg da). Jeg er klar over at Matlab/Labview løser dette elegant, men Matlab og Labview er dyrt.

Lenke til kommentar
Videoannonse
Annonse

Tror jeg skulle få til dette under Linux, men du er sikkert ute etter noe til win32?

 

edit:

uhm, eller hva med å ganske enkelt kalle en ekstern prosess (altså starte et program) som gjør det for en? .. tipper det finnes et lite verktøy for dette til linux

 

dette holder sikkert i mange tilfeller:

 

rec --rate=44100 result.wav

sox result.wav result.raw

Endret av lnostdal
Lenke til kommentar

OpenAL er platform uavhengi og har muligheten til å ta opp lyd fra høyeste til laveste (Hvis frekvensen ikke passer et format blir det resamplet) og støtter 16 og 8 bit format (stereo og mono).

 

Hvis du skal ha 44100 16 eller 8 bits int etterhverandre som en fil så kan jeg sikkert ordne det, men som lnostdal.

Jeg kan bare lage binære filer for win32/win64, men source til det meste.

 

EDIT: hmm nå vet jeg platformen

 

Kan du ikke gi litt mer spesifikasjoner. Åssen formater skal se ut, båndbredde, 16/8 bit , DLL/EXE, instillinger, dll interface +++.

 

skal se om jeg ikke får mekka det til helga

Endret av Giddion
Lenke til kommentar

Takk for svar!

Hadde vært fint om du kunne lage en C-kode snutt som kontinuerlig sampler inngangen med en bestemt frekvens (8000,1180,22000,44100).

la oss si at jeg har en vektor "soundSamples =[0.000 0.001 0.002 0.003 osv...]". Hvis det er mulig å lagre dette til en tekst fil med ASCII format og i rader nedover, hadde det vært veldig enkelt for signal behandling i ettertid.

 

Første steg ønsker jeg kun en vektor som oppdaterer seg jevnlig med innsamlede data fra lydkortet. Senere må jeg finne en måte å sende disse verdiene videre til JAVA programmet med GUI.

Lenke til kommentar

(vet kanskje dette fra før, men hvorfor ikke..)

 

44.1kHz/s vil si hvor ofte (x-aksen) målingen blir gjort pr. sekund; tror Giddion spør om hvor høy oppløsning (y-aksen) hver måling skal ha.

 

8 bits oppløsning vil si at signalet kan ha 256 mulige posisjoner eller verdier (y-aksen) ved hver måling. Et eksempel her kan være verdier mellom -128 og 128, der 0 i sammenheng med en høyttaler vil si hvilestilling, -128 vil si fullt utslag inn og 128 vil si fullt utslag ut.

 

44.1kHz 16bit er vanlige oppløsninger for CD-lyd, noe som gir 65536 mulige posisjoner/verdier á y-aksen.

 

edit:

Egentlig bør det vel være enkelt å parameterisere disse tingene - sånn at brukeren kan spesifisere selv.

Endret av lnostdal
Lenke til kommentar

Det stemmer det instdal sier jeg burde skulle gjerne vist om det er 8 eller 16 bit.

Jeg er også usikker på hvordan filen skal se ut.

Er det slik:

 

 

12344123
1234
12332

 

Dvs en rekke med heltall som bruker linje slutt som separator uten noe info om hvor mange linjer det er og noe annet info.

Jeg må også vite om det skal være en DLL eller exe fil.

Siden jeg bruker OpenAL så må OpenAL runtime være installert, det pleier å være installert, men det burde sjekkes.

Det er mulig dette fungerer bare med å legge med et par dll filer

Når jeg tenker på linjeslutt så er det en windows linje slutt dvs. (CR +LF) går dette bra med coden din?

Endret av Giddion
Lenke til kommentar

To sampling rates muligheter: 22k og 44.1k

16bit oppløsning. 0 - 2^16 verdier.

 

8 bit har bare SNR = 48dB som er for dårlig.

16 bit har SNR = 96dB som er mer enn godt nok.

 

To eksempel-filer er gitt under. result.txt viser rådata lagret i riktig format.

 

result_spectrum.jpg viser tidsignal og spektrum for et signal tatt opp med lydkortet i Matlab.

 

double[] mittfilter(double[] inn){
ret[0]=inn[0];
ret(1)=inn[1];
for (int i=2;i<length(inn);i++){
  temp1 = 0.0495*inn[i] + 0.0990*inn[i-1] + 0.0495*inn[i-2];
  temp2 = 1.2796*ret[i-1] -0.4776*ret[i-2];
  ret[i]=temp1+temp2;
}
return ret;
}

 

Metoden over er et 2. ordens lavpass filter med 3dB knekkfrekvens lik 4kHz som jeg ønsker å kjøre rådataen min gjennom. Dette reduserer støy fra oppdateringene av pixlene med frekvens i MHz området.

post-10582-1156497849_thumb.jpg

result.txt

Endret av ddd-king
Lenke til kommentar

woho det gikk kjapt, jeg kunne bruke masse kode fra mitt VOIP prosjekt, så jeg er ferdig med en test app. den har ingen innstillinger (tar opp i 44k 16bit). Den vil dumpe dataene i test.txt som skal poppe fram i samme dir. som programmet, og den vil slette all dataene i filen nestegang den kjører. programmet tar opp data i 1,5 sek men bruker bare dataene fra det første sek.

 

Jeg har tenkt litt på settingene

Fil navn

Frekvens

Lav klipp av signalet (klipper til 0 hvis signalet er lavere enn X)

 

Holder det?

Hvordan skal programmet få dataene?

 

OpenAL vil bruke default recording device, se SoundSettings i cpl.

Jeg har kun testet med SoundOut ikke mic.

 

PS: Dette er en exe fil og av den grunn kan den teoretisk sett ha virus i seg. Jeg har ingen grunn til å tro det, men for å være på den sikre siden sjekk for virus.

 

Ellers så er det bare å følge instruksene i vinduet og lykke til.

YSoundPrinter.zip

Lenke til kommentar

Takk.

 

Jeg fant en ny metode på nattoget til trondheim igår: Nemlig at matlab kan compilere mine filer til C/C++. Samtidig blir det laget en executable fil. Denne filen og toolboxene som følger med er totalt ca. 7MB.

 

For å kjøre exe filen på andre maskiner må de enten ha Matlab installert eller installere en "Matlab Component Runtime" som også kan generes av Matlab. Man får kun 1 self-extracting install fil.

 

Har kompilert funksjonen "daq.m" som leser inn 1s fra lydkortet. Plotte rå lyd (spenning som funksjon av tid) og Frekvensspektrum.

På neste bilde har jeg kjørt rådataen gjennom et 4.ordens lavpass filter med knekkfrekvens lik 3kHz.

 

Den skarpe peaken rundt 3kHz er plystrelyden min.

Etter filterering er den nesten borte.

post-10582-1156590171_thumb.jpg

post-10582-1156590178_thumb.jpg

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...