Gå til innhold

Hente ut data fra lydkort line in med C/Java


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 5V.

 

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, Matlab og Labview er dyrt.

Lenke til kommentar
Videoannonse
Annonse

høres ut som en lur idee;

 

trur javax.sound.sampled.AudioInputStream og konstruktoren AudioInputStream(TargetDataLine line) er noe av det du er på jakt etter om du ikke har funnet det.

 

btw: line-in på PCen er vell laget for 1Vrms signaler, så da kan du vell ikke forsterke til 5 volt (klipping). I tillegg kan du anta at det er en serie kondensator på inngangen på PCen, hvilket kan gjøre at lave frekvenser blir noe dempet.

Lenke til kommentar

Jeg har et program som kjøres fint og gjøre det jeg ønsker i Matlab. Men jeg vil helst bli uavhengig av dyre programmer som tar en masse plass.

 

Jeg har sett på java.sound.sampled pakken fra Sun. Slik jeg har oppfattet det har dataene som den henter ut ikke samme format jeg ønsker. Nemlig en lang vektor med sample-verdier.

 

Riktig som du poengterer at lydkort tar kun inn +-1V og har 20Hz-20kHz båndbredde. Derfor ønsket jeg å bruke maks verdi på pulsene til å beregne lysstyrke, da jeg har et ac signal på rundt 30Hz.

 

Jeg kunne tenkt å gjøre litt signalbehandling i en rask Atmel mikrokontroller med ADC. Men tre punkter taler imot. 10bit ADC gir maks 60dB SNR. Den er for treg til å kjøre DSP. UARTen begrenser til 192kbs. 10bit bruker 2bytes som gir maks samplingsfrekvens på 12kHz.

 

Tenkte også på DAQmx kort fra National Instruments, men alt blir så mye enklere hvis man kunne benytte lydkortet som sitter i alle PCer.

 

Takk for svar. Skal holde dere oppdaterte. Hardware delen er under kontroll. Software delen er det mer utfordringer :ermm:

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-1156502782_thumb.jpg

result.txt

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