Tuesday, 14 November 2017

Movendo média filtro c código fonte


É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats um poder de dois para permitir bit-shifting em vez de dividir, mas não necessitando Um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito recursivamente como Então você sempre precisa lembrar a amostra xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, onde as amostras mais no passado obter um menor peso, mas (pelo menos em teoria) você nunca se esqueça nada (os pesos apenas ficar menor e menor para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento GPS que eu escrevi. Eu começo com 1 amostra e dividir por 1 para obter o avg atual. Eu adiciono então uma outra amostra e divido por 2 à corrente avg. Isso continua até que eu chegar ao comprimento da média. Cada vez depois, eu adiciono na nova amostra, obter a média e remover essa média do total. Eu não sou um matemático, mas isso parecia ser uma boa maneira de fazê-lo. Eu imaginei que iria transformar o estômago de um cara de matemática real, mas, verifica-se que é uma das formas aceitas de fazê-lo. E ele funciona bem. Basta lembrar que quanto maior o seu comprimento, mais lento é seguir o que você deseja seguir. Isso pode não importar a maior parte do tempo, mas quando os satélites seguintes, se você é lento, a trilha poderia estar longe da posição real e vai ficar mal. Você poderia ter uma lacuna entre o sat e os pontos de arrasto. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter alisamento adequado e não ficar muito longe da posição real sentado com os pontos de trilha suavizada. Respondida Nov 16 16 at 23:03 initialize total 0, count0 (cada vez vendo um novo valor Então uma entrada (scanf), um add totalnewValue, um incremento (count), uma divide average (totalcount) Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma das 4 variáveis ​​de entrada, dividida por 4 Bom se todos os insumos foram positivos para fazer o cálculo médio respondido Feb 3 15 at 4:06 Isso vai realmente calcular a média total e não a média móvel. Como a contagem fica maior o impacto de qualquer nova amostra de entrada torna-se ndash nitidamente pequeno Hilmar fevereiro 3 15 at 13:53 Sua resposta 2017 Stack Exchange, IncI sei que isso é alcançável com o impulso como por: Mas eu realmente gostaria de evitar o uso de impulso. Eu tenho googled e não encontrei qualquer exemplos adequados ou legível. Basicamente eu quero rastrear o Movendo Média de um fluxo contínuo de um fluxo de números de ponto flutuante usando os números mais recentes de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso que eu experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades. Se suas necessidades são simples, você pode apenas tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador, e como seu código olha para cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, Im realmente não tenho certeza que isso é adequado para você, agora que Ive colocá-lo aqui. O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Não tenho certeza se há um alfa que iria espalhar a média nos últimos 1000 números, sem subfluxo no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 em 4:44 1 em seu borne. A média móvel exponencial pode permitir que a alfa seja variável. Portanto, isto permite que ele seja usado para calcular médias de base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última actualização do acumulador for superior a 1 segundo, deixe alfa ser 1.0. Caso contrário, você pode deixar alfa ser (usecs desde a última atualização1000000). Ndash jxh 12 de junho de 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Observe que o abaixo atualiza o total como elementos como addedreplaced, evitando costal O (N) traversal para calcular a soma - necessária para a média - on demand. Total é feito um parâmetro diferente de T para suporte, e. Usando um longo longo quando totalizando 1000 s longos, um int para char s, ou um dobro ao total float s. Este é um pouco falho em que numsamples poderia ir passado INTMAX - se você se importa que você poderia usar um unsigned longa. Ou usar um membro de dados bool extra para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples ao redor da matriz (melhor então renomeado algo inócuo como pos). Respondida em 12 de junho de 12 às 5:19, assume-se que o operador de quotvoid (amostra T) é realmente operador quotvoid (T amostra) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer para ser vazio operador () (T amostra), mas é claro que você poderia usar qualquer nota que você gostava. Will fix, obrigado. Ndash Tony D Jun 8 14 at 14: 27Faço médio, ou categoria média do filtro. Processamento digital de sinais e imagens (DSP e DIP). Abstrato. O artigo é um guia prático para filtro médio, ou entendimento e implementação de filtro médio. Artigo contém teoria, código-fonte C, instruções de programação e aplicação de exemplo. 1. Introdução ao filtro médio, ou filtro médio Filtro médio. Ou filtro médio é o filtro de janela da classe linear, que suaviza o sinal (imagem). O filtro funciona como low-pass um. A idéia básica por trás do filtro é para qualquer elemento do sinal (imagem) ter uma média em toda a sua vizinhança. Para entender como isso é feito na prática, vamos começar com a idéia da janela. 2. Janela de filtro ou máscara Vamos imaginar, você deve ler uma carta eo que você vê no texto restrito pelo buraco em stencil especial como este. Assim, o resultado da leitura é t sadio. Ok, vamos ler a carta novamente, mas com a ajuda de outro estêncil: Agora o resultado da leitura t é som 240. Vamos fazer a terceira tentativa: Agora você está lendo a letra t como som 952. O que acontece aqui Para dizer que Na linguagem matemática, você está fazendo uma operação (leitura) sobre o elemento (letra t). E o resultado (som) depende do elemento vizinhança (letras ao lado de t). E esse estêncil, que ajuda a pegar a vizinhança do elemento, é a janela Sim, a janela é apenas um estêncil ou padrão, por meio do qual você está selecionando o elemento vizinhança 0151 um conjunto de elementos em torno do dado 0151 para ajudá-lo a tomar uma decisão. Outro nome para a janela de filtro é máscara 0151 máscara é um estêncil, que esconde elementos que não estão prestando atenção. Em nosso exemplo, o elemento em que estamos operando está posicionado à esquerda da janela, na prática no entanto sua posição usual é o centro da janela. Vejamos alguns exemplos de janelas. Em uma dimensão. FIG. 4. Janela ou máscara de tamanho 5 em 1D. Em duas dimensões. FIG. 5. Janela ou máscara de tamanho 3times3 em 2D. Em três dimensões. Pense em construir. E agora mdash sobre quarto nesse edifício. O quarto é como janela 3D, que corta alguns subespaço de todo o espaço do edifício. Você pode encontrar janela 3D em volume (voxel) processamento de imagem. 3. Compreender filtro médio Agora vamos ver, como ldquotake uma média através de elementos de vizinhança. A fórmula é simples 0151 somar elementos e dividir a soma pelo número de elementos. Por exemplo, vamos calcular uma média para o caso, representada na fig. 7. FIG. 7. Tomando uma média. E isso é tudo. Sim, nós apenas filtraram o sinal 1D pelo filtro médio Deixe-nos fazer o resumo e escrever para baixo instruções passo a passo para processar pelo filtro médio. Filtro médio ou algoritmo médio de filtragem: Coloque uma janela sobre o elemento Pegue uma média de 0151 somando elementos e divida a soma pelo número de elementos. Agora, quando temos o algoritmo, é hora de escrever algum código mdash vamos descer para a programação. 4. 1D média filtragem programação Nesta seção desenvolvemos 1D médio filtro com janela de tamanho 5. Vamos ter 1D sinal de comprimento N como entrada. O primeiro passo é colocar a janela 0151 fazemos isso alterando o índice do elemento principal: Preste atenção, que estamos começando com o terceiro elemento e terminando com o último mas dois. O problema é que não podemos começar com o primeiro elemento, porque neste caso a parte esquerda da janela de filtro está vazia. Discutiremos abaixo, como resolver esse problema. A segunda etapa está tomando a média, ok: Agora, deixe-nos anotar o algoritmo como a função: O elemento do tipo poderia ser definido como: 5. Tratar bordas Para todos os filtros da janela há algum problema. Isso é tratamento de borda. Se você colocar a janela sobre o primeiro (último) elemento, a parte esquerda (direita) da janela estará vazia. Para preencher a lacuna, o sinal deve ser estendido. Para o filtro médio há uma boa idéia para estender sinal ou imagem simetricamente, como este: Então, antes de passar o sinal para a nossa função de filtro média o sinal deve ser estendido. Vamos escrever o invólucro, que faz todos os preparativos. Como você pode ver, nosso código leva em conta algumas questões práticas. Em primeiro lugar, verificamos que os nossos parâmetros de entrada 0151 não devem ser NULL eo sinal deve ser positivo: Segundo passo 0151, verificamos o caso N1. Este caso é especial, porque para construir a extensão precisamos de pelo menos dois elementos. Para o sinal de 1 comprimento de elemento o resultado é o próprio sinal. Também preste atenção, nosso filtro médio funciona no local, se o resultado do parâmetro de saída for NULL. Agora vamos alocar memória para extensão de sinal. E verificar a alocação de memória.

No comments:

Post a Comment