"Notas de algoritmo": Aplicación e implementación de código de Power Spectrum

1. Antecedentes:

Anteriormente, me hice cargo de un pequeño proyecto, usando sensores de vibración para monitorear el interruptor del ventilador.

No hay más explicaciones sobre el uso del microordenador de un solo chip y la recopilación de datos del sensor de aceleración.

Preparación de datos: establezca la frecuencia de muestreo de vibraciones en 400 Hz. Los puntos de muestreo son 512 puntos.

Según el punto discreto FFT, el rango de frecuencia que realmente se puede monitorear (400/2 = 200Hz).

 

2. Resultados esperados

A partir de los 512 puntos de datos discretos, se calculan la frecuencia y la potencia de vibración.

La frecuencia real F es proporcional a la abscisa x del punto de datos:

F = x (400/512)=0.78125 x

3. Puntos de datos sin procesar

El sensor recopila continuamente los 512 puntos de datos. Son los valores de aceleración perpendiculares al plano de vibración (eje Z). El valor de aceleración se utiliza para describir la fuerza de vibración en un momento determinado.

Según la configuración del rango del chip del acelerómetro, el valor del punto de datos original será diferente.

1. Como se muestra en la figura siguiente: Tome la mitad de los puntos (256) para mostrar. Configure el rango del sensor como más o menos 16G. Cuando el sensor se coloca horizontalmente, el valor del eje Z representa la gravedad G de la tierra. La cifra ronda el 2100.

2. Agite uniformemente con la mano, la pantalla es la siguiente:

La siguiente figura tiene un total de 256 puntos y el sensor genera 400 puntos en 1 segundo, lo que significa que las 3.5 ondas en la figura realmente usan 256/400 = 0.64 s.

La frecuencia de la manivela es 3.5 / 0.64 = 5.46875 Hz, lo que significa que la manivela es 5.5 veces por segundo. (Agítalo muy rápido)

3. Colóquelo en el costado de la computadora principal y mida la vibración de la computadora principal. Las formas de onda originales observadas son las siguientes:

Debido a que se coloca en el lateral, el eje Z se vuelve más pequeño bajo la influencia de la gravedad de la tierra (quedan alrededor de 40, no hay corrección, pero no afecta el cálculo de frecuencia).

4. Algoritmo FFT

4.1 Comprensión básica

Para obtener la frecuencia de puntos discretos, lo primero que nos viene a la mente es el algoritmo FFT, que es la transformada rápida de Fourier. Hay explicaciones teóricas detalladas en matemáticas avanzadas y transformación integral. También hay muchos predecesores en Internet que han hecho un excelente trabajo de clasificación. No lo repetiré aquí, y le doy el enlace al artículo que cité directamente en ese momento:

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

Hay un código encapsulado en el artículo y la descripción de los parámetros también es muy detallada.

 

4.2 Clasificación de ideas

Pase 512 puntos de datos originales a la función FFT para obtener la nueva matriz modificada. El número de matrices permanece sin cambios y los datos cambian del dominio del tiempo al dominio de la frecuencia.

4.3 Implementación del código

El autor original de la función aquí utilizó el formato antiguo al definir los parámetros formales. Así que no se sorprenda. Recuerde incluir el archivo de encabezado "math.h".

Entre ellos, la matriz pr [512] almacena 512 datos originales. Una vez finalizada la función, los datos en pr se convierten en el módulo de los datos de dominio de frecuencia transformados (utilizados para la visualización del espectro).

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

Coloque el sensor en el costado del host de la computadora para medir la frecuencia. La velocidad del disco duro de la computadora host es 7200 rpm, correspondiente a una frecuencia de 120 Hz.

Se puede ver que el espectro de frecuencia obtenido por la transformada FFT puede extraer una vibración de 120 Hz. Pero la influencia del ruido de baja frecuencia es muy grave. Sin duda, esto aumentará los problemas para el procesamiento posterior de datos.

 

4.5 Ventajas y desventajas

Ventajas: velocidad rápida, el cálculo se puede completar en 1 s.

Desventajas: La aleatoriedad cambia demasiado, lo que no favorece el procesamiento de datos.

 

5. Espectro de potencia

5.1 Cómo encontrar

Para ser honesto, también he visto muchos métodos para el procesamiento de señales de espectro y he comparado la estabilidad y facilidad de implementación de varios métodos. La elección de utilizar el espectro de potencia significa que el espectro de potencia puede eliminar la aleatoriedad en la FFT. La imagen del espectro de potencia es más estable.

Los predecesores en Internet han dado varias formas de obtener el espectro de potencia:

(1) Método directo para obtener el espectro de potencia (2) Método de la función de correlación (3) Método del modelo AR de correlación (4) Método BURG

Puede baiDu usted mismo para obtener conocimientos relacionados.

Elegí el método de función de correlación.

5.2 Método de función de correlación

Primero encuentre la función de autocorrelación y luego realice la transformación en el dominio de la frecuencia.

5.3 Implementación del código

1. En el proceso de implementación del código, se descubrió que primero se debe preprocesar el valor original.

Encuentre el promedio de 512 puntos originales y reste el promedio de cada valor original. El propósito de esto es hacer que la matriz de valores original se distribuya por encima y por debajo de la línea cero, eliminar la influencia del componente de CC y centrarse en el cambio del valor.

Si no se realiza esta operación, los datos de la imagen del espectro de potencia general obtenidos serán grandes y el grado de influencia de los cambios de frecuencia será débil en la imagen. Parece una curva logarítmica sin ondas.

2. Encuentra la función de autocorrelación

Aquí está el lenguaje C para implementar la función xcorr en 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. Encuentra el espectro de potencia

 

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 Efecto

1. Coloque el sensor en una mesa fija. Se puede encontrar que el espectro de potencia no tiene características obvias.

El espectro de potencia es el siguiente:

2. Coloque el sensor de hardware en la superficie de mi computadora portátil y la velocidad del disco duro también será de 7200 rpm (la frecuencia es de 120 Hz).

El espectro de potencia es el siguiente:

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/Kshine2017/article/details/102914108
Recomendado
Clasificación