hamradioshop.ro
Articole > Software pentru radioamatori Litere mici Litere medii Litere mari     Comentati acest articol    Tipariti

Programarea unui osciloscop audio sub Windows API

Bernardt Huth YO2CMI

Articolul prezinta una din modalitatile de a scrie un program care reda pe ecranul PC-ului semnalul de iesire audio de la transceiver.

Placa de sunet al unui PC dispune de un convertor analog numeric pentru digitalizarea semnalelor de intrare de pe linia LINE IN sau MIC. Nimic mai simplu decat sa redam in timp real aceste valori sub forma grafica. Din punct de vedere al utilizatorului programul se porneste cu dublu click pe fisierul executabil. Apare o fereastra cu butonul START. Apasand butonul programul va desena pe monitor semnalul de pe intrarea LINE IN a placii audio.

Urmeaza partea destinata programatorilor si nu numai.

Scurta teorie

Versiunea Windows pe 32 biti defineste multimedia ca o interfata unitara. Functiile acesteia se pot imparti in doua categorii: low level ( apropiat de hardware ) si high level ( apropiat de utilizator).

In lista functiilor multimedia apar sapte functii cu prefixul MCI. Aceste functii permit accesul la MCI, Media Control Interface. Programul alaturat foloseste functii apropiate de hardware.

Cea mai utilizata metoda pentru digitalizarea semnalului, fara a fi necesara comprimarea datelor se numeste PCM, Pulscode-Modulation. Ea presupune ca la intervale regulate de timp ( miimi de secunda ) sa citim / digitalizam valoarea semnalului analogic. Aceasta operatie se numeste esantionare ( sampling ) si frecventa cu care lucram este frecventa de esantionare. O alta componenta importanta este rezolutia, adica numarul bitilor pe care se memoreaza un esantion.

In procesul de esantionare trebuie luata in considerare teorema lui Nyquist, care spune ca frecventa de esantionare trebuie sa fie de cel putin de doua ori mai mare decat frecventa maxima a semnalului analogic. Pentru un CD audio ea este de 44,1 kHz, pentru urmarirea semnalului audio de la transceiver ajung 8 kHz.

Ca rezolutie se alege de obicei 8 sau 16 biti. In varianta 8 biti valoarea esantionata se memoreaza ca un octet fara semn. Zero dB corespunde cu 0x80. La varianta 16 biti amplitudinea se memoreaza ca integer cu semn.

Acesti parametri se introduc intr-o structura de tip WAVEFORMATEX

    WORD    wFormatTag      = WAVE_FORMAT_PCM 
    WORD    nChannels       = 1 ;  mono sau stereo
    DWORD nSamplesPerSec  = 11025; numarul de esantioane pe secunda
    DWORD nAvgBytesPerSec = 11025; numarul de octeti pe secunda
    WORD    nBlockAlign     = 1 ;
    WORD    wBitsPerSample  = 8 ;  memorarea pe 8 sau 16 biti 
    WORD    cbSize          = 0 ;

De asemenea vom avea nevoie de o structura de tip WAVEHDR, care descrie bufferul folosit pentru memorarea esantioanelor. In program bufferul se numeste pBuffer1.

    LPSTR    lpData			;denumire buffer
    DWORD dwBufferLength		;marime buffer
    DWORD dwBytesRecorded 
    DWORD dwUser 
    DWORD dwFlags
    DWORD dwLoops
    struct wavehdr_tag FAR *lpNext 

Programul demonstrativ este scris in limbajul C++ utilizand ca editor Code::Blocks. El porneste cu initializarea variabilelor, a structurilor si functiilor, deschiderea ferestrei. In continuare se aloca spatiul de memorie pentru buffere si se deschide dispozitivul de sunet. Daca sa reusit initializarea placii audio se initializeaza header-ul ( pWaveHdr01 ).

Inregistrarea datelor se porneste cu:

waveInStart(hWaveIn)

In caz ca bufferul e plin sistemul Windows va genera mesajul MM_WIM_DATA. In aceasta situatie vom copia continutul bufferului pBuffer1 in bufferul pGraficBuffer.

Bufferul pGraficBuffer il vom folosi pentru redarea grafica a datelor.

In continuare vom realoca bufferul pBuffer1 din nou pentru memorarea esantioanelor.

Functia folosita este waveInAddBuffer (). Aici pot fi folosite doua structuri WAVEHDR pentru memorarea datelor, dar am ales aceasta cale pentru a nu complica programul. Pentru a desena semnalul pe ecran se foloseste functia definita de programator DrawWave, functie care foloseste elemente clasice din C/C++ pentru desenarea de puncte, linii, dreptunghiuri. Aceasta functie este apelata in bucla de mesaje.

La sfarsitul programului se elibereaza zonele de memorie alocate pentru buffere si se inchide dispozitivul de sunet.

Pentru reglarea nivelului semnalului de intrare (LINE IN) se poate folosi panoul de control Start / Control Panel / Sounds…/ Volume Control.

Descarcati:

  • Programul demo (osciloscop.exe)
  • Programul sursa (osciloscop.cpp)

    Bernardt Huth YO2CMI

    Articol aparut la 4-4-2008

    13067

    Inapoi la inceputul articolului
  • Comentarii (2)  

  • Postat de Oproescu Gheorghe - YO4BKM (yo4bkm) la 2008-04-04 20:13:19 (ora Romaniei)
  • Care situatie o fi mai adevarata? Ca radioamatorii gasesc aplicatii legate de radio in orice domeniu, poate chiar si in tigaia de prajit omleta, ori ca IT isi face loc oriunde, chiar si in traficul de radioamator? Oricare ar fi, multidisciplinaritatea intretinuta si de diversitatea de meserii si preocupari ale radioamatorilor face ca aceasta pasiune sa gaseasca legaturi cu multe alte activitati, cu atat mai mult cu cat sunt mai apropiate de tranamiterea si prelucrarea informatiei. Felicitari pentru articol, ca si pentru ce ati mai publicat mai inainte, mai ales pentru explicarea modului de a implementa o idee extrem de necesara. Numai daca ne gandim la verificarea liniaritatii amplificatoarelor de emisie in SSB unde un simplu osciloscop de joasa frecventa arata clar ce se intampla, fie vizualizand clasica modulatie cu sunetul "x" (se stie ca trebuie sa apara pe ecran niste triunghiuri cu varful spre dreapta) fie, putin mai complicat, vizualizand modulatia cu doua tonuri sinusoidale. Iar de un calculator sub Windows dispun mult mai multi radioamatori decat cei care dispun de un osciloscop. In completare mai precizez ca m-am jucat si eu cu instrumente pe calculator, dar acum vreo 18 de ani, folosind un Cobra2 cu Z80 pe care l-am programat personal in cod masina dupa foarte valoroasa carte a lui Miklos Patrubani, "Totul dspre ... microprocesorul Z80". Am facut astfel turometru, frecventmetru (de JF), cu intrare prin portul de casetofon. Pacat ca nu mai dispun de manuale la fel de bune pentru microprocesoarele moderne, programarea in cod masina (chiar cu asamblare manuala, cum faceam pe vremuri pentru Z80) ma scapa de obligatia de a invata la cei 62 de ani ce-i am cele mai noi limbaje de programare. Pentru necesitatile stiintifice personale ma folosesc de Borland Pascal (care de peste 15 de ani nu mai are secrete prea mari) sau de Delphi pe sistemele mai noi. Deoarece am realizat in acest limbaj programe cu care analizez complet (inclusiv analiza spectrala cu transformata Fourier normala) semnale (mai ales vibratii) inregistrate in format WAV cu Sound Recorder, mi-ar fi foarte comod sa realizez si osciloscopul precum si alte aplicatii tot sub Borland sau Delphi. Ma puteti ajuta cu material documentar sau cu subrutine sau UNIT's-uri pentru citirea placii sunet sub Borland Pascal? Adresa mea de pe RadioAmator.ro este corecta, la fel adresa de mail care se deschide pe preambulul acestui mesaj. In momentul de fata nu pot face acest lucru decat din fisier inregistrat (cunosc detaliat structura tuturor fisierelor WAV, folosesc chiar modul stereo pentru inregistrat vibratii captate in doua puncte pentru aflarea caracteristicii de atenuare a mediului prin care trec) si nu direct.
    Cu deosebita consideratie si 73, YO4BKM op. Tavi.

  • Postat de daniel - la 2008-04-06 22:16:43 (ora Romaniei)
  • dintotdeauna mi-am dorit un osciloscop.Cu chiu cu vai am unul recuperat de pe la smelturi din fabrica unde lucrez-e un E-0101 de la IEMI dar care cred ca a mai fost folosit si de altii si oricum are lampile cam uzate...dar sa am unul pe ecranul laptop-ului?Chiar daca masoara numai audio deocamdata, este free si se pot bucura multi de el, chiar si de fantezie.Iti multumesc mult si iti doresc sanatate si fericire.
    Daniel

    Scrieti un mic comentariu la acest articol!  

    Opinia dumneavoastra va aparea dupa postare sub articolul "Programarea unui osciloscop audio sub Windows API"
    Comentariul trebuie sa se refere la continutul articolului. Mesajele anonime, cele scrise sub falsa identitate, precum si cele care contin (fara a se limita la) atac la persoana, injurii, jigniri, expresii obscene vor fi sterse.
    Comentariu *
     
    Trebuie sa va autentificati pentru a putea adauga un comentariu.


    Opiniile exprimate în articole pe acest site aparţin autorilor şi nu reflectă neapărat punctul de vedere al redacţiei.

    Copyright © Radioamator.ro. Toate drepturile rezervate. All rights reserved
    Articole | Concursuri | Mica Publicitate | Forum YO | Pagini YO | Call Book | Diverse | Despre Radioamator.ro | Contact