Bonjour,
Je veux enregistrer un son en c dans un fichier.wav cependant la qualité du son ainsi enregistré est mauvais. Ceci n'est pas du à un problème de micro puisque sous audacity ça enregistre correctement.
L'entête de mon .wav parait correct :
Puisque celui de audacity est pour un autre enregistrement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 riff: 'RIFF' riff length: 184356 wave: 'WAVE' fmt: 'fmt ' fmt length: 16 format: 1 channels: 2 sample rate: 44100 bytes/second: 176400 bytes/sample: 4 bits/sample: 16 data: 'data' data length: 184320
Les informations que j'enregistre sont du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 riff: 'RIFF' riff length: 328324 wave: 'WAVE' fmt: 'fmt ' fmt length: 16 format: 1 channels: 2 sample rate: 44100 bytes/second: 176400 bytes/sample: 4 bits/sample: 16 data: 'data' data length: 328288
alors que celle d'audacity sont de type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part -373 320 -87 365 -1295 1393
Voici maintenant mon code, je ne vous présente pas la création de l'entête puisqu'elle semble correcte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1 156 -1 109 0 144 0
Configuration des micros
Récupération des données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 result = snd_pcm_open(&capture_handle, device_name, SND_PCM_STREAM_CAPTURE, 0); if (result < 0) EXIT_ON_SOUND_ERROR(result, " Cannot open audio device %s.\n\t You can give it as first argument. Default is 'hw:0,0'.", device_name); result = snd_pcm_hw_params_malloc(&hw_params); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot allocate hardware parameter structure"); result = snd_pcm_hw_params_any(capture_handle, hw_params); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot initialize hardware parameter structure"); result = snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); //changer normalement "non ..." if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set access type"); result = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set sample format"); result = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &sample_rate, &dir); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set sample rate"); result = snd_pcm_hw_params_set_channels(capture_handle, hw_params, 2); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set channel count"); result = snd_pcm_hw_params(capture_handle, hw_params); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot set parameters"); snd_pcm_hw_params_free(hw_params); result = snd_pcm_prepare(capture_handle); if (result < 0) EXIT_ON_SOUND_ERROR(result, "cannot prepare audio interface for use");
Enregistrement des données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int16_t buf[BUFFER_SIZE*2] = { 0 }; // A verifier pourquoi il faut qu'il soit static, sinon seg fault. Ca interdit le multithreading !!! int16_t org[BUFFER_SIZE]= { 0 }, ord[BUFFER_SIZE]={0}; if ((result = snd_pcm_readi(sound->capture_handle, buf, BUFFER_SIZE)) != BUFFER_SIZE) { if (result == -EPIPE) { snd_pcm_recover(sound->capture_handle, result, 0); PRINT_WARNING("Miss sound sample"); } else EXIT_ON_SOUND_ERROR(result, "read from audio interface '%s' failed %d\n", sound->device_name, result); }
EDIT : En fait le changement de type de valeurs peut aussi s'expliquer par un éloignement différent entre moi et les micros...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 for(j=0; j< BUFFER_SIZE; j++) { spectrum_l[j] = (float) buf[j * 2] / (float)(1 << 15); spectrum_r[j] = (float) buf[j * 2 + 1] / (float)(1 << 15) ; org[j] = buf[j*2]; //parce que je veux enregistrer le canal 1 ("oreille gauche") de manière séparé au canal 2 ord[j] = buf[j*2 + 1]; // idem } if((fpr !=NULL)&&(fpr !=NULL)) { /*Il faut tout d'abord modifier l'entête : en effet il y a des données en plus donc la taille du fichier change */ fseek(fpr, 4, SEEK_SET); fseek(fpl, 4, SEEK_SET); val = 44 + BUFFER_SIZE*(sound->nbIt)*2 -8; fwrite(&val, sizeof(int32_t), 1, fpr); fwrite(&val, sizeof(int32_t), 1, fpl); /*Il y a auussi le nombre de données qui change*/ fseek(fpr, 40, SEEK_SET); fseek(fpl, 40, SEEK_SET); val= (sound->nbIt)*BUFFER_SIZE*2;//nbCan*nbEch*bitParEch/2 fwrite(&val, sizeof(int32_t), 1, fpr); fwrite(&val, sizeof(int32_t), 1, fpl); /*Finalement, on ajoute une ligne en fin de fichier avec les données*/ fseek(fpr, 0, SEEK_END); fseek(fpl, 0, SEEK_END); fwrite(ord, (BUFFER_SIZE)*sizeof(int16_t), 1, fpr); fwrite(org, (BUFFER_SIZE)*sizeof(int16_t), 1, fpl); }else printf("erreur fp / fr null quand on veut remplir\n"); }
Voyez vous une erreur qui pourrait expliquer mon problème ?
Merci,
Oriane
Partager