• Non ci sono risultati.

audio real-time: la libreria portaudio

N/A
N/A
Protected

Academic year: 2021

Condividi "audio real-time: la libreria portaudio"

Copied!
21
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Università degli Studi di Udine

Scrittura di programmi applicativi per audio real-time: la libreria portaudio

(2)

Il segnale audio

amplificatore

microfono: converte il suono in variazioni di una tensione o corrente elettrica

suono: successione di compressioni e rarefazioni dell’aria

amplificatore: amplifica il livello della tensione/corrente

segnale audio analogico (elettrico) t

V

(3)

Il segnale audio

• È continuo:

– nel tempo

– nelle ampiezze

• Per la codifica digitale è necessario rendere discreto il segnale:

– per il tempo  campionamento – per le ampiezze  quantizzazione

(4)

Campionamento

t V

“CAMPIONAMENTO”

(5)

Campionamento

(6)

Teorema del campionamento (Shannon, Nyquist)

• Si applica a segnali reali limitati in banda (potenza nulla al di sopra di una frequenza massima B)

• Permette di rappresentare completamente un

segnale continuo nel tempo mediante una sequenza discreta di valori campionati a frequenza Fc

• Vincolo:

F

c

 2B

(7)

Quantizzazione

• Il campionamento produce dei numeri reali di precisione virtualmente infinita

• Per la rappresentazione digitale è necessario utilizzare un numero finito di bit

• La quantizzazione arrotonda i valori dei campioni introducendo irreversibilmente una perdita di

informazione detta “rumore di quantizzazione”

(8)

Quantizzazione

t V

t V

t V

campionamento quantizzazione

(9)

Alcuni esempi

• Voce per telefonia digitale PCM (Pulse Code Modulation)

– B 3400 Hz (il canale telefonico ha banda 300-3400 Hz) – Fc = 8 kHz

– Quantizzazione: 8 bit/campione

– 64 kb/s

– 1 minuto: 480 kB

(10)

Alcuni esempi

• Musica su CD audio

– B  20 kHz (l’insieme di frequenze udibili dall’orecchio umano è 20-20000 Hz)

– Fc = 44.1 kHz

– Quantizzazione: 16 bit/campione (per ognuno dei due canali: il CD è stereo)

– 1.411 Mb/s

– 1 minuto: circa 10 MB

(11)

In linguaggio C, file WAV

• I campioni da 16 bit sono rappresentati da valori di tipo signed short int

• La sequenza di campioni è memorizzata in un vettore in cui i valori del canale destro e canale sinistro sono alternati

signed short int buffer[88200]

(12)

Interfaccia audio

driver software dispositivo

hardware

programma applicativo

qui tocca a noi!

qui ci pensa il costruttore…

(13)

Libreria portaudio

• http://www.portaudio.com/

“Portable cross-platform Audio API”

• Compatibile con cygwin/gcc

• Wrapper per le esercitazioni di “Architettura dei calcolatori”:

rtalib (real-time audio library)

(14)

Un piccolo problema

Il driver software esiste già. Come fa a chiamare una funzione della nostra applicazione?

Funzioni di CALLBACK!!!

(15)

Callback function

driver software

programma applicativo f_inizializzazione (indirizzo_fz_appl)

chiamata di (*indirizzo_fz_appl)()

(16)

rtalib

• Limitata al formato CD audio (44.1 KHz, 16 bit, stereo)

• Richiede i file cygportaudio-2.dll e libportaudio.dll.a (Windows) o libportaudio.so (Linux), portaudio.h, rtalib.c, rtalib.h, wav.c, wav.h, (sul sito

www.montessoro.it)

• per compilare:

cc_rta <nome programma> (Windows) ./cc_rta <nome programma> (Linux)

(17)

rtalib: funzioni di inizializzazione

int init_stream_for_input (void) int init_stream_for_output (void)

int init_stream_for_input_and_output (void)

(18)

rtalib: funzioni di callback

void write_buffer_to_play

(signed short int *buffer, int buffer_size)

void read_recorded_buffer

(signed short int *buffer, int buffer_size)

void read_and_write_buffer

(signed short int *input_buffer, signed short int *output_buffer, int buffer_size)

(19)

rtalib: temporizzazione e chiusura

void sleep_while_stream_is_running

(double seconds) int close_stream (void)

(20)

Esempio: wire

void wire (void) {

if (init_stream_for_input_and_output() == -1) {

printf ("error opening output stream\n");

exit (EXIT_FAILURE);

}

printf ("Playing... 'X' to terminate.\n");

while (toupper(getchar()) != 'X');

return;

}

(21)

Esempio: wire

void read_and_write_buffer

(signed short int *input_buffer,

signed short int *output_buffer, int buffer_size) {

int i;

for (i = 0; i < buffer_size; i++) {

*output_buffer++ = *input_buffer++; /* left */

*output_buffer++ = *input_buffer++; /* right */

}

return;

}

Riferimenti

Documenti correlati

Alice sceglie una stringa casuale di bit ed una sequenza casuale di basi di polarizzazione (rettilinea, o diagonale) e manda a Bob una sequenza di fotoni, ognuno rappresentante un

[r]

Scrivere la sezione d’urto differenziale in dΩ angolo solido del muone finale, nel caso caso in cui non si misurino gli spin finali e i fasci iniziali siano non polarizzati..

A cura dell’Associazione di Promozione Sociale VISHWA NIRMALA DHARMA – SAHAJA YOGA 4 La gente di lato destro ha una personalità iperattiva.. Persone del genere mangiano

Quelle persone che vivono in troppa oscurità, o nel passato, o in maniera subdola, o sempre nascosti, che sono introversi, per dirla in breve, quelli che passano la loro

In questo caso il corrispondente sistema non-omogeneo ha soluzione unica per qualsiasi valore di a... In caso affermativo

In attesa di tempi migliori, ci auguriamo che anche questo servizio possa ripartire, a supporto dei minori e delle famiglie del territorio. Al momento, a seguito delle

 Polipo endocervicale a origine dal terzo superiore della parete anteriore con apice emorragico in quadro di mucosa endocervicale atrofica.