Pergunta

Nós usamos uma placa de aquisição de dados para fazer leituras a partir de um dispositivo que aumenta o seu sinal para um pico e, em seguida, volta para perto do valor original.Para encontrar o valor de pico que atualmente pesquisa a matriz para a leitura mais alta e usar o índice para determinar o tempo de o valor de pico, que é usado em 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.Levamos 10 leituras de um segundo, a partir de 16 de dispositivos de 90 segundo período.

Meus pensamentos iniciais são para percorrer as leituras de verificar para ver se a anterior e a próxima pontos a menos do que o atual para encontrar um pico e a construção de uma matriz de picos.Talvez devêssemos olhar para uma média de um determinado 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?


Fazemos uso do LabVIEW e tenho verificado o LAVA fóruns e há uma série de exemplos interessantes.Isso é parte do nosso teste de software e estamos tentando evitar o uso de demasiadas não-padrão VI bibliotecas então eu estava esperando para feedback sobre o processo/algoritmos envolvidos em vez de código específico.

Foi útil?

Solução

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

Eu me dou conta de que esta era a linguagem agnóstico, mas supondo que você está usando o LabView, há muitas pré-embalados de processamento de sinal VIs que vêm com o LabView, que você pode usar para fazer alisamento e redução de ruído.O NI fóruns são um ótimo lugar para obter mais ajuda especializada nesse tipo de coisa.

Outras dicas

Há muitos e muitos pico clássico métodos de detecção, o que poderia funcionar.Você vai ter que ver o que, em particular, dos limites a qualidade de seus dados.Aqui estão as descrições básicas:

  1. Entre dois pontos quaisquer de seus dados, (x(0), y(0)) e (x(n), y(n)), adicionar y(i + 1) - y(i) para 0 <= i < n e chamar isso de T ("a viagem") e conjunto R ("origem") para y(n) - y(0) + k para devidamente pequeno k. T/R > 1 indica um pico.Isso funciona OK se viagens grandes, devido ao ruído, é improvável ou se o ruído distribui simetricamente em torno de uma curva base da forma.Para a sua aplicação, aceitar a primeira pico com uma pontuação acima de um determinado limite, ou analisar a curva de viagens por aumento de valores para mais interessantes propriedades.

  2. Use filtros combinados para pontuação de semelhança a um padrão de formato de pico (essencialmente, o uso de um normalizado ponto-produto contra alguns de forma a obter um co-seno-métrica de similaridade)

  3. Deconvolve contra um padrão de formato de pico e de seleção para valores altos (apesar de muitas vezes eu encontrar 2 para ser menos sensível ao ruído por simples instrumentação de saída).

  4. Suavizar os dados e verificar trigêmeos de pontos igualmente espaçados, onde, se x0 < x1 < x2, y1 > 0.5 * (y0 + y2), ou check-Euclidiana distâncias como esta: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), que se baseia no triângulo desigualdade.Usando simples rácios irá novamente oferecer-lhe uma pontuação de mecanismo.

  5. Ajuste muito simples, de 2 de gauss mistura do modelo aos dados (por exemplo, Receitas Numérica tem um bom ready-made pedaço de código).Tomar anterior de pico.Isto irá lidar corretamente com a sobreposição de picos.

  6. Encontrar a melhor correspondência nos dados para uma simples Gauss, Cauchy, Poisson, ou que-ter-lhe curva.Avaliar esta curva através de uma ampla gama, e subtraí-la a partir de uma cópia dos dados, depois de notar que o pico de localização.Repita.Tomar a primeira pico cujos parâmetros de modelo (desvio-padrão, provavelmente, mas alguns aplicativos podem cuidados sobre curtose ou outros recursos) cumprir algum critério.Atente para os artefatos deixados para trás quando os picos são subtraídos dos dados.Melhor correspondência pode ser determinada pelo tipo de correspondência pontuação sugerida em #2 acima.

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

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

Finalmente, se seus dados são normalmente barulhenta e você está recebendo dados do cartão de como não referenciados single-ended de saída (ou mesmo referenciado, apenas não diferencial), e se você estiver com média de lotes de observações em cada ponto de dados, tente classificar essas observações e jogando fora o primeiro e o último quartil e a média, o que permanece.Há uma série de tais eliminação de outliers táticas que podem ser realmente úteis.

Este problema tem sido estudado em detalhe.

Há um conjunto de up-to-date implementações no TSpectrum* classes de RAIZ (nuclear/física de partículas ferramenta de análise).O código funciona em um - três-dimensional de dados.

A RAIZ do código-fonte está disponível, então você pode pegar esta aplicação se você quiser.

Do TSpectrum documentação da classe:

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

[1] M. Morhac et al.:Fundo métodos de eliminação de multidimensional coincidência gama-ray espectros.Instrumentação Nuclear e Métodos de Investigação em Física de Um 401 (1997) 113- 132.

[2] M. Morhac et al.:Eficiente - e bidimensional de Ouro deconvolução e sua aplicação para gamma-ray espectros de decomposição.Nuclear Instrumentos e Métodos Investigação Em Física De Um 401 (1997) 385-408.

[3] M. Morhac et al.:Identificação dos picos multidimensional coincidência gama-ray espectros.Instrumentação Nuclear e Métodos em Pesquisa de Física de Uma 443(2000), 108-125.

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


A versão curta do que é feito é que o histograma achatada para eliminar o ruído e, em seguida, local maxima são detectados pela força bruta no achatada histograma.

Eu gostaria de contribuir para esta discussão um algoritmo que Desenvolvi-me:

Ele é baseado no princípio de a dispersão:se um novo ponto de dados é um dado x número de desvios padrão de distância de alguns movendo-se dizer, o algoritmo de sinais (também chamado de z-score).O algoritmo é muito robusto porque ele constrói uma separado movendo-se da média e do desvio, de tal forma que os sinais de não corromper o limite.Futuro sinais são, portanto, identificado com aproximadamente a mesma precisão, independentemente da quantidade anterior de sinais.O algoritmo leva de 3 entradas: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals e influence = the influence (between 0 and 1) of new signals on the mean and standard deviation.Por exemplo, um lag 5 vai usar últimos 5 observações para suavizar os dados.Um threshold 3.5 será o sinal se um ponto de dados é de 3,5 desvios-padrão longe de movimento médio.E um influence de 0,5 dá sinais de metade da influência que o normal datapoints ter.Da mesma forma, uma influence de 0 ignora os sinais completamente para recalcular o novo valor:uma influência de 0 é, portanto, a opção mais robusta.

Ele funciona da seguinte forma:

Pseudocó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

Demonstração

Demonstration of robust thresholding algorithm

> Original responder

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

Gaussian blur seu sinal com a expectativa de largura de seus picos.isso elimina picos de ruído e sua fase de dados está danificado.

Em seguida, edge detect (LOG vai fazer)

Em seguida, as extremidades foram as bordas de recursos (como picos).olhar entre as bordas para picos, picos de classificação por tamanho, e você está feito.

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

Eu acho que você quiser faça a correlação cruzada o seu sinal com uma esperado, a exemplo de sinal.Mas, ele tem sido um longo tempo desde que eu estudei de processamento de sinal e mesmo assim eu não demorar tanto tempo para perceber.

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

Há uma diferença qualitativa entre o pico desejado e o indesejado segundo pico?Se ambos os picos são "sharp" -- i.e.curto tempo de duração, quando olhando para o sinal no domínio da frequência (fazendo FFT) que você terá de energia na maioria das bandas.Mas se o "bom" pico de forma fiável tem energia presente em frequências não existente na "bad" de pico, ou vice versa, poderá ser capaz de automaticamente diferenciá-los dessa forma.

Você pode aplicar alguns Desvio Padrão a sua lógica e tomar conhecimento de picos com mais de x%.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top