"Notas de Algoritmo": Aplicação e Implementação de Código do Espectro de Energia

1. Fundo:

Anteriormente, assumi um pequeno projeto, usando sensores de vibração para monitorar a mudança do ventilador.

Não há mais explicação sobre o uso do microcomputador de chip único e a coleta de dados do sensor de aceleração aqui.

Preparação de dados: Defina a frequência de amostragem de vibração para 400Hz. Os pontos de amostragem são 512 pontos.

De acordo com o ponto discreto FFT, a faixa de frequência que pode ser efetivamente monitorada (400/2 = 200Hz).

 

2. Resultados esperados

A partir dos 512 pontos de dados discretos, a frequência de vibração e a potência são calculadas.

A frequência real F é proporcional à abscissa x do ponto de dados:

F = x (400/512)=0.78125 x

3. Pontos de dados brutos

Os 512 pontos de dados são continuamente coletados pelo sensor. Eles são os valores de aceleração perpendiculares ao plano de vibração (eixo Z). O valor de aceleração é usado para descrever a força de vibração em um determinado momento.

De acordo com a configuração da faixa do chip do acelerômetro, o valor do ponto de dados original será diferente.

1. Conforme mostrado na figura abaixo: Tire metade dos pontos (256) para exibir. Configure a faixa do sensor como mais ou menos 16G. Quando o sensor é colocado horizontalmente, o valor do eixo Z representa a gravidade G da Terra. O número gira em torno de 2100.

2. Agite uniformemente com a mão, a exibição é a seguinte:

A figura a seguir tem um total de 256 pontos e o sensor emite 400 pontos em 1 segundo, o que significa que as 3,5 ondas na figura realmente usam 256/400 = 0,64 s.

A frequência da manivela é 3,5 / 0,64 = 5,46875 Hz, o que significa que a manivela é 5,5 vezes por segundo. (Agite bem rápido)

3. Coloque-o na lateral do computador principal e meça a vibração do computador principal. As formas de onda originais observadas são as seguintes:

Por ser posicionado lateralmente, o eixo Z fica menor sob a influência da gravidade terrestre (restam cerca de 40, não há correção, mas não afeta o cálculo da frequência).

4. Algoritmo FFT

4.1 Compreensão básica

Para obter a frequência de pontos discretos, a primeira coisa que vem à mente é o algoritmo FFT, que é a transformada rápida de Fourier. Existem explicações teóricas detalhadas em matemática avançada e transformação integral. Existem também muitos predecessores na Internet que fizeram um excelente trabalho de classificação. Não vou repetir aqui, e dar o link para o artigo que citei diretamente na época:

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

Há código encapsulado no artigo e a descrição dos parâmetros também é muito detalhada.

 

4.2 Classificação de ideias

Passe 512 pontos de dados originais para a função FFT para obter o novo array alterado. O número de matrizes permanece inalterado e os dados mudam do domínio do tempo para o domínio da frequência.

4.3 Implementação do código

O autor original da função aqui usou o formato antigo ao definir os parâmetros formais. Portanto, não se surpreenda. Lembre-se de incluir o arquivo de cabeçalho "math.h".

Dentre eles, o array pr [512] armazena dados originais de 512. Após o término da função, os dados em pr tornam-se o módulo dos dados transformados no domínio da frequência (usados ​​para exibição do 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 Efeito

Coloque o sensor na lateral do host do computador para medir a frequência. A velocidade do disco rígido do computador host é 7200 rpm, correspondendo a uma frequência de 120 Hz.

Pode-se observar que o espectro de frequência obtido pela transformada FFT pode extrair vibração de 120 Hz. Mas a influência do ruído de baixa frequência é muito séria. Isso, sem dúvida, aumentará os problemas para processamento de dados posterior.

 

4.5 Vantagens e desvantagens

Vantagens: velocidade rápida, o cálculo pode ser concluído em 1s.

Desvantagens: A aleatoriedade muda muito, o que não favorece o processamento de dados.

 

5. Espectro de potência

5.1 Como encontrar

Para ser honesto, também vi muitos métodos para processamento de sinais de espectro e comparei a estabilidade e a facilidade de implementação de vários métodos. A escolha de usar o espectro de potência significa que o espectro de potência pode remover a aleatoriedade no FFT. A imagem do espectro de potência é mais estável.

Os predecessores da Internet deram várias maneiras de obter o espectro de energia:

(1) Método direto para obter espectro de potência (2) Método da função de correlação (3) Método do modelo AR de correlação (4) Método BURG

Você pode praticar o baiDu sozinho para obter conhecimentos relacionados.

Eu escolhi o método da função de correlação.

5.2 Método da função de correlação

Primeiro encontre a função de autocorrelação e, em seguida, faça a transformação no domínio da frequência.

5.3 Implementação do código

1. No processo de implementação do código, foi descoberto que o valor original precisa ser pré-processado primeiro.

Encontre a média de 512 pontos originais e subtraia a média de cada valor original. O objetivo disso é fazer com que a matriz de valor original seja distribuída acima e abaixo da linha zero, eliminar a influência do componente DC e focar na alteração do valor.

Se esta operação não for realizada, os dados gerais da imagem do espectro de potência obtidos serão grandes e o grau de influência das mudanças de frequência será fraco na imagem. Parece uma curva logarítmica sem ondas.

2. Encontre a função de autocorrelação

Aqui está a linguagem C para implementar a função xcorr no 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. Encontre o espectro de potência

 

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 Efeito

1. Coloque o sensor em uma mesa estacionária. Pode-se descobrir que o espectro de potência não tem características óbvias.

O espectro de potência é o seguinte:

2. Coloque o sensor de hardware na superfície do meu notebook, e a velocidade do disco rígido também será 7200 rpm (a frequência é 120 Hz).

O espectro de potência é o seguinte:

 

 

 

 

 

 

 

Acho que você gosta

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