En ajoutant un champ dans ta structure param ;)
Version imprimable
En ajoutant un champ dans ta structure param ;)
Hum, hum, je vois pas trop comment recuper ces informations a partir de mon main.
mais soit, comment aller alors chercher ces informations ( vector de freq et int de freq) quand je suis dans mon main... je ne sais pas faire "param.frequence" ou "param->frequence" dans mon main...:roll::roll:Code:
1
2
3
4
5
6
7
8
9
10 struct pilote_parameters{ PaStream *stream; unsigned long framesPerBuffer; PaTime timestart; int compteur; vector <int> frequences; //historique des frequence int frequence; // frequence calculée dans ma fct captureduson };
Un paramètre passé à l'appel de la fonction portaudio ;)
voila , me voici face a un nouveau probleme. dans le code suivant , je fait un echantillonage, mais apparement je suis limiter a param.time>100, car au sinon, ca plante. le probleme c'est que j'aimerai avoir un echatillonage en dessous de 100 milli-secondes, genre 10 ms... Comment faire?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 //commencer l'acquisition fflush(stdin); err=Pa_StartStream(param.stream); if(err!=paNoError){ cout<<"PortAudio error: "<<Pa_GetErrorText(err); } Sleep(param.time); // arreter l'acquistion err=Pa_StopStream(param.stream); if(err!=paNoError){ cout<<"PortAudio error: "<<Pa_GetErrorText(err); }
10 ms, c'est moins que la latence de ta carte son, donc normal que ça plante...
Et donc j'aimerais savoir comment est-ce que je pourrais diminuer alors au minimum ce temp d'attente pour quand meme avoir des donnée?
Soit tu les traites en temps réel, soit tu les traites après.
Dans le premier cas, tu as des données à chaque fois, mais tu dois les traiter rapidement, dans le second, tu prends une plage large de valeurs et tu les traites aussi longtemps que tu veux.
on a reussi a passer au dessu de cela, en fesant les calcul dans la fonction callback.
MAis nou sommes confrontés a un autre probleme: le filtre.
donc on obtiens un tableau de n echantillons, et il faut le filtrer.
voici une partie du code:
je suppose que notre tableau est donc x et que le tableau filtré c'est y, mais j'en suis pas certain( surtout que un tab!=float). et j'ai aussi les tab des coef A[] et B[]. Mais bon j'ai besoin d'un tit cp de main pour lever mes inconues..Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /* Computes the output y of a general FIR-IIR digital filter when /* signal x (length=NPoints) is presented at the input. /* The filter realization is the Transposed Direct Form II. /* Its transfer function is : /* /* B^[0] + B^[1] z^-1 + ... + B^[m_numOrder] z^-m_numOrder /* T(z)= ------------------------------------------------------- /* 1 + A^[1] z^-1 + ... + A^[m_denOrder] z^-m_denOrder /* /* ZI is the vector of internal variables of the filter. /* It should have a minimum dimension = max(m_numOrder+1,m_denOrder+1) /* It is set to the final conditions on return. /* WARNING : m_denOrder and m_numOrder shouldn't be both set to zero /* at the same time. */ void filter(float* BCoef, int NumOrder, float* ACoef, int DenOrder, float* x, int NPoints, float* y, float* ZI) { }
Oui, x et y sont les tableaux glissants en entrée et en sortie, et A et B sont les tableaux des coefficients, on voit la formule dans le commentaire que tu donnes d'ailleurs ;)
donc je vais rentrer avec mon tableau float x[80] ainsi que mes deux tableau float ACoef[5] et Bcoef[5]. Alors j'aobtiens aussi que int NPoints =80 et que
int DenOrder=5,int NumOrder=5.
B =
0.010209480791203 0.040837923164813 0.061256884747219
0.040837923164813 0.010209480791203
A =
1.000000000000000 -1.968427786938519 1.735860709208887
-0.724470829507363 0.120389599896245
Voila, dans le code precedent je ne sais pas trop si je doit initialiser y. Deplus, je ne vois pas ce qu'est ZI. Ensuite, apres passage dans le filtre, est ce que mon tableau x sera modifier? et je suppose que y sera mon tableau x filtré, est ce que je me trompe?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 float *x[80]; float *y[80]; /* est-ce bien cela? et je suppose qu'il n'y a pas besoin de l'initialiser*/ float *ACoef[5]; float *Bcoef[5]; float *ZI; /* qu'est-ce ZI?, que vaut il?*/ int NPoints =80; int DenOrder=5; int NumOrder=5; ACoef[0]=1.000000000000000 ; ACoef[1]=-1.968427786938519; ACoef[2]=1.735860709208887; ACoef[3]=-0.724470829507363; ACoef[4]=0.120389599896245; BCoef[0]=0.010209480791203 ; BCoef[1]=0.040837923164813; BCoef[2]=0.061256884747219; BCoef[3]=0.040837923164813; BCoef[4]=0.010209480791203; // le tableau x sera rempli ici filter(BCoef,NumOrder,ACoef, DenOrder, x, NPoints, y, ZI);
Et aussi est ce que le code si dessus pourrais fonctionner correctement?
Nous avaons aussi un autre probleme, le programme ne tourne pas sur d'autre machine:
-win 98SE : dll manquant( msvcr80d.dll,msvcp80.dll,msvcp80d.dll) dont les 2 premier sont rajoutables, mais pas le dernier.
-win xp:"cette application n'a pas pu démarrer car la configuration de l'application est incorrecte. Réinstallez l'application pr résoudre ce problème": p-e il faut utiliser :Microsoft Visual C++ 2005 Redistributable Package (x86) ?
et de préférence, ces variables devraient être allouées dynamiquement (c'est comme ça que c'est fait en réalité dans tous les outils de ce type).Code:
1
2
3
4 float x[80]; float y[80]; float ACoef[5]; float Bcoef[5];
Pour ZI, c'est le vecteur des variables internes (c'est un filtre à état qui a besoin à chaque appel de savoir ce qui s'était passé avant, la fonction se charge de le mettre à jour à chaque fois), donc au départ, que des 0.
donc mon tableau x filtré sera le tableau y? et est-ce que le tableau x sera modifié?
Nous avons aussi un autre probleme, le programme ne tourne pas sur d'autre machine:
-win 98SE : dll manquant( msvcr80d.dll,msvcp80.dll,msvcp80d.dll) dont les 2 premier sont rajoutables, mais pas le dernier.
-win xp:"cette application n'a pas pu démarrer car la configuration de l'application est incorrecte. Réinstallez l'application pr résoudre ce problème": p-e il faut utiliser :Microsoft Visual C++ 2005 Redistributable Package (x86) ?
j'ai aussi une question, est ce que je px la faire par mp?
Mieux vaut répondre ici pour les prochains qui pourraient avoir le même souci ;)
Le tableau X n'est pas modifié, ce n'est même pas envisageable car il est nécessaire au filtrage, c'est y qui donnera le résultat.
Il n'est pas normal d'avoir la version debug à fournir, il y a une erreur quelque part.
Pour l'autre bug, il s'agit vraisemblablement d'une erreur de manifeste -> il doit être intégré lors de l'édition des liens à l'application/bibliothèque.
Voila, on a mit le filtre, mais on a encore des soucis... le vecteur y est en 10^10 pour les 5 premieres valeurs, et apres on a des1;#inf et IND...
Code:
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
35 void calcul(short int *t, float &moy){ float *x= new float[80]; //ici on transfert notre tableau t dans X for( int j=0; j<80; j++){ (x[j])=float((t[j])); } float *y= new float[80]; float *ACoef= new float[5]; float *BCoef= new float[5]; ACoef[0]=1.000000000000000; ACoef[1]=-1.968427786938519; ACoef[2]=1.735860709208887; ACoef[3]=-0.724470829507363; ACoef[4]=0.120389599896245; BCoef[0]=0.010209480791203; BCoef[1]=0.040837923164813; BCoef[2]=0.061256884747219; BCoef[3]=0.040837923164813; BCoef[4]=0.010209480791203; float *ZI= new float[80]; for(int k=0;k<80;k++){ cout<<t[k]<<endl; } filter(BCoef, 5, ACoef, 5, x, 80, y, ZI); cout<<"apres le filtre"<<endl; for(int k=0;k<80;k++){ cout<<x[k]<<endl; }cout<<"les y"<<endl; for(int k=0;k<80;k++){ cout<<y[k]<<endl; } delete[]x;delete[]y; delete []ACoef; delete[] BCoef; delete [] ZI; }
La fonction calcul ne devrait pas initialiser les valeurs, et surtout pas celles-ci :
Ce sont les valeurs passées du filtre, sans initialisation, elles valent n'importe quoi, d'où les erreurs rencontrées.Code:float *ZI= new float[80]
Il FAUT intiialiser à 0 ces valeurs et les conserver entre deux appels à la fonction calcul.
donc tout mon tru est bon et je doit rajouter:
car si c'est ca, ca ne va toujours pas :sCode:
1
2
3
4 float *ZI= new float[80]; for( int j=0; j<80; j++){ (ZI[j])=0; }
:? ? toujours pas de reponses...
Ben non, ton truc n'est pas bon, j'ai dit que les allocations ne doivent pas être dans ta fonction.
oki,on a resolu le probleme, mais on devra refiltrer dans l'autre sens le tableau (equivalent a filtfilt() en matlab), donc on va perdre les info des ZI.
On a encore quelques problemes...
on aimerais savoir si il existe une fonction qui lit au fichier .wav ( comme celle qui existe en matlab: wavread) afin de retourner une tableau avec les valeurs. On sait le faire en matlab, mais pas en c/c++... On trouve des truc en c sur le net, mais c'est pas trop ca...
merci