суббота, 23 июня 2018 г.

Filtro médio móvel no código c


É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras. Achei que posso otimizar um pouco, escolhendo um tamanho de janela que é um poder de dois para permitir a mudança de bits em vez de dividir, mas não precisar Um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, 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 de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme demonstrado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam cada vez menores e menores 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 divide por 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou matemático, mas isso pareceu uma boa maneira de fazê-lo. Eu pensei que isso tornaria o estômago de um verdadeiro matemático, mas, parece que é uma das maneiras aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que você deseja seguir. Isso pode não importar a maior parte do tempo, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição real e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um período de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondido 16 de novembro 16 às 23:03 inicializar total 0, count0 (cada vez que vê um novo valor Então uma entrada (scanf), uma adicionar totalnewValue, um incremento (contagem), uma média de divisão (total total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média sobre apenas as ú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 soma das 4 variáveis ​​de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido 3 de fevereiro 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2017 Stack Exchange, filtro IncMean ou categoria de filtro médio. Desenvolvimento de software de processamento de sinais e imagens digitais (DSP e DIP). Resumo. O artigo é um guia prático para filtro médio ou filtro médio Compreensão e implementação. O artigo contém teoria, código-fonte C, instruções de programação e aplicação de amostra. 1. Introdução ao filtro médio, ou filtro médio do filtro médio. Ou filtro médio é um filtro de janela de classe linear, que suaviza o sinal (imagem). O filtro funciona como de passagem baixa. A idéia básica por trás do filtro é que qualquer elemento do sinal (imagem) tenha uma média em sua vizinhança. Para entender como isso é feito na prática, comecemos com a idéia da janela. 2. Filtrar a janela ou a máscara. Imagine, você deve ler uma carta e o que você vê em texto restrito por furo em um gabarito especial como este. Então, o resultado da leitura é som t. Ok, deixe-nos ler a carta novamente, mas com a ajuda de outro estêncil: agora o resultado da leitura é o som 240. Vamos fazer a terceira tentativa: agora você está lendo a letra t como som 952. O que acontece aqui Para dizer isso Em linguagem matemática, você está fazendo um elemento de operação (leitura) sobre (letra t). E o resultado (som) depende da vizinhança do elemento (letras próximas a t). E esse estêncil, que ajuda a retirar a vizinhança de elementos, é janela Sim, a janela é apenas um estêncil ou padrão, por meio do qual você está selecionando a vizinhança do elemento 0151 um conjunto de elementos em torno do dado 0151 para ajudá-lo a tomar uma decisão. Outro nome para janela de filtro é máscara 0151 máscara é um estêncil, que esconde elementos que não estamos prestando atenção. No nosso exemplo, o elemento em que estamos operando posiciona-se no lado esquerdo da janela, na prática, no entanto, sua posição usual é o centro da janela. Deixe-nos ver 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 3x3 em 2D. Em três dimensões. Pense em construir. E agora mdash sobre o quarto nesse edifício. A sala é como janela 3D, que corta algum subespaço de todo o espaço do edifício. Você pode encontrar a janela 3D em volume (voxel) processamento de imagem. 3. Compreendendo o filtro médio Agora, vejamos, como ldquota uma média entre os elementos vizinhança. A fórmula é simples 0151 resumir 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, acabamos de filtrar o sinal 1D por meio do filtro. Realizemos currículo e anote instruções passo a passo para processamento por meio do filtro. Filtro médio ou algoritmo de filtro médio: Coloque uma janela sobre o elemento Pegue uma média de 0151 elementos resumidos e divida a soma pelo número de elementos. Agora, quando temos o algoritmo, é hora de escrever algum código mdash, vamos até a programação. 4. Programação de filtro médio 1D Nesta seção, desenvolvemos 1D filtro médio com janela de tamanho 5. Deixe-nos ter sinal 1D de comprimento N como entrada. O primeiro passo é a janela colocando 0151, fazemos isso alterando o índice do elemento principal: preste atenção, que estamos começando com o terceiro elemento e terminando com os últimos, mas dois. O problema é que não podemos começar com o primeiro elemento, porque neste caso, a parte esquerda da janela do filtro está vazia. Vamos discutir a seguir, como resolver esse problema. O segundo passo é tomar a média, ok: agora, digamos o algoritmo como função: O elemento de tipo pode ser definido como: 5. Bordas de tratamento Para todos os filtros de janela, há algum problema. Isso é um 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 o sinal ou a imagem simetricamente, assim: então, antes de passar o sinal para a nossa função de filtro média, o sinal deve ser estendido. Deixe-nos escrever o invólucro, o que faz todos os preparativos. Como você pode ver, nosso código leva em conta alguns problemas práticos. Antes de tudo, verificamos os nossos parâmetros de entrada. O sinal 0151 não deve ser NULL e o comprimento do sinal deve ser positivo: o 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 elemento, o resultado é o próprio sinal. Além disso, preste atenção, nosso filtro médio funciona no local, se o resultado do parâmetro de saída for NULL. Agora, alocemos a memória para a extensão do sinal. E verifique a alocação de memória. Sei que isso é viável com o aumento de acordo com: Mas eu realmente gostaria de evitar usar o impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequavam minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, à medida que seu código examina 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ê precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D 8 de junho às 14:27

Комментариев нет:

Отправить комментарий