Modérateurs: Modération Forum Installations, Modération Forum DIY, Le Bureau de l’Association HCFR • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 6 invités

DSPiy : logiciels et algorithmes

Message » 06 Déc 2014 12:35

en lisant
for (int i = 0; i < fftn / 2; i++)
{
fftr[i].magnitude = 20.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))));
fftr[i].phase = Math.Atan2(xim[i], xre[i]) * 18 / Math.PI;
}

au jeu des 7 différences :
pour la magnitude c'est 20.0 *
et pour phase 18 /
Le test avec 18.0 s'impose

si tu peux publier la table de valeurs de fftr xre et xim, je peux faire le calcul dans excel et tracer les deux courbes pour comparer.
Dernière édition par alkasar le 06 Déc 2014 16:05, édité 1 fois.
alkasar
 
Messages: 11517
Inscription Forum: 29 Nov 2005 22:47
Localisation: Neuf deux
  • offline

Message » 06 Déc 2014 12:36

Au fait, si tu veux lever l'ambiguité, il te faut connaitre le quadrant dans lequel se situe l'angle de phase.
- quadrant 1: réel positif, Im positif
- quadrant 2: réel négatif, Im positif
- quadrant 3: réel négatif, Im négatif.
- quadrant 4: réel positif, Im négatif
J-C.B
 
Messages: 6875
Inscription Forum: 19 Juil 2009 12:18
Localisation: Haute Normandie
  • offline

Message » 06 Déc 2014 13:36

Merci à tous.
Pas beaucoup de temps aujourd'hui, soleil et décos de Noël a installer dehors.

Je mettrais le code complet.

Peut être une autre piste :
Le calcul de FFT doit se faire sur un multiple d'exposants 2. J'ai donc réduit l'impulse a la valeur en dessous.
Par exemple sur 10000 taps, je ne prend que les 8192 (de mémoire) premiers taps.
Crée une imprécision au niveau de la magnitude mais acceptable vu le but de cet affichage.

Dans un futur, je compte bien me remettre sérieusement à l'affichage des courbes avec sans doute une autre lib de graphes.
Mais pour le moment trop de boulot avec l'ADAU1452 et les soirées ne rallonges pas.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 06 Déc 2014 15:37

thierryvalk a écrit:Peut être une autre piste :
Le calcul de FFT doit se faire sur un multiple d'exposants 2. J'ai donc réduit l'impulse a la valeur en dessous.
Par exemple sur 10000 taps, je ne prend que les 8192 (de mémoire) premiers taps.
Crée une imprécision au niveau de la magnitude mais acceptable vu le but de cet affichage.

A part un cas patologique, ca ne devrait pas faire une grosse différence (sauf un peu dans les basses).

Note : une lib de FFT moderne doit pouvoir faire le calcul avec n'importe quelle longeur en entré.
Et NON, elle ne sera pas forcement beaucoup plus rapide si la longueur est une puissance de 2.
tcli
 
Messages: 4075
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 06 Déc 2014 17:56

Test avec 18.0 et autres, pas de changements.
Voici le code.
C’est un « truc » qui trainait sur mon PC, pas de moi, mais que j’avais utilisé sur un microcontrôleur il y bien longtemps.
La première partie est principalement l’extraction des données et mise en double

Il y a même des Goto pour Alain.

Code: Tout sélectionner
 private fresponse[] FFTDb(int nimp)//(ref double[] x)
        {   
            //calcul adresse dm0
           uint adr=0;
           if (nimp == 1)
           {
               adr = adrtaps1; pimpulse = ntaps1;
           }
           if (nimp == 2)
           {
               adr = adrtaps2; pimpulse = ntaps2;
           }

           adr = (uint)((adr + pimpulse) * 4);
           adr = adr -1;

           //taille
           if (pimpulse > 8192) { pimpulse = 8192; goto impok; }
           if (pimpulse > 4096) { pimpulse = 4096; goto impok; }
           if (pimpulse > 2048) { pimpulse = 2048; goto impok; }
           if (pimpulse > 1024) { pimpulse = 1024; goto impok; }
           if (pimpulse > 512) { pimpulse = 1024; goto impok; }
           if (pimpulse > 128) { pimpulse = 1024; goto impok; }
           if (pimpulse > 64) { pimpulse = 64; goto impok; }
 impok:         

            fftn = pimpulse;
            fftnu = (int)(Math.Log(fftn) / Math.Log(2));
            int n2 = fftn / 2;
            int nu1 = fftnu - 1;
            double[] xre = new double[fftn];
            double[] xim = new double[fftn];
            //double[] decibel = new double[n2];           
            fresponse[] fftr = new fresponse[n2];
            double tr, ti, p, arg, c, s;
           
            for (int i = 0; i < fftn; i++)
            {
                uint d4 = (uint)dm0[adr]; adr--;
                uint d3 = (uint)dm0[adr]; adr--;
                uint d2 = (uint)dm0[adr]; adr--;
                uint d1 = (uint)dm0[adr]; adr--;
                UInt32 id = (UInt32)((UInt32)(d1 * 16777216) + (UInt32)(d2 * 65536) + (UInt32)(d3 * 256) + (UInt32)d4);
                double did = (double)id;

                //conversion en double
                did = did / 16777216;//2^24
                if (did > 255) did = did-256;
               
                xre[i] = did;// x[i];
                xim[i] = 0.0f;
            }
            int k = 0;
            for (int l = 1; l <= fftnu; l++)
            {
                while (k < fftn)
                {
                    for (int i = 1; i <= n2; i++)
                    {
                        p = BitReverse(k >> nu1);
                        arg = 2 * (double)Math.PI * p / fftn;
                        c = (double)Math.Cos(arg);
                        s = (double)Math.Sin(arg);
                        tr = xre[k + n2] * c + xim[k + n2] * s;
                        ti = xim[k + n2] * c - xre[k + n2] * s;
                        xre[k + n2] = xre[k] - tr;
                        xim[k + n2] = xim[k] - ti;
                        xre[k] += tr;
                        xim[k] += ti;
                        k++;
                    }
                    k += n2;
                }
                k = 0;
                nu1--;
                n2 = n2 / 2;
            }
            k = 0;
            int r;
            while (k < fftn)
            {
                r = BitReverse(k);
                if (r > k)
                {
                    tr = xre[k];
                    ti = xim[k];
                    xre[k] = xre[r];
                    xim[k] = xim[r];
                    xre[r] = tr;
                    xim[r] = ti;
                }
                k++;
            }
            for (int i = 0; i < fftn / 2; i++)
            {
                //decibel[i] = 20.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))));
                fftr[i].magnitude = 20.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))));
                fftr[i].phase  = Math.Atan2(xim[i], xre[i])*18.0 / Math.PI;
            }
            return fftr;// decibel;
        }

Code: Tout sélectionner
 private int BitReverse(int j)
        {
            int j2;
            int j1 = j;
            int k = 0;
            for (int i = 1; i <= fftnu; i++)
            {
                j2 = j1 / 2;
                k = 2 * k + j1 - 2 * j2;
                j1 = j2;
            }
            return k;
        }
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 06 Déc 2014 18:24

Vive le langage c :grr:

c'est possible d'avoir le contenu de xre[] et xim[] de l'exemple précédent ?
un fichier texte csv serait parfait.

ps: la balise [code] permet de présenter du code plus joliment.
alkasar
 
Messages: 11517
Inscription Forum: 29 Nov 2005 22:47
Localisation: Neuf deux
  • offline

Message » 06 Déc 2014 18:30

Je pense que la FFT est faussée.

il y'a 15% d'écart en Frequence d'EQ entre DStudio et rephase.
tu peux récupérer des lib FFT open,il y'en a pas mal.

les écarts:
EQ rePhase 100-650-4K

EQ DStudio:
85-550-3.4K

Image
Image
thierry38efd
 
Messages: 1735
Inscription Forum: 18 Sep 2013 7:36
  • offline

Message » 07 Juil 2015 17:04

Bonjour , Je sais je suis un peu en retard mais bon :) je ne vois pas le code que vous avez utilisé pour programmer le microcontroleur qui s’occupera d'envoyer les paramètres dans l'ADAU1701 ? commet vous avez fais pour envoyer ces paramètres ?
netcien
 
Messages: 1
Inscription Forum: 07 Juil 2015 16:45
  • offline

Message » 07 Juil 2015 18:44

comme dit la doc et sur les forums ADI :wink:
Thierryvalk a dit il y a longtemps que le firmware est un mélange de code spécifique pour le DSPiy et de code de sa société. Le source n'est pas disponible. Il reste un moyen : le convaincre de t'embaucher ou racheter sa société...
alkasar
 
Messages: 11517
Inscription Forum: 29 Nov 2005 22:47
Localisation: Neuf deux
  • offline

Message » 04 Fév 2018 16:43

Petit déterrage de post ... j'ai un petit soucis avec mon DSPIY ... :ko:

Depuis une semaine j'ai la voie de droite (je suis en 2.2 semi-actif) qui baisse de volume de plus en plus ... j'arrive à 55/100 de balance pour "égaliser" ...

J'ai vérifier mon câblage et j'ai fait des test pour lever le doute c'est bien le DSPIY qui crache moins fort ... :grr:

La seule explication c'est qu'un des ES9023 déconne (à priori LDO commun : "deux régulateurs TPS7A4700 à très faible bruit, dont un réservé à l'alimentation analogique des DACs") car chaque voie est câblé sur un DAC différent ... ANA out 5/6 (DAC3) -> voie de gauche et ANA out 3/4 (DAC2) -> voie de droite ... bon vous allez me dire il me reste le DAC1 pour migrer les sorties mais j'aimerai bien diagnostiquer le problème quand même ...

Image
Image
AlexScan
 
Messages: 10617
Inscription Forum: 27 Déc 2005 20:57
Localisation: Saint Mandé
  • offline

Message » 04 Fév 2018 18:57

Bien étrange.
ES9023 qui déconne, par expérience et retours, c'est surtout des sifflements qui interviennent.

Tu as cela sur différentes entrées ?

L'idéal, est de reprendre une appli de base, tout mettre en bypass, débrancher les ampli, mettre du signal d'une carte son en entrée de DSPiy et vérifier en branchant les sorties une par une sur l'entrée d'un carte son.
Mesure avec REW et tu es fixé.

Faire le test éventuellement avec différentes entrées du DSPiy
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 04 Fév 2018 20:25

thierryvalk a écrit:Bien étrange.
ES9023 qui déconne, par expérience et retours, c'est surtout des sifflements qui interviennent.

Tu as cela sur différentes entrées ?

L'idéal, est de reprendre une appli de base, tout mettre en bypass, débrancher les ampli, mettre du signal d'une carte son en entrée de DSPiy et vérifier en branchant les sorties une par une sur l'entrée d'un carte son.
Mesure avec REW et tu es fixé.

Faire le test éventuellement avec différentes entrées du DSPiy


Bon autant pour moi c'était Foobar le fautif ... :hein: :roll:

J'avais mis en Directsound pour faire je sais plus quoi et je l'avais laisser comme ça ... en Wasapi tout re-fonctionne normalement ... d'ailleurs je ne vois pas d'ou ça viens en DS le soucis ...

Merci pour l'intervention rapide thierry ! (je me disais aussi un DAC qui perd du volume j'ai jamais vu ça non plus)

En passant tu compte refaire un DSPIY "next gen" ou pas ? (je vais refaire tous mes électroniques DIY cette année, DSP compris ... le nanoshark me fait de l'oeil...)
AlexScan
 
Messages: 10617
Inscription Forum: 27 Déc 2005 20:57
Localisation: Saint Mandé
  • offline

Message » 04 Fév 2018 20:53

Super d'avoir trouvé la source du problème. :bravo:

En passant tu compte refaire un DSPIY "next gen" ou pas ?

Non, pas pour le moment, il reste plein de choses à faire pour exploiter nos DSPiy surtout avec la carte ADAU1452.
Il y a la version 5.1 (5.2 pour éviter les confusions avec le HC 5.1) de DStudio qui intègrera le très bon soft de DRC de Denis Sbragion.
Pour moi, le matériel, c'est une chose, mais des corrections bien faites tout une autre et bien plus efficace qu'un DAC à la fiche technique rêveuse.

Mais voila, pour le moment, pas le temps pour continuer ces développements.


Les produits de miniDSP sont sympas, mais je trouve qu'il y a toujours une limitation soit au niveau des fonctionnalité soit du prix.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 04 Fév 2018 21:05

Il y a la version 5.1 (5.2 pour éviter les confusions avec le HC 5.1) de DStudio qui intègrera le très bon soft de DRC de Denis Sbragion.


Salut Thierry,
tu as un lien vers le forum DSPiy pour qu"on en sache plus là dessus ?
androuski
 
Messages: 23171
Inscription Forum: 14 Mar 2007 14:43
Localisation: C'est un trou, mais rempli de pinard, donc ça me va.
  • online

Message » 04 Fév 2018 21:11

oui,
http://www.dspiy.be/forum/viewtopic.php?f=2&t=148

En fait la version 5.0 est une version intermédiaire, qui ne fait que des mesures par rapport à la version4. La 5.2 devrait corriger pas mal de défauts de mesures et surtout enfin gérer ce DRC.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline


Retourner vers Filtrage actif, Equalisation et Processeurs

 
  • Articles en relation
    Dernier message