Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-05-2014, 16:40   #1
djremix
Member
 
L'Avatar di djremix
 
Iscritto dal: Jan 2008
Messaggi: 87
Frequenza suono prodotto nel file wav [c]

Buonasera a tutti,

sono alle prese con un progetto. Ho recuperato e messo assieme codice per la creazione di un file wav con determinate caratteristiche e per la lettura delle caratteristiche generali di un file wav. Il tutto è in linguaggio C.

Il problema è che utilizzando questo codice:

Codice:
#include <stdio.h>
#include <stdint.h>


struct T_RIFF {
       uint8_t ChunkID[4];
       uint32_t ChunkSize;
       uint8_t Format[4];
};


struct T_fmt {
       uint8_t Subchunk1ID[4];
       uint32_t Subchunk1Size;
       uint16_t AudioFormat;
       uint16_t NumChannels;
       uint32_t SampleRate;
       uint32_t ByteRate;
       uint16_t BlockAlign;
       uint16_t BitsPerSample;
};
struct T_data_nosamples {
       uint8_t Subchunk2ID[4];
       uint32_t Subchunk2Size;
};
struct T_data {
       uint8_t Subchunk2ID[4];
       uint32_t Subchunk2Size;
};
struct T_WAVE {
       struct T_RIFF RIFFheader;
       struct T_fmt fmtheader;
       struct T_data dataheader;
};


main() {
       struct T_WAVE WAVE;
       printf("Inserisci il percorso del file: ");
       char percorso[50];
       scanf("%s",percorso);
       FILE* stream = fopen(percorso,"r");
       if (stream==NULL)
          printf ("Il file non esiste! \n");
       else {
          
           fread(&WAVE,1,44,stream);
           uint32_t Samplesize, Sample;
           printf ("Grandezza blocco: %d byte\n\n",WAVE.RIFFheader.ChunkSize);
           printf ("Grandezza blocco fmt: %d byte\n",WAVE.fmtheader.Subchunk1Size);
           printf ("Formato audio: %d\n",WAVE.fmtheader.AudioFormat);
           printf ("Numero di canali: %d\n",WAVE.fmtheader.NumChannels);
           printf ("Frequenza di campionamento: %d Hz\n",WAVE.fmtheader.SampleRate);
           printf ("Frequenza di byte: %d byte/s\n",WAVE.fmtheader.ByteRate);
           printf ("Allineamento blocco: %d\n",WAVE.fmtheader.BlockAlign);
           printf ("Bits per campione: %d\n\n",WAVE.fmtheader.BitsPerSample);
           printf ("Grandezza blocco data: %d byte\n\n",WAVE.dataheader.Subchunk2Size);
           float durata =  (float) WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
           int durataAppr = WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
           printf ("Durata in secondi: %d s\n",durataAppr);
           uint32_t SampleSize = WAVE.fmtheader.BitsPerSample / 8;
           uint32_t numcampioni = (uint32_t) durata * WAVE.fmtheader.SampleRate;
           //processa16bit(WAVE.fmtheader.NumChannels,SampleSize,numcampioni,stream);
           fclose(stream);
       } 
       
       system("pause");
       return 0;
}
leggo le caratteristiche generali del file wav ma non la frequenza del suono contenuto (che dovrebbe essere nella parte "dati" del file). Come si potrebbe fare ?

Grazie mille.
djremix è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2014, 17:29   #2
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Parlare di singola frequenza per un file audio non ha molto senso a meno che non sia una sinusoide pura.
Premesso questo, se vuoi capire il contenuto in frequenza della traccia audio devi usare la trasformata di fourier in particolare l'algoritmo FFT, esistono molte librerie per il suo calcolo, io ho sempre usato FFTW.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 12:22   #3
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
E' più propriamente una questione di rappresentazione, un suono si può rappresentare in vari modi, i file wave lo rappresentano come l'intensità della pressione sonora in funzione del tempo, quindi bisogna utilizzare una trasformata per passare alla rappresentazione della frequenza, altri formati possono esprimere il suono direttamente in frequenza (come mp3), ma generalmente fanno delle trasformazioni aggiuntive.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 12:38   #4
djremix
Member
 
L'Avatar di djremix
 
Iscritto dal: Jan 2008
Messaggi: 87
Buonasera e grazie mille per le vostre risposte.

Si, il file audio in oggetto che a me serve deve avere una sinusoide pura. Lo stesso file viene creato da C. Anche in questo caso consigliate l'uso di tali librerie ?

Saluti e grazie
djremix è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 13:19   #5
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Se è come dici risulterebbe molto più economico rilevare i passaggi per lo zero della sinusoide e ricavarne la frequenza.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 14:11   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
sarebbe anche sbagliato, perché stai lavorando con un segnale campionato.
E per quale motivo?
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 17:38   #7
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
se il segnale e' ideale, il campionamento e' ideale (no jitter) e la precisione e' infinita, funziona tutto a meraviglia. ma prova a immaginare il minimo rumore di quantizzazione in presenza di particolari fasi di campionamento (ovvero, quando ti trovi a campionare vicino al passaggio per lo zero)...
Se è questo che ti preoccupa basta definire delle soglie...
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 20:42   #8
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
è molto più semplice a dirsi che a farsi, dato che dipenderanno dalla fase dell'istante di campionamento...
Non ho capito cosa intendi, puoi spiegarti meglio?
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2014, 21:38   #9
djremix
Member
 
L'Avatar di djremix
 
Iscritto dal: Jan 2008
Messaggi: 87
In sostanza come mi consigliereste di proseguire ?
djremix è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2014, 08:47   #10
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
prova a contare i cambi di segno su questi due segnali (rappresentano la stessa sinusoide campionata con due fasi diverse, stesso tempo di campionamento e stessa durata di osservazione):

Codice:
-0,309016994374947	0,156434465040231
0,809016994374948	0,987688340595138
0,809016994374948	0,453990499739547
-0,309016994374947	-0,707106781186548
-1	                -0,891006524188368
-0,309016994374948	0,156434465040231
0,809016994374947	0,987688340595138
0,809016994374948	0,453990499739546
-0,309016994374947	-0,707106781186548
-1	                -0,891006524188368
-0,309016994374948	0,156434465040231
0,809016994374947	0,987688340595138
0,809016994374948	0,453990499739547
-0,309016994374945	-0,707106781186548
sono 6 sul primo segnale e 5 sul secondo. usando il tuo metodo diresti che la frequenza del primo tono è superiore di quella del secondo...
Certo, se vogliamo creare di proposito algoritmi spazzatura possiamo sbagliare senza difficoltà. Il calcolo non deve basarsi su "quanti" cambi di segno avvengono, ma quanto tempo passa tra un cambio di segno e il successivo.
La FFT va sempre bene, se non ci pesa consumare milioni di cicli macchina per analizzare una sinusoide non ho nulla in contrario (ma anche se ci pesa e lo facciamo lo stesso non mi importa più di tanto, ognuno sa il fatto suo).
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2014, 14:21   #11
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
è la stessa cosa. se vuoi ti creo un altro esempio in cui il "tempo" tra i cambi di segno cambia data una sinusoide con la stessa frequenza ma che viene campionato con due diverse fasi (o meglio, ancora più facilmente, due sinusoidi a frequenza diversa ma che cambiano segno con la stessa cadenza. ma dato che c'avrei anche un lavoro, potresti farlo tu come contro-esempio per capire che anche così l'algoritmo è sbagliato.
Gli algoritmi possono essere progettati anche in base alla conoscenza che si ha dei dati, certo tu puoi creare dei dati appositamente scelti per far fallire un determinato algoritmo, ma in questo caso sei solo tu ad avere il problema, io posso dire di aver utilizzato con soddisfazione l'algoritmo che proposto.

PS. mi sembra scontato che il numero di cicli macchina dipende dalla quantità di dati da elaborare, più ce ne sono più aumenta il divario tra le risorse consumate dai due algoritmi.

Ultima modifica di Daniels118 : 02-06-2014 alle 14:24.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2014, 19:10   #12
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
ehm, no. un algoritmo deve essere generico. se funziona solamente per un sottoinsieme dei dati e' semplicemente sbagliato. o meglio, e' poco utile.

una FFT viene fatta su un numero fisso di campioni su cui il segnale si presuppone stazionario. e' ragionevole ammettere che con un segnale campionato a 44.1 khz 1024 punti sono piu' che sufficienti. in questo caso non ho idea del numero preciso di cicli richiesto da FFTW, ma su un DSP vettoriale si puo' arrivare a 6000 cicli di clock per fare una FFT a 1024 punti... tenendomi largo quindi FFTW puo' impiegare 60000 cicli di clock... che in genere e' molto di meno del necessario per far girare una printf().
Vorrai dire "generalizzato", e comunque generalizzare non è sempre un vantaggio, quello che tu chiami "sbagliato" altri lo chiamano "ottimizzato".
Il fatto che si scelga di elaborare un blocco di 1024 campioni non significa che bisogna fermarsi al primo blocco, e comunque resta di fatto che la complessità computazionale della FFT è maggiore, indipendentemente dalla quantità di campioni... comunque possiamo stare a discutere in eterno su questi problemi, ma non ne vedo la necessità, come ho già detto a me sta benissimo anche l'uso della FFT.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2014, 22:16   #13
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La mia era una domanda retorica... chiudiamola qui.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
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: 16:23.


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