Localizando picos locais entre amostras

10

Eu tenho amostras discretas de um sinal sísmico : y [ n ]ny[n]insira a descrição da imagem aqui

Quero encontrar máximos locais no sinal.

Um teste ingênuo para se for o máximo seria: y [ n ] : m a x i m a  se  y [ n ] > y [ n - 1 ]  e  y [ n ] > y [ n + 1 ]y[n]

y[n]:mumaxEumuma E se y[n]>y[n-1 1] e y[n]>y[n+1 1]

No entanto, os máximos provavelmente estão localizados entre as amostras, por exemplo, pode haver um máximo em .Eu=4,25

Para encontrar o máximo entre as amostras, acredito que preciso interpolar .y[n]

  • Como encontro os máximos usando a interpolação?
  • Que forma de interpolação devo usar?

Como você pode ver, meu sinal não é muito barulhento, no entanto, seria bom se o método também filtrasse um pouco, para que os máximos excedessem um limite e tivessem uma certa largura (sem picos).

Meu maior problema, no entanto, é apenas encontrar picos entre as amostras. Alguma sugestão para uma boa maneira de fazer isso?

Agradecemos antecipadamente por qualquer resposta!

Andy
fonte
11
Talvez veja a pergunta 1 e a pergunta 2 .
Geerten 21/03
Vários métodos para espectros de freqüência: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith
Esse segundo um não tem uma resposta @Geerten ;-)
Ivo Flipse
11
Oh..haha, bom ponto. Bem, eu vou referência de volta a esta pergunta sobre essa questão;)
Geerten

Respostas:

7

Obtendo uma resolução de subamostra

Uma solução muito barata (em termos de tamanho do código) é apenas para ampliar o seu sinal. No matlab, isso pode ser feito com interp(y ,ratio). Uma solução um pouco mais complicada consiste em detectar ingenuamente picos; e para cada pico, ajustando uma parábola através de y [pico - 1], y [pico], y [pico + 1]; depois, use o ponto em que essa parábola é máxima como a verdadeira posição do pico.

Em relação à detecção de pico

Um monte de técnicas que ajudam a:

  • Conforme sugerido por Hilmar, convencendo o sinal por uma janela Gaussiana ou Hann, cuja largura é aproximadamente igual à metade do intervalo mínimo que você deseja ver entre os picos detectados. Como a precisão temporal parece essencial para a sua aplicação, certifique-se de levar em consideração o atraso de tempo introduzido pela filtragem!
  • Subtraia ao seu sinal uma versão mediana filtrada de si mesma (com uma janela de observação bastante grande); e divida o resultado por uma versão filtrada de desvio padrão de si mesma. Isso elimina as tendências e permite que os limites sejam expressos em unidades de desvios padrão.
  • Para a coleta de pico, eu formulo isso usando um filtro "cartola". Defina a versão filtrada da cartola do seu sinal como yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); e use como picos os pontos onde y [n] == yt [n] e y [n]> limite.

Tudo isso pode ser implementado com muita eficiência no Matlab com algumas passagens do nlfilter.

pichenettes
fonte
A combinação de upsampling mais interpolação parabólica pode funcionar melhor do que sozinha.
hotpaw2
3

Experimente um detector de pico com perdas:

y[n] = max(abs(x[n]),a*y[n-1]);

onde "a" é um número menor que 1 que controla a rapidez com que o detector decai. Ele determina o quão perto os picos vizinhos podem estar sem esmagar em um único. Em seguida, faça uma detecção de limite.

Hilmar
fonte
Você tem ax [n] e y [n] em sua equação. Isso está correto ou deveria ser apenas y [n]?
21312 Andy
x [n] é a entrada, y [n] é a saída. Resposta ruim em geral, há um erro de digitação (corrigido agora) e eu entendi mal a pergunta. Desculpas
Hilmar 22/03