View Single Post
Old 16-01-2009, 16:50   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Se gia' non l'hai fatto, per prima cosa ti consiglierei di studiare cos'e' una forma d'onda periodica e quali sono le sue caratteristiche, indipdentemente dal fatto che sia un'onda sonora o meno.

Quote:
Originariamente inviato da MinaVagante Guarda i messaggi
Allora le ampiezze sono esrpesse come percentuale rispetto all'ampiezza massima. Già ho difficoltà a capire cosa voglia dire ampiezza massima
Fintantoche la membrana della cassa acustica resta ferma, non produce alcun suono.
Ad ogni istante temporale occorre muovere la membrana della cassa acustica dalla sua posizione di riposo. Questo movimento puo' essere positivo (la membrana esce di fuori) oppure negativo (la membrana rientra dentro).
Per pilotare il movimento occorre sollecitare la cassa con un segnale ad un determinato numero di volt.
Ogni posizione della membrana e' associata ad un ben preciso valore di volt, appunto + o -.
aumentando il volume si incrementa il range di questi volt. In pratica la membrana verra' spostata di piu', e il volume del suono emesso appunto sara' maggiore.

Fissato un determinato volume, vengono automaticamente fissati i volt massimi positivi (e specularmente negativi). possiamo suddividere lo spazio di movimento della membrana in tanti piccoli step.
Nelle applicazioni correnti lo spazio di lavoro e' modellato con un valore a 16 bit (i suoni generati sono tipicamente appunto a 16 bit).
Pertanto 2^16 diverse posizioni della membrana della cassa.
Ovvero, 2^15 positive e 2^15 negative.
Pertanto, qual e' il valore massimo positivo ammissibile? 2^15 -1, ovvero in binario
0111 1111 1111 1111b

Come si calcola 2^15 - 1 in C? (1<<15) -1
Che e' proprio quel valore la'.

Quote:
Vi posto cosa non mi è chiaro nella soluzione (intanto una parte ) :
Codice PHP:
Lcyclesamples=1.0/atoi(argv[1])*44100;
        
Rcyclesamples=1.0/atoi(argv[2])*44100;

        
Lmaxampl=((1<<15)-1)/100.0*atoi(argv[3]);
        
Rmaxampl...                                     .....;

        
Lstep=2*Lmaxampl/Lcyclesamples;
        
Rstep=...                             ....;

        
Lampl=-Lmaxampl;
         
Rampl=...          ; 
intanto questa parte introduttiva: argv[1] frequenza canale sinistro, argv[2]frequenza canale destro, argv[3] ampiezza percenvutale sx....
Allora, la prima istruzione presumo mi dia il numero di campioni per il canale sinistro la seconda analogamente per il destro, giusto???
Terza istruzione e quarta teoricamente dovrei trovare l'ampiezza dei due canali, e ((1<<15)-1) dovrebbe essere l'ampiezza massima ammissibile (che non capisco da dove esca, e soprattutto quel numero coincide con 1*10^15-1???
La quinta e la sesta istruzione proprio non le capisco
Aiuto, grazie a tutti
lo step, per questo dente di sega, e' di quanto occorre spostare la membrana (incrementare l'ampiezza del suono) dalla posizione precedente in ciascuna unita' temporale, per poter raggiungere il massimo desiderato proprio dopo Lcyclesamples, e quindi generare un suono dente di sega alla frequenza voluta.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso