![]() |
![]() |
|
Programarea unui osciloscop audio sub Windows API
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.
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
De asemenea vom avea nevoie de o structura de tip WAVEHDR, care descrie bufferul folosit pentru memorarea esantioanelor. In program bufferul se numeste pBuffer1.
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:
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:
Articol aparut la 4-4-2008 14759 Inapoi la inceputul articolului |
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 iar dupa caz se va ridica dreptul de a posta comentarii.
|
Copyright © Radioamator.ro. Toate drepturile rezervate. All rights reserved
Articole | Concursuri | Mica Publicitate | Forum YO | Pagini YO | Call Book | Diverse | Regulamentul portalului | Contact |