 |
Primi programmi |
|
Nota sui compilatori
Nota su octave
Nota su matlab
creazione di un file.cdr in C
Il file creasuono.c è un semplice
programma in C che crea un file contenente 1 secondo di suono con frequenza di
campionamento di 44100HZ, stereo, 16 bit, big-endian.
Il suono è una sinusoide di frequenza di 400Hz e ampiezza massima (32766).
Per compilarlo si usa il comando:
cc creasuono.c -o creasuono -lm
Il flag -lm serve ad accedere alla libreria /usr/lib/libm.a che contiene le funzioni
matematiche elementari, come sin(x).
Una volta compilato, il comando
creasuono sinus400.cdr
crea il file sinus400.cdr, che si può ascoltare con
playcdr sinus400.cdr ( su alcuni sistemi semplicemente: play sinus400.cdr ).
creazione di un file.cdr in fortran
Il file creasuono.f90 è un semplice
programma in fortran90 che crea un file contenente 1 secondo di suono con frequenza di
campionamento di 44100HZ, stereo, 16 bit, big-endian.
Il suono è una sinusoide di frequenza di 400Hz e ampiezza massima (32766).
Per compilarlo si usa il comando:
f95 creasuono.f90 -o creasuono
Una volta compilato, il comando
creasuono sinus400.cdr
crea il file sinus400.cdr, che si può ascoltare con
playcdr sinus400.cdr ( su alcuni sistemi semplicemente: play sinus400.cdr ).
Si noti che le variabili ii, iids,iisn sono interi a 2 BYTES, e si noti
le chiamate all routine MVBITS che scambia di posto i primi 8 bit con
i secondi 8 bit per passare da little-endian a big-endian.
Il file è stato aperto in modo UNFORMATTED con accesso DIRECT dichiarando
i record di lunghezza RECL=4 (bytes).
L'istruzione di scrittura deve indicare quale record si vuole scrivere (rec=i),
e in effetti si devono scrivere ogni volta non più di 4 bytes.
creazione di un file.cdr in octave
octave:1> x=[0:1/44100:1];
octave:2> y=sin(x*2*pi*400);
octave:3> n=size(y)(2)
n = 44101
octave:4> myfile=fopen("sinus400.cdr","w")
myfile = 3
octave:5> for i=1:n
> fwrite(myfile,int16(32766*y(i)),"int16","ieee-be");
> fwrite(myfile,int16(32766*y(i)),"int16","ieee-be");
> end
octave:6> fclose(myfile)
ans = 0
octave:7>
Abbiamo qui un
filmato (20MB) dell'intera operazione.
Purtroppo risulta che le chiamate di fwrite in matlab e ancor più in octave sono terribilmente inefficienti
e richiedono tempi lunghissimi, per cui appena si arriva a un minuto di musica la scrittura richiede decine di minuti.
Una soluzione allora puo' essere quella di salvare il suono in uscita da matlab o octave nel fomato ascii
ed usare un programma di conversione matconv.c separato per creare il file.cdr.
L'esempio di prima diventa allora più semplice ma in due passi:
octave:1> x=[0:1/44100:1];
octave:2> y=sin(x*2*pi*400)*32766;
octave:3> c(:,1)=y';
octave:4> c(:,2)=y';
octave:5> save('-ascii','out.octave','c');
octave:6> exit;
steffe@wallis:$ ./matconv out.octave out.cdr
 |
Laboratorio Sperimentale di Matematica Computazionale - parte II
Sergio Steffè - AA 2015/2016 - PISA |
|