A detecção dos picos de sinal medido

votos
51

Nós usamos um cartão de aquisição de dados para fazer leituras a partir de um dispositivo que aumenta o seu sinal para um pico e, em seguida, cai de volta para perto do valor original. Para encontrar o valor de pico que atualmente procurar a matriz para a leitura mais alta e usar o índice para determinar o tempo do valor de pico que é usado em nossos cálculos.

Isso funciona bem se o valor mais alto é o pico que estamos procurando, mas se o dispositivo não está funcionando corretamente, podemos ver um segundo pico, que pode ser maior do que o pico inicial. Tomamos 10 leituras de um segundo de 16 dispositivos ao longo de um período de 90 segundos.

Meus pensamentos iniciais são para percorrer as leituras verificação para ver se os pontos anteriores e posteriores são menos do que o atual para encontrar um pico e construir uma série de picos. Talvez nós deve estar olhando para uma média de um número de pontos de cada lado da posição atual para permitir ruído no sistema. É esta a melhor maneira de proceder ou existem melhores técnicas?


Nós usamos LabVIEW e eu verifiquei os fóruns LAVA e há uma série de exemplos interessantes. Isso faz parte do nosso software de teste e estamos a tentar evitar o uso de muitas bibliotecas VI não-padrão, então eu estava esperando para feedback sobre o processo / algoritmos envolvidos em vez de código específico.

Publicado 06/08/2008 em 11:23
fonte usuário
Em outras línguas...                            


9 respostas

votos
82

Há muitos e muitos métodos de detecção de pico clássicos, qualquer dos quais pode trabalhar. Você vai ter que ver o que, em particular, limita a qualidade dos seus dados. Aqui estão as descrições básicas:

  1. Entre quaisquer dois pontos em seus dados, (x(0), y(0))e (x(n), y(n)), se somam y(i + 1) - y(i)para 0 <= i < ne chamar isso T( "travel") e defina R( "ascensão") para y(n) - y(0) + kpara adequadamente pequena k. T/R > 1indica um pico. Isso funciona bem se grande viagem devido ao ruído é improvável ou se o ruído distribui simetricamente em torno de uma forma de curva base. Para sua aplicação, aceitar a primeira pico com uma pontuação acima de um dado limiar, ou analisar a curva de deslocamento por valores aumentam para as propriedades mais interessantes.

  2. Use filtros adaptados para marcar semelhança com a forma de pico padrão (essencialmente, usar um produto dot normalizada contra alguma forma de obter um co-seno-métrica de similaridade)

  3. Deconvoluir contra uma forma pico do padrão e verificar se há valores altos (embora muitas vezes eu encontrar 2 a ser menos sensíveis ao ruído para a saída de instrumentação simples).

  4. Suavizar os dados e verificar se há trincas de pontos igualmente espaçados onde, se x0 < x1 < x2, y1 > 0.5 * (y0 + y2), ou verificar distâncias euclidianas como este: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), que conta com a desigualdade triangular. Usando relações simples voltará a fornecer-lhe um mecanismo de pontuação.

  5. Encaixar um modelo de mistura de 2 gaussian muito simples para seus dados (por exemplo, Numerical Recipes tem um pedaço de ready-made agradável de código). Tome o pico mais cedo. Isto irá lidar corretamente com picos sobrepostos.

  6. Encontrar a melhor correspondência nos dados a um Gaussian simples, Cauchy, Poisson, ou que-ter-você curva. Avalie esta curva em uma ampla faixa e subtrai-lo a partir de uma cópia dos dados depois de constatar a localização de pico. Repetir. Tome a primeira pico cujo modelo de parâmetros (desvio padrão provavelmente, mas alguns aplicativos podem se preocupam com curtose ou outros recursos) atender algum critério. Cuidado com os artefatos deixados para trás quando picos são subtraídos dos dados. Melhor jogo pode ser determinada pelo tipo de jogo de pontuação sugerida no item 2 acima.

Eu fiz o que você está fazendo antes: encontrar picos nos dados de seqüência de DNA, encontrar picos em derivativos estimados a partir de curvas medidas, e encontrar picos em histogramas.

Encorajo-vos a assistir atentamente a linha de base adequada. Wiener filtragem ou outra filtragem ou análise de histograma simples é muitas vezes uma maneira fácil de linha de base na presença de ruído.

Finalmente, se os seus dados estão normalmente barulhento e você está recebendo os dados fora do cartão como saída single-ended unreferenced (ou mesmo referenciada, apenas não diferencial), e se você estiver com média de lotes de observações em cada ponto de dados, tentar classificar os observações e jogando fora o primeiro e último quartil e média que resta. Há uma série de tais táticas de eliminação outlier que podem ser realmente útil.

Respondeu 04/09/2008 em 19:07
fonte usuário

votos
8

Você poderia tentar a média do sinal, ou seja, para cada ponto, em média, o valor com os cercam 3 ou mais pontos. Se os blips de ruído são enormes, então, mesmo isso pode não ajudar.

Sei que esta era a língua agnóstico, mas supondo que você está usando o LabVIEW, há lotes de processamento de pré-embalados sinal de VIs que vêm com LabView que você pode usar para fazer suavização e redução de ruído. Os fóruns da NI são um ótimo lugar para obter ajuda mais especializada neste tipo de coisa.

Respondeu 06/08/2008 em 12:12
fonte usuário

votos
6

Este problema tem sido estudado com algum detalhe.

Há um conjunto de muito up-to-date implementações nas TSpectrum*classes de ROOT (uma ferramenta de análise física nuclear / partícula). O código funciona em um a dados tridimensionais.

O código-fonte RAIZ está disponível, assim você pode pegar essa implementação, se quiser.

Do TSpectrum documentação da classe:

Os algoritmos utilizados nesta classe foram publicados nas seguintes referências:

[1] M.Morhac et al .: métodos de eliminação do fundo por espectros de raios gama multidimensional coincidência. Instruments nucleares e Métodos em Física Research A 401 (1997) 113- 132.

[2] M.Morhac et al .: um- eficiente e desconvolução ouro bidimensional e a sua aplicação a decomposição espectros de raios gama. Instruments nucleares e Métodos em Física Research A 401 (1997) 385-408.

[3] M.Morhac et al .: A identificação de picos no espectro de raios gama coincidência multidimensional. Instruments nucleares e Métodos de Pesquisa em Física A 443 (2000), 108-125.

Os papéis são ligados a partir da documentação da classe para aqueles de vocês que não têm uma assinatura on-line NIM.


A versão curta do que é feito é que o histograma achatado para eliminar o ruído, e depois máximos locais são detectados por força bruta no histograma achatado.

Respondeu 23/08/2008 em 15:28
fonte usuário

votos
5

Gostaria de contribuir para esta discussão um algoritmo que eu me desenvolvido :

Baseia-se no princípio de dispersão : se um novo ponto de dados é um dado x número de desvios padrão de distância de alguns, os sinais algoritmo médias móveis (também chamado índice z ). O algoritmo é muito robusto porque ele constrói um separado média móvel e desvio, de modo que os sinais não corrompem o limiar. Sinais futuros são, portanto, identificado com aproximadamente a mesma precisão, independentemente da quantidade de sinais anteriores. O algoritmo leva 3 entradas: lag = the lag of the moving window, threshold = the z-score at which the algorithm signalse influence = the influence (between 0 and 1) of new signals on the mean and standard deviation. Por exemplo, um lagde 5 usará os últimos 5 observações para suavizar os dados. Um thresholdde 3,5 sinalizará se um ponto de dados é de 3,5 desvios padrão de distância da média em movimento. E um influencede 0,5 dá sinais de metadeda influência que datapoints normais têm. Da mesma forma, um influencede 0 sinais ignora completamente para recalcular o novo limiar: uma influência de 0 é, portanto, a opção mais robusta.

Ele funciona da seguinte forma:

Pseudo-código

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

programa demonstrativo

Demonstração do algoritmo de limiarização robusta

> Resposta Original

Respondeu 03/11/2015 em 21:46
fonte usuário

votos
4

Este método é, basicamente, do livro "Visão" de David Marr

Gaussian Blur seu sinal com a largura prevista de seus picos. Isso se livrar de picos de ruído e seus dados fase não está danificado.

Em seguida, borda detectar (LOG vai fazer)

Então suas bordas eram as bordas de recursos (como picos). olhar entre as bordas para picos, classificar picos por tamanho, e está feito.

Eu tenho usado variações sobre isso e eles funcionam muito bem.

Respondeu 02/09/2008 em 02:00
fonte usuário

votos
2

Eu acho que você quer cruzar-se correlacionam o seu sinal com um sinal esperado, exemplar. Mas, ele tem sido um longo tempo desde que eu estudei processamento de sinal e mesmo assim eu não presta muita atenção.

Respondeu 06/08/2008 em 12:38
fonte usuário

votos
0

Existe uma diferença qualitativa entre o pico desejado eo segundo pico indesejada? Se ambos os picos são "sharp" - ou seja, de curta duração de tempo - quando se olha para o sinal no domínio da frequência (fazendo FFT) você vai ter energia na maioria das bandas. Mas se o "bom" pico tem confiável energia presente em frequências não existentes no pico "ruim", ou vice-versa, você pode ser capaz de diferenciá-los automaticamente assim.

Respondeu 02/09/2008 em 13:33
fonte usuário

votos
0

Eu não sei muito sobre instrumentação, então isso pode ser totalmente impraticável, mas, novamente, pode ser uma direção útil diferente. Se você sabe como as leituras podem falhar, e há um certo intervalo entre picos dadas tais falhas, por que não fazer gradiente descendente em cada intervalo. Se a descida traz de volta a uma área que você procurou antes, você pode abandoná-lo. Dependendo da forma da superfície da amostra, isso também pode ajudá-lo a encontrar picos mais rápido do que pesquisa.

Respondeu 06/08/2008 em 12:38
fonte usuário

votos
0

Você poderia aplicar algumas Devision padrão para a sua lógica e tomar conhecimento de picos com mais de x%.

Respondeu 06/08/2008 em 12:17
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more