Pergunta

nós temos um detector de partículas hard-wired para usar buffers de 16 bits e de 8 bits. De vez em quando, existem certas [previu] picos de fluxos de partículas que passam através dele; tudo bem. O que é não tudo bem é que esses fluxos geralmente atingem magnitudes acima da capacidade dos buffers para armazená-los; assim, transborda ocorrer. Em um gráfico, eles se parecem com o fluxo de repente cai e começa a crescer novamente. você pode propor um método [a maioria] precisa de detectar pontos de sofrimento dados de um estouro?

P.S. O detector está fisicamente inacessível, então corrigi-lo o 'caminho certo' substituindo os amortecedores não parece ser uma opção.

Update: Alguns esclarecimentos, conforme solicitado. Usamos python na instalação de processamento de dados; a tecnologia utilizada no próprio detector é muito obscuro (tratá-lo como se ele foi desenvolvido por terceiros completamente alheios), mas é definitivamente sem sofisticação, ou seja, não executando um sistema operacional 'real', apenas algumas coisas de baixo nível para registrar o detector leituras e responder a comandos remotos como ciclo de energia. corrupção de memória e outros problemas não são um problema agora. Os excessos ocorrer simplesmente porque o projectista do detector utilizado tampões de 16 bits para a contagem do fluxo de partículas, e, por vezes, o fluxo excede 65535 partículas por segundo.

Update 2: Como vários leitores têm para fora pontas, a solução destina teria algo a ver com a análise do perfil de fluxo para detectar quedas acentuadas (por exemplo, por uma ordem de magnitude) em uma tentativa de separar -los das flutuações normais. Outro problema surge: restaurações podem (pontos onde o fluxo originais cair abaixo do nível de transbordamento) ser detectada por simplesmente executando o programa de correção contra o revertido (pelo x eixo) perfil de fluxo

?
Foi útil?

Solução

int32[] unwrap(int16[] x)
{
   // this is pseudocode
   int32[] y = new int32[x.length];
   y[0] = x[0];
   for (i = 1:x.length-1)
   {
      y[i] = y[i-1] + sign_extend(x[i]-x[i-1]);
      // works fine as long as the "real" value of x[i] and x[i-1]
      // differ by less than 1/2 of the span of allowable values
      // of x's storage type (=32768 in the case of int16)
      // Otherwise there is ambiguity.
   }
   return y;
}

int32 sign_extend(int16 x)
{
   return (int32)x; // works properly in Java and in most C compilers
}

// exercise for the reader to write similar code to unwrap 8-bit arrays
// to a 16-bit or 32-bit array

Outras dicas

É claro que, idealmente você iria corrigir o software detector para fora max no 65535 para evitar envolvente do tipo que está causando sua dor. Eu entendo que isso nem sempre é possível, ou pelo menos não é sempre possível fazer rapidamente.

Quando o fluxo de partículas excede 65535, não é fazê-lo rapidamente, ou se o fluxo aumentar gradualmente e depois diminuir gradualmente? Isso faz uma diferença no que o algoritmo que você pode usar para detectar isso. Por exemplo, se o fluxo sobe devagar o suficiente:

true flux     measurement  
 5000           5000
10000          10000
30000          30000
50000          50000
70000           4465
90000          24465
60000          60000
30000          30000
10000          10000

então você vai tendem a ter um grande queda negativo nos momentos em que você tem transbordou. Uma gota negativo muito maior do que você vai ter em qualquer outro momento. Isso pode servir como um sinal de que você já transbordou. Para encontrar o fim do período de tempo de transbordo, você pode olhar para um grande salto para um valor não muito longe de 65535.

Tudo isso depende do fluxo máximo verdade que é possível e da rapidez com que o fluxo sobe e desce. Por exemplo, é possível obter mais de 128k conta em um período de medição? É possível para a medição de um ser 5000 e a próxima medição a ser 50000? Se os dados não são bem-comportado o suficiente, você pode ser capaz de fazer julgamentos única estatística sobre quando você transbordou.

A sua questão necessidades para fornecer mais informações sobre a sua implementação - o que a linguagem / framework que você está usando

Os dados transborda em software (que é o que eu acho que você está falando) são uma prática ruim e deve ser evitado. Enquanto você está vendo (saída de dados estranho) é apenas um efeito colateral que é possível quando experimentando transborda de dados, mas é apenas a ponta do iceberg dos tipos de problemas que você pode ver.

Você poderia facilmente ter problemas mais graves como a corrupção de memória, o que pode fazer com que programas falhar em voz alta, ou pior, obscuramente .

Existe alguma validação que você pode fazer para evitar os excessos ocorra em primeiro lugar?

Eu realmente não acho que você pode corrigi-lo, sem que fixa os buffers subjacentes. Como você deve saber a diferença entre as sequências de valores (0, 1, 2, 1, 0) e (0, 1, 65538, 1, 0)? Você não pode.

Que tal usar um HMM onde o estado oculto é se você está em um estouro e as emissões são fluxo de partículas observada?

A parte difícil seria chegar com os modelos de probabilidade para as transições (que basicamente codificam a escala de tempo de picos) e para as emissões (que você pode construir se você sabe como se comporta de fluxo e como estouro afeta medição ). Estas são questões específicas de domínio, então não há provavelmente não são soluções prontas lá fora.

Mas você tem o modelo, tudo o resto --- ajustando seus dados, quantificando a incerteza, a simulação, etc .--- é rotina.

Você só pode fazer isso se os saltos reais entre os valores sucessivos são muito menores do que 65536. Caso contrário, um artefato vale induzida por transbordamento é indistinguível de um vale de verdade, você só pode adivinhar. Você pode tentar igualar transborda para restaurações correspondente, analisando simultaneamente um sinal da direita e da esquerda (assumindo que há uma linha de base reconhecível).

Fora isso, tudo o que você pode fazer é ajustar sua experiência repetindo-lo com diferentes partículas originais fluxos, de modo que vales reais não vai mudar, mas os artefatos mover a ponto de transbordar.

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