"Algorithm Notes": Anwendung und Code-Implementierung des Leistungsspektrums

1. Hintergrund:

Zuvor habe ich ein kleines Projekt übernommen, bei dem der Schalter des Lüfters mithilfe von Vibrationssensoren überwacht wurde.

Es gibt hier keine Erklärung mehr für die Verwendung des Einzelchip-Mikrocomputers und die Datenerfassung des Beschleunigungssensors.

Datenaufbereitung: Stellen Sie die Vibrationsabtastfrequenz auf 400 Hz ein. Die Abtastpunkte sind 512 Punkte.

Entsprechend der diskreten Punkt-FFT der Frequenzbereich, der tatsächlich überwacht werden kann (400/2 = 200 Hz).

 

2. Erwartete Ergebnisse

Aus den diskreten 512 Datenpunkten werden die Schwingungsfrequenz und die Leistung berechnet.

Die tatsächliche Frequenz F ist proportional zur Abszisse x des Datenpunktes:

F = x (400/512)=0.78125 x

3. Rohdatenpunkte

Die 512 Datenpunkte werden kontinuierlich vom Sensor erfasst. Sie sind die Beschleunigungswerte senkrecht zur Schwingungsebene (Z-Achse). Der Beschleunigungswert wird verwendet, um die Schwingungskraft zu einem bestimmten Zeitpunkt zu beschreiben.

Je nach Konfiguration des Beschleunigungsmesser-Chipbereichs ist der Wert des ursprünglichen Datenpunkts unterschiedlich.

1. Wie in der folgenden Abbildung gezeigt: Nehmen Sie die Hälfte der Punkte (256) zur Anzeige. Konfigurieren Sie den Sensorbereich als plus oder minus 16G. Wenn der Sensor horizontal angeordnet ist, repräsentiert der Wert der Z-Achse die Schwerkraft G der Erde. Die Zahl ist um 2100.

2. Gleichmäßig von Hand schütteln. Die Anzeige sieht wie folgt aus:

Die folgende Abbildung hat insgesamt 256 Punkte, und der Sensor gibt in 1 Sekunde 400 Punkte aus, was bedeutet, dass die 3,5 Wellen in der Abbildung tatsächlich 256/400 = 0,64 s verwenden.

Die Frequenz der Handkurbel beträgt 3,5 / 0,64 = 5,46875 Hz, was bedeutet, dass die Handkurbel 5,5-mal pro Sekunde beträgt. (Schütteln Sie es sehr schnell)

3. Stellen Sie es auf die Seite des Hauptcomputers und messen Sie die Vibration des Hauptcomputers. Die ursprünglich beobachteten Wellenformen sind wie folgt:

Da es seitlich angeordnet ist, wird die Z-Achse unter dem Einfluss der Erdgravitation kleiner (es sind noch etwa 40 übrig, es gibt keine Korrektur, aber es hat keinen Einfluss auf die Frequenzberechnung).

4. FFT-Algorithmus

4.1 Grundlegendes Verständnis

Um die Frequenz diskreter Punkte zu erhalten, fällt als erstes der FFT-Algorithmus ein, bei dem es sich um die schnelle Fourier-Transformation handelt. Es gibt detaillierte theoretische Erklärungen in fortgeschrittener Mathematik und integraler Transformation. Es gibt auch viele Vorgänger im Internet, die hervorragende Arbeit geleistet haben. Ich werde es hier nicht wiederholen und den Link zu dem Artikel geben, den ich damals direkt zitiert habe:

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

Der Artikel enthält gekapselten Code, und die Beschreibung der Parameter ist ebenfalls sehr detailliert.

 

4.2 Ideen aussortieren

Übergeben Sie 512 Originaldatenpunkte an die FFT-Funktion, um das neue geänderte Array zu erhalten. Die Anzahl der Arrays bleibt unverändert, und die Daten ändern sich vom Zeitbereich zum Frequenzbereich.

4.3 Code-Implementierung

Der ursprüngliche Autor der Funktion verwendete hier das alte Format bei der Definition der formalen Parameter. Sei also nicht überrascht. Denken Sie daran, die Header-Datei "math.h" einzuschließen.

Unter diesen speichert das pr [512] -Array 512 Originaldaten. Nach Beendigung der Funktion werden die Daten in pr zum Modul der transformierten Frequenzbereichsdaten (die für die Spektrumsanzeige verwendet werden).

/*******************************************************************\
		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 Wirkung

Platzieren Sie den Sensor an der Seite des Computerhosts, um die Frequenz zu messen. Die Festplattengeschwindigkeit des Host-Computers beträgt 7200 U / min, was einer Frequenz von 120 Hz entspricht.

Es ist ersichtlich, dass das durch die FFT-Transformation erhaltene Frequenzspektrum 120-Hz-Schwingungen extrahieren kann. Der Einfluss von Niederfrequenzrauschen ist jedoch sehr schwerwiegend. Dies wird zweifellos den Aufwand für die spätere Datenverarbeitung erhöhen.

 

4.5 Vor- und Nachteile

Vorteile: schnelle Geschwindigkeit, Berechnung kann innerhalb von 1s abgeschlossen werden.

Nachteile: Die Zufälligkeit ändert sich zu stark, was der Datenverarbeitung nicht förderlich ist.

 

5. Leistungsspektrum

5.1 So finden Sie

Um ehrlich zu sein, habe ich auch viele Methoden zur Verarbeitung von Spektrumsignalen gesehen und die Stabilität und einfache Implementierung verschiedener Methoden verglichen. Wenn Sie das Leistungsspektrum verwenden, kann das Leistungsspektrum die Zufälligkeit in der FFT beseitigen. Das Bild des Leistungsspektrums ist stabiler.

Die Vorgänger im Internet haben verschiedene Möglichkeiten angegeben, um das Leistungsspektrum zu erhalten:

(1) Direktes Verfahren zum Erhalten des Leistungsspektrums (2) Korrelationsfunktionsverfahren (3) Korrelations-AR-Modellverfahren (4) BURG-Verfahren

Sie können selbst für verwandtes Wissen baiDu.

Ich habe die Korrelationsfunktionsmethode gewählt.

5.2 Korrelationsfunktionsmethode

Suchen Sie zuerst die Autokorrelationsfunktion und führen Sie dann die Frequenzbereichstransformation durch.

5.3 Code-Implementierung

1. Bei der Implementierung des Codes wurde festgestellt, dass der ursprüngliche Wert zuerst vorverarbeitet werden muss.

Finden Sie den Durchschnitt von 512 Originalpunkten und subtrahieren Sie den Durchschnitt von jedem Originalwert. Dies dient dazu, das ursprüngliche Wertearray über und unter der Nulllinie zu verteilen, den Einfluss der Gleichstromkomponente zu beseitigen und sich auf die Änderung des Werts zu konzentrieren.

Wenn diese Operation nicht ausgeführt wird, sind die erhaltenen Gesamtbilddaten des Leistungsspektrums groß und der Grad des Einflusses von Frequenzänderungen ist schwach auf das Bild. Es sieht aus wie eine logarithmische Kurve ohne Wellen.

2. Suchen Sie die Autokorrelationsfunktion

Hier ist die C-Sprache zum Implementieren der xcorr-Funktion in 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. Finden Sie das Leistungsspektrum

 

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 Wirkung

1. Stellen Sie den Sensor auf einen stationären Tisch. Es kann festgestellt werden, dass das Leistungsspektrum keine offensichtlichen Eigenschaften aufweist.

Das Leistungsspektrum ist wie folgt:

2. Setzen Sie den Hardware-Sensor auf die Oberfläche meines Notebooks. Die Festplattengeschwindigkeit beträgt ebenfalls 7200 U / min (Frequenz 120 Hz).

Das Leistungsspektrum ist wie folgt:

 

 

 

 

 

 

 

Ich denke du magst

Origin blog.csdn.net/Kshine2017/article/details/102914108
Empfohlen
Rangfolge