não consigo descobrir o período do meu sinal

7

Eu tenho um sinal barulhento, que é o som do motor a uma velocidade constante, então o som "deveria" ser periódico, eu sei que existe uma maneira de usar a função de autocorrelação para obter o período, consegui, mas fiz não consigo descobrir o período. Alguma idéia de como fazer isso abaixo do sinal e do resultado da autocorrelação: o sinal sinal

o resultado da autocorrelação: autocorrelação

Motor
fonte
Se você tiver uma nova pergunta, faça-o clicando no botão Fazer pergunta . Inclua um link para esta pergunta se ela ajudar a fornecer contexto. - Do comentário
MBaz 16/02

Respostas:

6

Aqui está uma tentativa de fazer o que você precisa scilab.

insira a descrição da imagem aqui

O gráfico superior mostra alguns dados que eu sintetizei. O segundo gráfico mostra a correlação automática dos dados brutos (ampliada em torno do pico central da correlação automática). Os círculos vermelhos mostram os picos encontrados usando esta find_peaksfunção .

O gráfico final mostra a diferença entre todos os locais de pico. Esta será uma estimativa do período. Como você não está realmente garantido de que o período subjacente será um número inteiro de amostras, provavelmente você deve encontrar a média desses valores.

Nesse caso, o período "verdadeiro" é 1/f0 = 11.191996, e recebe diffs = diff(peaks);e depois mean(diffs(10:173))cede 11.195122.


Código abaixo.

N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;

x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);

clf
subplot(311)
plot(x);

subplot(312)
plot(XC);

peaks=peak_detect(XC,0);

plot(peaks,XC(peaks),'ro')

a = get('current_axes');
a.data_bounds=[950 1050 -500 800];

subplot(313)
plot(diff(peaks));
Peter K.
fonte
4

parece que você está aplicando alguma função de janela em seu sinal (o gráfico de autocorrelação parece em janela)!

Para fazer seu trabalho, divida seu sinal em dados constantes emoldurados sobrepostos ou não, aplique a função de autocorrelação:

y(k)=n=0N1x(k)x(n+k)

No final, encontre a posição de pico e parabéns por ter encontrado o período!

Como fazer isso no matlab aqui

Ederwander
fonte
Não, não estou, e falando de picos, qual deles você quer dizer?
Mecanismo
o pico é o valor máximo no seu vetor de autocorrelação!
ederwander
meu período não pode ser 10000 meu vetor tem 10000 elementos?
Mecanismo
2
Não precisa ser aplicada uma função de janela. O estimador de autocorrelação padrão (tendencioso) produzirá um envelope triangular para a autocorrelação. Além disso, o pico da correlação automática sempre estará no centro; portanto, você precisa explicar um pouco mais o que você quer dizer com "encontrar a posição do pico". Suspeito que você queira encontrar o pico principal e depois o próximo maior pico mais próximo; a distância entre os dois será uma estimativa do período.
Peter K.
Você está certo, o enredo de @Engine parece ser um autocorrelantion padrão :-) Eu fiz isso usando matlab aqui
ederwander
0

Minha maneira preferida de descobrir o "período" do seu sinal é observar o espectro. Parece que o seu sinal tem uma forte onda senoidal com algum ruído. Se você pegar a FFT e plotar a magnitude, poderá ver em quais frequências são mais fortes (provavelmente corresponderão às RPM nas quais o motor está funcionando). O "período" do seu sinal será 1 dividido pela frequência do sinal. Se você tiver uma onda senoidal de 10Hz, seu período será de 0,1 segundos.

Jeremy
fonte