"Notes d'algorithme": Application et implémentation de code du spectre de puissance

1. Origines:

Auparavant, j'ai repris un petit projet, utilisant des capteurs de vibrations pour surveiller l'interrupteur du ventilateur.

Il n'y a plus d'explication sur l'utilisation du micro-ordinateur monopuce et la collecte des données du capteur d'accélération ici.

Préparation des données: réglez la fréquence d'échantillonnage des vibrations sur 400 Hz. Les points d'échantillonnage sont de 512 points.

Selon le point discret FFT, la plage de fréquences qui peut être réellement surveillée (400/2 = 200Hz).

 

2. Résultats attendus

À partir des 512 points de données discrets, la fréquence et la puissance de vibration sont calculées.

La fréquence réelle F est proportionnelle à l'abscisse x du point de données:

F = x (400/512)=0.78125 x

3. Points de données brutes

Les 512 points de données sont collectés en continu par le capteur. Ce sont les valeurs d'accélération perpendiculaires au plan de vibration (axe Z). La valeur d'accélération est utilisée pour décrire la force de vibration à un certain moment.

Selon la configuration de la plage de puces de l'accéléromètre, la valeur du point de données d'origine sera différente.

1. Comme le montre la figure ci-dessous: Prenez la moitié des points (256) à afficher. Configurez la plage du capteur sur plus ou moins 16G. Lorsque le capteur est placé horizontalement, la valeur de l'axe Z représente la gravité G de la terre. Le chiffre est d'environ 2100.

2. Agitez uniformément à la main, l'affichage est le suivant:

La figure suivante a un total de 256 points et le capteur délivre 400 points en 1 seconde, ce qui signifie que les 3,5 ondes de la figure utilisent en réalité 256/400 = 0,64 s.

La fréquence de la manivelle est de 3,5 / 0,64 = 5,46875 Hz, ce qui signifie que la manivelle est de 5,5 fois par seconde. (Secoue-le très vite)

3. Placez-le sur le côté de l'ordinateur principal et mesurez les vibrations de l'ordinateur principal. Les formes d'onde d'origine observées sont les suivantes:

Parce qu'il est placé sur le côté, l'axe Z devient plus petit sous l'influence de la gravité terrestre (il en reste environ 40, il n'y a pas de correction, mais cela n'affecte pas le calcul de la fréquence).

4. Algorithme FFT

4.1 Compréhension de base

Pour obtenir la fréquence des points discrets, la première chose qui vient à l'esprit est l'algorithme FFT, qui est la transformée de Fourier rapide. Il existe des explications théoriques détaillées en mathématiques avancées et en transformation intégrale. Il existe également de nombreux prédécesseurs sur Internet qui ont fait un excellent travail de tri. Je ne le répéterai pas ici et je donnerai le lien vers l’article que j’ai directement cité à l’époque:

https://blog.csdn.net/yga_airspace/article/details/86688278

Il y a du code encapsulé dans l'article, et la description des paramètres est également très détaillée.

 

4.2 Tri des idées

Passez 512 points de données d'origine à la fonction FFT pour obtenir le nouveau tableau modifié. Le nombre de tableaux reste inchangé et les données changent du domaine temporel au domaine fréquentiel.

4.3 Implémentation du code

L'auteur original de la fonction a utilisé ici l'ancien format lors de la définition des paramètres formels. Alors ne soyez pas surpris. N'oubliez pas d'inclure le fichier d'en-tête "math.h".

Parmi eux, le tableau pr [512] stocke les données originales 512. Une fois la fonction terminée, les données dans pr deviennent le module des données du domaine fréquentiel transformées (utilisées pour l'affichage du spectre).

/*******************************************************************\
		double pr[n]	存放n个采样输入的实部,返回离散傅里叶变换的摸
		double pi[n]	存放n个采样输入的虚部
		double fr[n]	返回离散傅里叶变换的n个实部
		double fi[n]	返回离散傅里叶变换的n个虚部
		int n	采样点数
		int k	满足n=2^k
\*******************************************************************/
  void kfft(pr,pi,n,k,fr,fi)
  int n,k;
  double pr[],pi[],fr[],fi[];
  { 
		int it,m,is,i,j,nv,l0;
    double p,q,s,vr,vi,poddr,poddi;
    for (it=0; it<=n-1; it++)  //将pr[0]和pi[0]循环赋值给fr[]和fi[]
    { 
		m=it; 
		is=0;
		for(i=0; i<=k-1; i++)
        { 
			j=m/2; 
			is=2*is+(m-2*j); 
			m=j;
		}
        fr[it]=pr[is]; 
        fi[it]=pi[is];
    }
    pr[0]=1.0; 
    pi[0]=0.0;
    p=6.283185306/(1.0*n);
    pr[1]=cos(p); //将w=e^-j2pi/n用欧拉公式表示
    pi[1]=-sin(p);

    for (i=2; i<=n-1; i++)  //计算pr[]
    {  
		p=pr[i-1]*pr[1]; 
		q=pi[i-1]*pi[1];
		s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
		pr[i]=p-q; pi[i]=s-p-q;
    }
    for (it=0; it<=n-2; it=it+2)  
    {
		vr=fr[it];
		vi=fi[it];
		fr[it]=vr+fr[it+1]; 
		fi[it]=vi+fi[it+1];
		fr[it+1]=vr-fr[it+1]; 
		fi[it+1]=vi-fi[it+1];
    }
	m=n/2; 
	nv=2;
    for (l0=k-2; l0>=0; l0--) //蝴蝶操作
    { 
		m=m/2; 
		nv=2*nv;
        for (it=0; it<=(m-1)*nv; it=it+nv)
          for (j=0; j<=(nv/2)-1; j++)
            { 
				p=pr[m*j]*fr[it+j+nv/2];
				q=pi[m*j]*fi[it+j+nv/2];
				s=pr[m*j]+pi[m*j];
				s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
				poddr=p-q; 
				poddi=s-p-q;
				fr[it+j+nv/2]=fr[it+j]-poddr;
				fi[it+j+nv/2]=fi[it+j]-poddi;
				fr[it+j]=fr[it+j]+poddr;
				fi[it+j]=fi[it+j]+poddi;
            }
    }
    for (i=0; i<=n-1; i++)
       { 
		  pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);  //幅值计算
       }
    return;
  }

4.4 Effet

Placez le capteur sur le côté de l'ordinateur hôte pour mesurer la fréquence. La vitesse du disque dur de l'ordinateur hôte est de 7200 tr / min, ce qui correspond à une fréquence de 120 Hz.

On voit que le spectre de fréquences obtenu par la transformée FFT peut extraire une vibration de 120 Hz. Mais l'influence du bruit basse fréquence est très grave. Cela augmentera sans aucun doute le problème du traitement ultérieur des données.

 

4.5 Avantages et inconvénients

Avantages: vitesse rapide, le calcul peut être effectué en 1 s.

Inconvénients: Le caractère aléatoire change trop, ce qui n'est pas propice au traitement des données.

 

5. Spectre de puissance

5.1 Comment trouver

Pour être honnête, j'ai également vu de nombreuses méthodes de traitement du signal spectral et comparé la stabilité et la facilité de mise en œuvre de diverses méthodes. Choisir d'utiliser le spectre de puissance signifie que le spectre de puissance peut supprimer le caractère aléatoire de la FFT. L'image du spectre de puissance est plus stable.

Les prédécesseurs sur Internet ont proposé différentes manières d'obtenir le spectre de puissance:

(1) Méthode directe pour obtenir le spectre de puissance (2) Méthode de la fonction de corrélation (3) Méthode du modèle de corrélation AR (4) Méthode BURG

Vous pouvez baiDu par vous-même pour les connaissances connexes.

J'ai choisi la méthode de la fonction de corrélation.

5.2 Méthode de la fonction de corrélation

Trouvez d'abord la fonction d'autocorrélation, puis effectuez la transformation du domaine fréquentiel.

5.3 Implémentation du code

1. Lors de la mise en œuvre du code, il a été découvert que la valeur d'origine doit d'abord être prétraitée.

Trouvez la moyenne de 512 points d'origine et soustrayez la moyenne de chaque valeur d'origine. Le but de ceci est de distribuer le tableau de valeurs d'origine au-dessus et en dessous de la ligne zéro, d'éliminer l'influence de la composante CC et de se concentrer sur le changement de valeur.

Si cette opération n'est pas effectuée, les données globales d'image du spectre de puissance obtenues seront importantes et le degré d'influence des changements de fréquence sera faible sur l'image. Cela ressemble à une courbe logarithmique sans ondes.

2. Recherchez la fonction d'autocorrélation

Voici le langage C pour implémenter la fonction xcorr dans matlab.

int xcorr(double *corr, double *x, double *y, int iDataN, int iSyncLength)
{
	double r =0.0;
	int i=0, j=0;
	for (i = 0; i < iDataN- iSyncLength+1; i++)
	{
		r=0;
		for(j=0; j < iSyncLength; j++)
		{
			r+=x[i+j]*y[j];
			
		}
		corr[i]=r;
	}
 
	for (i = iDataN- iSyncLength+1; i < iDataN; i++)
	{
		r=0;
		for(j=0; j <iDataN- i; j++)
		{		
			r+=x[i+j]*y[j];
			
		}
		corr[i]=r;
	}
	return 0;
 
}

3. Trouvez le spectre de puissance

 

void PowerSpectrum()
{
      //求自相关函数
      xcorr(fr,pr,pr,NUM,NUM);
      memcpy(pr,fr,NUM*sizeof(double));
      //快速傅里叶变换
      kfft(pr,pi,NUM,9,fr,fi);
      //对数变换
      {
        uint16_t i;
        for(i=0;i<NUM/2;i++)
        {
              pr[i]=10*log(fabs(pr[i+1]));
        }
      }
 }

5.4 Effet

1. Placez le capteur sur une table fixe. On constate que le spectre de puissance n'a pas de caractéristiques évidentes.

Le spectre de puissance est le suivant:

2. Placez le capteur matériel sur la surface de mon ordinateur portable, et la vitesse du disque dur est également de 7200 tr / min (la fréquence est de 120 Hz).

Le spectre de puissance est le suivant:

 

 

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/Kshine2017/article/details/102914108
conseillé
Classement