Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-01-2009, 16:31   #1
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
[C]Programmino audio:dente di sega

Ciao a tutti,
ho un esercizio in cui devo generare una forma d'onda a dente di sega inserendo su riga di comando frequenza canle dx, ampiezza dx, frequenza canale sx, ampiezza sx...
Premetto che ho la soluzione, ma non ho idea da dove iniziare. Non ho un buon rapporto con i file audio
Allora le ampiezze sono esrpesse come percentuale rispetto all'ampiezza massima. Già ho difficoltà a capire cosa voglia dire ampiezza massima
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
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
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
Old 16-01-2009, 17:17   #3
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
mh un momento
C'è una cosa che non ho capito però: da quello che hai scritto, mi sembra di aver capito che Lcyclesamples rappresenti il numero di campioni all'interno del periodo, o no??Ma Lcyclesamples non è il numero totale di campioni?? In quanto ho 1/Hz*(campioni/sec)=(campioni)??
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 18:09   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da MinaVagante Guarda i messaggi
mh un momento
C'è una cosa che non ho capito però: da quello che hai scritto, mi sembra di aver capito che Lcyclesamples rappresenti il numero di campioni all'interno del periodo, o no??Ma Lcyclesamples non è il numero totale di campioni?? In quanto ho 1/Hz*(campioni/sec)=(campioni)??
LCyclesSamples dovrebbe essere il numero di campioni necessario per passare da 0 all'ampiezza massima.
44.100/X.

Quando X vale 1, significa che ci mettero' 44.100 campioni (1 secondo)
quando X vale 2, singnifica che ci mettero' 22.050 campioni (1/2 secondo)
Quando X vale 4, ci mettero' 11.025 campioni. (1/4 secondo)

quindi X, parametro di ingresso e' la frequenza, e tanto piu' sara' altra tanto piu' acuto sara' il segnale e quindi tanto piu' ripido sara' il segnale a dente di sega.
E LCyclesSamples e' la distanza tra 2 picchi analoghi del segnale, ovvero la lunghezza d'onda.
__________________
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
Old 16-01-2009, 18:34   #5
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
Ah ok, quindi dovrebbero essere i campioni a semiperiodo.
Non ho capito il perchè però: 44.100 non è la frequenza di campionamento del segnale audio?? Nel senso: se io dovessi copiare un file audio in un nuovo file, allora devo campionarlo con una frequenza pari a 44.100 per non perdere informazioni. Ma qui cosa centra??Non ho mica un segnale da campionare

Ultima modifica di MinaVagante : 16-01-2009 alle 18:41.
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2009, 21:33   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
44.100Hz e' una delle frequenze di campionamento, forse la piu' comune.
Quando devi riprodurre un suono campionato a 44.100Hz dovrai farlo di nuovo a 44.100Hz.
In fase di riproduzione e' in pratica quanti comandi al secondo darai alla membrana.
In fase di campionamento e' quanti segnali al secondo leggerai dal microfono.

Comunque e' errato dire che a 44.100Hz non si perdono informazioni.
Si perdono informazioni che sono non udibili dall'orecchio umano, oppure non si degrada il segnale audio piu' di quanto lo fosse prima, quando ascoltato da un orecchio umano.
__________________
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
Old 17-01-2009, 08:10   #7
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
si si in quel senso si perdono informazioni grazie
Quello che non capisco è perchè devo utilizzare 44.100 se non ho campionato nessun suono, nel senso, avrei potuto usare un'altra frequenza??? Il campionamento non lo si usa quando è già presente un suono e ad esempio voglio riprodurlo,ma qui devo crearlo io del tutto, non so se sono riusctio a esporre il mio dubbio. Posto la seconda parte del programma e approfitto della tua disponibilità e conoscenza Intanto grazie
seconda parte
Codice:
Lcounter=-Rcounter=1;
          for(i=0;i<wave.numofstereosamples;i++)
          {     //Canale sinistro
                if(i>Lcounter*Lcyclesamples)
               {   Lampl=-Lmaxampl;
                    SAMPLE(wave,left,i)=Lampl;
                    Lcounter++;
               }
               else
               {   Lampl+=Lstep;
                    SAMPLE(wave,left,i)=Lampl;
                }
                ....
           }
Analogamente il canale di destra. Numstereosamples sono i campioni del file che devo creare. In questo for non riesco a capire molto
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2009, 09:19   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
44.100Hz e' la massima frequenza di campionamento/riproduzione su molte delle nostre schede sonore, ed e' stata scelta da questo esempio perche' praticamente tutte le schede sonore la posseggono.
Essendo la massima sara' quella che dara' la resa sonora migliore.

Quello loop serve proprio per decidere, ad ogni istante, qual e' la posizione della membrana.
numofstereosamples e' la lunghezza dell'intero campione sonoro, quindi parametro relazionato con il tempo totale di esecuzione
Cosa c'e' dentro l'if serve per fare l'operazione di modulo per azzerare di nuovo la posizione della membrana, ovvero ritornare a 0 con il valore del campione da spedire alla scheda sonora.
Non e' il massimo della chiarezza, e poteva essere scritto un po' meglio.

Codice:
          int modarr=0;
          for(i=0;i<wave.numofstereosamples;i++,modarr++)
          {    
               //Canale sinistro
               if(modarr == Lcyclesamples)
               {   
                    modarr=0;
                    Lampl=0;         // Qui riporto la membrana in posizione di riposo
               }
               else
               {                    
                    Lampl+=Lstep; // Qui sposto la membrana di un pochino
               }
               SAMPLE(wave,left,i)=Lampl;

               ....
           }
__________________
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
Old 17-01-2009, 09:34   #9
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
dal tuo chiarissimo, ma nell'esempio che ti ho riportato non capisco la condizione dell'if, che da quello che ho capito,è la condizione che fa ritornare a zero il segnale doipo aver raggiunto il massimo no?
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2009, 09:45   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da MinaVagante Guarda i messaggi
dal tuo chiarissimo, ma nell'esempio che ti ho riportato non capisco la condizione dell'if, che da quello che ho capito,è la condizione che fa ritornare a zero il segnale doipo aver raggiunto il massimo no?
In realta' fa ritornare a 0 il campione ogni volta che il contatore totale dei samples riprodotti finora e' pari alla prossimo multiplo di Lcyclesamples, ovvero la lunghezza d'onda
(per questo puo' essere riscritto piu' chiaramente, dato che a noi non interessa sapere quante volte e' stata riprodotto il dente di sega, ma e' sufficiente tenere conto di dove siamo arrivati nell'istanza corrente)
__________________
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
Old 17-01-2009, 11:26   #11
MinaVagante
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 351
Ma nel tuo non viene fatta la parte negativa no???
MinaVagante è offline   Rispondi citando il messaggio o parte di esso
Old 17-01-2009, 19:07   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da MinaVagante Guarda i messaggi
Ma nel tuo non viene fatta la parte negativa no???
No, e penso neppure nella sua.
__________________
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
 Rispondi


Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
GTA VI darà un contributo importa...
Xiaomi REDMI Note 17 Series: quattro sma...
Meta valuta 200 dollari al mese per un a...
Microsoft prepara lo spegnimento e il ri...
OpenAI, modelli fuori dal sandbox a magg...
WhatsApp testa Scam Alert su Android: l'...
Nothing OS 5.0 arriva con Android 17: ec...
PS Plus: svelati i giochi "gratis&q...
Gemini Live diventa molto più uti...
GPUThor: una nuova variante dell'attacco...
Sconti sugli sconti oggi su Amazon: ecco...
iPhone Ultra sarà disponibile anc...
Xbox prepara la conversione dei giochi f...
Microsoft dichiara Windows on Arm idoneo...
La storia di Metal Gear torna sulle cons...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v