IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Signal Discussion :

Signal audio : passage dB --> amplitude


Sujet :

Signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Par défaut Signal audio : passage dB --> amplitude
    Bonjour,

    Je suis en train de réaliser un programme sous Matlab (R2009b) dans le domaine de l'audio. Je commence par charger mon fichier audio. Ensuite, je le convertis en dB afin de réaliser le traitement que je désire. Pour finir, je souhaite l'enregistrer pour pouvoir le conserver et l'écouter.

    Voici un extrait du code que j'ai développé :
    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
    32
    33
    34
     
    [audio,Fs,B] = wavread('G1.wav');
    % audio : contient les données du fichier
    % FS : fréquence d'échantillonnage des signaux
    % B : nombre de bits considérés pour la quantification des signaux
     
    [N,p] = size(audio);
    % N : nombre d'échantillons
    % p : nombre de pistes (1 : mono, 2 : stéréo)
     
    % Conversion de mon signal audio en dB
    audio_dB = zeros(N,2);
    for i = 1:N
        if audio(i,1) == 0
            audio_dB(i,1) = -90;
        else
            audio_dB(i,1) = 20*log10(abs(audio(i,1)));
        end;
     
        if p ==2
            if audio(i,2) == 0
                audio_dB(i,2) = -90;
            else
                audio_dB(i,2) = 20*log10(abs(audio(i,2)));
            end;
        end;
    end;
     
    %**********************************************************************%
    %                 Traitement sur le signal converti en dB              %
    % (j'ai appelé audio1 le signal sur lequel j'effectue les traitements) %
    %**********************************************************************%
     
    wavwrite(audio1,Fs,B,'test.wav');
    Mon fichier audio1 est en dB, j'ai donc l'exception suivante :
    Warning: Data clipped during write to file:test.wav 
    > In wavwrite>PCM_Quantize at 293
      In wavwrite>write_wavedat at 309
      In wavwrite at 138
      In TestFunctions at 166
    En cherchant un peu sur le net, j'ai vu comment régler ce souci si j'ai un signal en amplitude (compris entre -1 et 1, comme le sont habituellement les signaux audios).

    J'ai essayé de remettre mon signal en amplitude pour l'enregistrer en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for j = 1:N
        file(j) = 10^(audio1(j)/20);
    end;
    Et ensuite j'appliquais la fonction wavwrite sur file. Mais en faisant cela, je ne récupère pas réellement mon signal puisque toutes les valeurs sont alors comprises en 0 et 1 et non pas entre -1 et 1.

    Quelqu'un saurait-il comment procéder pour réussir à récupérer mon fichier audio traité avec des valeurs comprises entre -1 et 1 et qu'on puisse alors l'écouter ?

    Si mes explications ne sont pas claires, n'hésitez pas à poser des questions.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Il suffit de
    1. ramener les valeurs du signal dans l'intervalle [0 1] (voir la : Comment normaliser les valeurs d'une matrice dans l'intervalle [0 1] ?)
    2. multiplier par 2 toutes les valeurs pour passer dans l'intervalle [0 2]
    3. retrancher 1 pour terminer dans l'intervalle [-1 1]

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Par défaut
    D'accord, je vais essayer cela et je vous tiens au courant.

    Merci pour la réponse rapide !

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Par défaut
    Alors j'ai bien essayé ce que vous m'avez indiqué (cf code ci-dessous où la variable audio1 est ma variable traitée en dB) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        audiotest = zeros(N,1);
        for i = 1 : N
            audiotest(i) = 10^(audio1(i)/20);
        end;
        audiotest = audiotest - min(audiotest(:));
        audiotest = audiotest/max(audiotest(:));
        for i= 1 : N
            audiotest(i) = audiotest(i)*2 - 1;
        end
        wavwrite(audiotest,Fs,B,'test.wav');
    Malheureusement cela ne fonctionne pas car mon signal audio n'est alors plus symétrique comme le montre les images (Signal_original.jpg montre mon signal audio avant traitement et Signal_test.jpg montre mon signal audiotest reconstruit suivant votre méthode).

    J'aurais bien effectué mon traitement en linéaire, mais les calculs sont très lourds et je dois ensuite implémenter mon algorithme dans un micro-contrôleur, d'où l'utilisation des dB pour des calculs plus simples.

    Auriez-vous une idée pour que mon signal redevienne symétrique par rapport à 0 ?


    [Edit] J'ai finalement trouvé une solution plus simple en récupérant le signe de mon signal d'origine. Je cherchais trop compliqué...
    Encore merci pour l'aide.
    Images attachées Images attachées   

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Que représente l'amplitude d'un signal audio wav ?
    Par dzdesperado1 dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/04/2015, 15h19
  2. Réponses: 6
    Dernier message: 23/04/2010, 09h58
  3. Récuperer le signal audio d'un fichier .wav
    Par vienin dans le forum Multimédia
    Réponses: 2
    Dernier message: 11/10/2005, 16h25
  4. [TMS320C6416] FFT et IFFT sur un signal audio...
    Par 0x4e84 dans le forum Autres architectures
    Réponses: 1
    Dernier message: 18/04/2005, 20h21
  5. Réponses: 2
    Dernier message: 08/11/2004, 22h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo