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: