|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
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;
}
Grazie mille. |
|
|
|
|
|
#2 |
|
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. |
|
|
|
|
|
#3 |
|
Senior Member
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.
|
|
|
|
|
|
#4 |
|
Member
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 |
|
|
|
|
|
#5 |
|
Senior Member
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.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 87
|
In sostanza come mi consigliereste di proseguire ?
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
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). |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
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 15:24. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
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. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
La mia era una domanda retorica... chiudiamola qui.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:36.




















