Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Traitement du Signal, FFT, Scilab



  1. #1
    Levia

    Traitement du Signal, FFT, Scilab


    ------

    Bonjour à tous, je suis un petit nouveau sur le forum, Je me présente rapidement, je m'appelle Maxime, j'ai 20ans, je suis en école d'ingé (UTC)
    Je viens ici car j'ai quelques petites questions concernant le traitement du signal, plus particulièrement l'utilisation de la fonction fft de scilab..

    Mon but est de pouvoir voir les différentes fréquences présentent dans un signal échantillonnée à 48kHz.

    Je me suis créé un petit fonction qui charge un fichier contenant les données, et affichant le spectre de fréquence :

    Code:
    function fftnorm(Fech, P)
    
      load('Fichier.dat')   //chargement du fichier de donnée, les points sont dans une variable y
      X=abs(fft(y(1:P)));    //calcul de fft
      f=Fech*(1:((P)/2))/(P);    // création vecteur fréquence
    
      v=size(f, '*');
      plot(f, X(1:v))    //Affichage spectre
      
    endfunction
    Les paramètres Fech et P corresponde aux Fréquences d'échantillonnage et aux nombres de points de la FFT que l'on souhaite.
    Cette petite fonction fonctionne très bien.

    Mon problème est au niveau de la résolution fréquentiel..
    Mon signal à analyser contient 12tons compris entre 40 et 80Hz. Ce qui signifie que la résolution de 1Hz est impérative pour avoir quelque chose de propre.
    Si je lance fftnorm(48000, 48000) j'aurai une résolution de 1Hz par coeff de fourrier.
    Pour les HF, cela ne pose pas de problème, je peux même lancer ma fonction sur bcp moins de points (donc meilleur reso temporelle) et le rendu sera correct
    Mais le problème est sur les BF. En effet je trouve cela étrange que pour voir BF, je sois obligé d'attendre 1secondes de signal pour faire ma FFT ( la résolution temporelle devient donc déplorable, sachant que mon but est de faire du traitement en RT).
    Je pense qu'il est possible de détecter des BF, sans pour autant attendre 1s de signal et donc avoir une mauvaise résolution temporelle.

    La résolution Fréquentielle d'une FFT ne peux pas être inférieur à 1Hz???

    La première idée que j'ai eu est d'extrapoler mes points pour en doubler le nombre...

    Je me retrouve avec 96K pts. L'idée était de lancer ma fonction en lui disant que Fech= 48k de faire la FFT sur 48k pts. Je pensais ainsi avoir le même résultat en utilisant seulement la moitié du signal, mais erreur de ma pars, j'obtiens bien mes 12tons, mais dans l'octave d'en dessous ( entre 20 et 40Hz) et en regardant ma fonction cela est complètement logique...

    J'espère avoir été clair, pour essayé de trouver une réponse à toutes ses questions que je vais me procurer les sources d'un compresseur mp3 ( Bladeenc ) et chercher dans son code source l'endroit ou la FFT est effectué pour comprendre mieux son fonctionnement!

    J'espère n'avoir pas dit trop de bêtise dans ce post

    Merci par avance à toutes les personnes répondant à ce sujet

    Cordialement

    Maxime

    -----

  2. #2
    lou_ibmix_xi

    Re : Traitement du Signal, FFT, Scilab

    En effet je trouve cela étrange que pour voir BF, je sois obligé d'attendre 1secondes de signal pour faire ma FFT
    Tu viens de découvrir la dualité temps-fréquence et le principe d'incertituded de Heisenberg... Comprends bien que pour pouvoir discriminer une fréquence de 1Hz, il faut que tu puisse observé au moins une période de 1Hz, donc 1s de signal minimum...
    La résolution Fréquentielle d'une FFT ne peux pas être inférieur à 1Hz???
    La résolution fréquentielle est Fs / N où Fs est ta fréquence d'échantillonnage et N le nombre de points utilisés pour la FFT. Attention la plupart des algo de FFT sont en 2-radix, donc pour être réellement efficace N doit être une puissance de 2.
    La première idée que j'ai eu est d'extrapoler mes points pour en doubler le nombre...
    Je me retrouve avec 96K pts. L'idée était de lancer ma fonction en lui disant que Fech= 48k de faire la FFT sur 48k pts. Je pensais ainsi avoir le même résultat en utilisant seulement la moitié du signal, mais erreur de ma pars, j'obtiens bien mes 12tons, mais dans l'octave d'en dessous ( entre 20 et 40Hz) et en regardant ma fonction cela est complètement logique...
    C'est normal puisque tu as doublé le nombre de points, mais aussi ta fréquence d'échantillonnage, donc ton rapport Fs/N reste le même. Une autre technique est de faire du zéro-padding: tu gardes tes N points de signal tel que, et tu ajoutes N zéro pour en faire la transformée de Fourier, tu as doublé le nb de points sans toucher à la fréquence d'échantillonnage, mais il n'y a pas de miracle, cela revient à faire une interpollation de ta FFT originale, donc un résultat plus "lisse" mais sans amélioration réelle de ta résolution fréquentielle...
    d'un compresseur mp3 ( Bladeenc ) et chercher dans son code source l'endroit ou la FFT est effectué pour comprendre mieux son fonctionnement!
    Je ne pense pas que ce soit une bonne idée, la FFT n'est qu'une infime partie du processus de compression mp3. En revanche trouve toi un bon bouquin ou un bon site sur le traitement du signal pour que ces notions te soient familières...
    la résolution temporelle devient donc déplorable, sachant que mon but est de faire du traitement en RT
    Je ne sais pas ce que tu appels un traitement temps-réel, d'autant plus que quelque-soit le type de détection, tu auras du mal à descendre en-dessous de la durée du signal à détecter... En revanche, si c'est pour avoir un meilleur compromis résolution temporelle/fréquencielle, tu peux voir si une simple transformée de fourier à court-terme avec recouvrement peut faire l'affaire: en gros tu prends N points, tu fais la FFT, tu avance de N/4 (par exemple) points et tu fais la FFT sur N points et ainsi de suite. Mais cette méthode à aussi ses limites. La vraie solution est de passer sur une analyse multirésolution type transformée en ondelettes.
    Une dernière remarque concernant ton bout de programme, souvent lorsque que l'on travail avec la FFT c'est pour savoir comment se répartisse les puissances sur ton spectre, donc pour que ton calcul est une signification il faut que tu utilises la FFT multipliée points-à-points par son complexe conjugué, et la somme des valeurs de tes pics correspondront alors à la variance (= puissance) dans la bande de fréquence considérée.

  3. #3
    Levia

    Re : Traitement du Signal, FFT, Scilab

    Tu viens de découvrir la dualité temps-fréquence et le principe d'incertituded de Heisenberg... Comprends bien que pour pouvoir discriminer une fréquence de 1Hz, il faut que tu puisse observé au moins une période de 1Hz, donc 1s de signal minimum...
    Je suis d'accord avec cela, mais les fréquences qui m'intéressent sont celle audible par l'oreille humaine ( 20Hz - 20kHz). Ainsi pour détecter la plus petite fréquence (soit 20Hz) il suffit normalement de prendre 50ms du signal. Mais en prenant que 50ms du signal, je ne verrai pas par exemple la fréquence 22Hz ... Car j'aimerais pouvoir détecter les 12tons qui composent une octave.

    La résolution fréquentielle est Fs / N où Fs est ta fréquence d'échantillonnage et N le nombre de points utilisés pour la FFT. Attention la plupart des algo de FFT sont en 2-radix, donc pour être réellement efficace N doit être une puissance de 2.
    Je savais que N devait être une puissance de 2. Mais si cela n'est pas le cas, l'algo devient moins puissant?


    Je ne sais pas ce que tu appels un traitement temps-réel, d'autant plus que quelque-soit le type de détection, tu auras du mal à descendre en-dessous de la durée du signal à détecter... En revanche, si c'est pour avoir un meilleur compromis résolution temporelle/fréquencielle, tu peux voir si une simple transformée de fourier à court-terme avec recouvrement peut faire l'affaire: en gros tu prends N points, tu fais la FFT, tu avance de N/4 (par exemple) points et tu fais la FFT sur N points et ainsi de suite. Mais cette méthode à aussi ses limites. La vraie solution est de passer sur une analyse multirésolution type transformée en ondelettes.
    Ce que j'entends par temps-réel, serait dans un premier temps, par exemple brancher une guitare sur un pc, et lorsque quelqu'un joue, l'ordinateur affiche un sonogramme... Puis dans un second temps appliquer des filtres diverses et variés pour par exemple déplacer toutes les notes d'une octave...
    Sur plusieurs sites, j'ai déjà entendu parler des transformées en ondelettes, je vais essayer d'y jeter un coup d'œil

    Je ne pense pas que ce soit une bonne idée, la FFT n'est qu'une infime partie du processus de compression mp3. En revanche trouve toi un bon bouquin ou un bon site sur le traitement du signal pour que ces notions te soient familières...
    J'ai feuilleté plusieurs livres et sites, mais si tu as les références de très bons ouvrages sur ce sujet je suis preneur, ou quelques sites... ( Sachant que j'ai déjà lu bcp bcp de chose sur internet à ce sujet..)

    Une dernière remarque concernant ton bout de programme, souvent lorsque que l'on travail avec la FFT c'est pour savoir comment se répartisse les puissances sur ton spectre, donc pour que ton calcul est une signification il faut que tu utilises la FFT multipliée points-à-points par son complexe conjugué, et la somme des valeurs de tes pics correspondront alors à la variance (= puissance) dans la bande de fréquence considérée.
    Oui j'avais remarqué qu'il y avait un problème au niveau des amplitudes de mes coeff de fourrier, mais dans un premier temps je me concentrais sur la détection de fréquences, pour comprendre comment cela fonctionne. Mais merci de l'info


    Donc pour conclure, la fréquence la plus basse que je veux détecter est 20Hz... mais par contre je doit être capable de détecter des fréquences du type 22Hz, 24Hz... (les 12tons qui compose une octave)

    voila

    Merci de ta réponse.

    Max

  4. #4
    lou_ibmix_xi

    Re : Traitement du Signal, FFT, Scilab

    Ainsi pour détecter la plus petite fréquence (soit 20Hz) il suffit normalement de prendre 50ms du signal. Mais en prenant que 50ms du signal, je ne verrai pas par exemple la fréquence 22Hz ... Car j'aimerais pouvoir détecter les 12tons qui composent une octave.
    Tu confond la fréquence minimale que tu veux détecter (20Hz) et la discrimination entre deux fréquences (22Hz - 20Hz = 2 Hz), cette dernière est ta finesse d'analyse fréquentielle (ton rapport Fs / N)... Donc si tu veux discrimener 22Hz de 20Hz, tu n'as pas le choix, il te faut 500ms de signal...
    Je savais que N devait être une puissance de 2. Mais si cela n'est pas le cas, l'algo devient moins puissant?
    En fait c'est même pire, si je me rappelle bien l'algorithme de FFT (2-radix qui est le plus commun) ne marche que pour des puissances de 2, la manière simple de faire lorsque l'in ne travaille pas avec des puissances de 2 et de complété par des zéros jusqu'à la puissance de 2 immédiatement supérieure, et c'est certainement ce que fait scilab.
    affiche un sonogramme
    Les sonogramme audio ont une résolution BF de l'ordre de 1 Hz? celà me semble beaucoup mais pourquoi pas, en revanche, à ma conaissance ces sonogrammes sont très souvent fait avec des FFT à court terme et recouvrement, au moins pour avoir une évolution plus "continue"...

    Si ton but est vraiment accès audio, il est vrai qu'il peut-être intéresant de tenir compte des caractéristiques "logarithmiques" (en fréquence et en amplitude) de l'oreille humaine, alros comprendre comment marche le mp3 n'est finalement pas une si mauvaise idée, mais je ne suis pas sûr que se jetter dans le code est vraiment la manière la plus simple de comprendre les principes comme l'échelle des bark. Je n'ai pas vraiment de bon site ou de bon livre en tête désolé, i pour le traitement du signal en général, ni pour la psychoacoustique.
    Code:
    les 12tons qui compose une octave
    Je ne rappelle plus comment se répartissent les tons dans une octave, mais je me rappelle que l'octave correspond à un doublement de fréquence: 440Hz -> 880Hz -> 1760Hz -> 3520Hz... sont tous des La, ceci rends bien compte de la sensibilité logarithmique de l'oreille humaine.

  5. A voir en vidéo sur Futura
  6. #5
    Levia

    Re : Traitement du Signal, FFT, Scilab

    bonjour,

    Merci beaucoup de tes réponses.

    Bon pour mes recherches, je me suis penché sur les transformées en Ondelettes... Il est vrai que sur le papier ça a l'air d'être exactement se qu'il me faut, car (si j'ai bien compris) la résolution fréquentiel augmente quand les fréquences diminuent et la réso temporelle augmente quand les fréquences augmentent.. Cependant l'implémentation d'un tel procéder m'a l'air un peu au dessus de mes capacités...

    Je pense que dans un premier temps, les transfo de fourier pourront peut-être suffirent..

    Parcontre je me suis beaucoup penché sur la compression mp3 et j'ai découvert quelques petites choses pouvant peut être me servir
    En effet après la lecture de nombreuse notes sur les compression mp3, une chose ressort : La transformée En Cosinus Discrète Modifiée (TCDM ou MDCT en anglais..)
    Que cela ne tienne, je fais des recherches sur cela.
    Voici se que j'ai compris:

    - La transfo en Cosinus Discrète (DCT en anglais) est une transfo très proche de la Transfo discrète de Fourier (DFT en anglais)

    - la différence réside dans le fait que le noyau de projection est un cosinus (pour le DCT)==> Donc les coeff de sortie sont réels. Contrairement à la DFT ou c'est une expo complexe ==> Coeffs complexes.

    -Apparemment il y a possibilité d'exprimer une DCT en fonction d'une DFT...

    -Mais pour le MP3, c'est un DCT Modifiée qu'il faut utiliser : la MDCT...

    C'est ici que je suis un peu perdu... je ne trouve pas tant de chose sur la MDCT...
    Qu'est ce que la MDCT fait que la FFT ne fait pas? Quelles sont les différences à part que leurs coeffs appartiennent à R ou C?
    Est ce que la MDCT peux me servir dans se que je veux faire?
    Si quelqu'un a trouver un algo décrivant la MDCT je suis preneur, car cela est encore flou pour moi...


    Je poursuis mes recherches

    Cordialement,


    Boucher Maxime

Discussions similaires

  1. Traitement d'images avec scilab
    Par samzzz dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 15/09/2010, 15h11
  2. traitement de signal
    Par spray_kim dans le forum Électronique
    Réponses: 2
    Dernier message: 25/10/2008, 22h57
  3. Comment acquerire un signal USB sur SCILAB
    Par sios dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 27/02/2008, 11h42
  4. comment obtenir le signal un fichier audio sur scilab
    Par aminespopo dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 31/01/2008, 17h08
  5. FFT et fréquence exacte d'un signal
    Par acx01b dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 09/10/2007, 02h03
Découvrez nos comparatifs produits sur l'informatique et les technologies.