Monday, 4 December 2017

Moving average c código fonte no Brasil


Eu sei que isso é possível com o impulso como por: Mas eu realmente gostaria de evitar usar o impulso. Eu tenho googled e não encontrei qualquer exemplos adequados 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 números de 1000 mais recentes 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 de 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 o 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 quotvoid (amostra T) é na verdade 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 em 14: 27É 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 precisando de 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 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, IncC algoritmo para zero-latência exponencial de média móvel Última atualização: 2017-08-13 Eu tenho tentado implementar um corte de baixa freqüência em c que essencialmente tem um fluxo de números e smoo Ths out a saída (filtragem de alta freqüência movementjitter), no entanto, é importante que os números ponderados dianteiros são considerados imediatamente como os dados é tempo crítico (é para controlar uma base de simulação de movimento usando a saída de um pouco de software de jogo). Eu tenho um algoritmo de média móvel ponderada de trabalho, mas poderia fazer com algo um pouco mais responsivo no front end, e eu achei isso: - O pseudo-código lá é o seguinte: Entradas: Price (NumericSeries), Period (NumericSimple) Variáveis: Fator (0) se a Barra Atual lt 1 então começa ZLEMA Fator de preço 2 (Period1) lag (Período-1) 2 end else begin Fator ZLEMA (2Price-Pricelag) (1-factor) ZLEMA1 end Ive traduzido em Para C e meu código é o seguinte: No entanto, ele doesnt parecem se comportar bastante como Id esperar. Parece estar quase lá, mas às vezes eu recebo um valor ligeiramente menor do que todos os itens na fila (quando eles são todos mais elevados). Minha fila e o número de itens nele são passados ​​como parâmetros, sendo o mais recente na frente em todos os momentos, também eu passar um contador de incremento começando em 0 como exigido pela função. Eu não tenho certeza Ive interpretou o significado de ZLEMA1 corretamente como seu não claro em seu pseudocódigo, então Ive assumiu que este é o último zlema chamadas e também Im assumindo preço realmente significa Price0. Talvez eu tenho este errado Eu deveria estar copiando os valores reais zlema calculado de volta à minha fila original antes da próxima chamada Eu não mudar a fila original em todos os outros que apenas deslocando todos os valores um para o fim e inserindo o mais recente no início . O código que eu uso para fazer isso é: Seria extremamente grato se alguém com uma melhor compreensão da matemática poderia agradar sanidade verificar isso para mim para ver se eu tenho algo ligeiramente errado Obrigado com antecedência se você pode ajudar Em primeiro lugar, graças a todos por Sua entrada, muito apreciado Isso faz sentido eu acho, então eu suponho que então o melhor que eu posso esperar é simplesmente uma média móvel exponencial, aceitando haverá um pequeno atraso, mas isso será minimizado pela ponderação mais pesada frente do que o dado em tipcial ponderada Eu tenho este algoritmo também, mas um problema semelhante em que os valores não parecem muito corretos (a menos que esta seja a natureza da fórmula). Por exemplo, digamos que minha matriz contém 16 valores, todos os 0.4775 - a saída é 0.4983, mas Id espero que seja 0.4775 Isso parece certo para você. Média móvel exponencial. Float ema (float vals, int numVals, int currentSample) estático float factor 0 static float lastema 0 float ema se (currentSample lt 1) ema vals0 fator 2.0 ((float) numVals) 1.0 ou mais ema (factor vals0) Inversamente, às vezes a saída é menor do que cada uma das entradas, mesmo se todos são mais elevados. É chamado da mesma forma que zlema (.) Acima, com um contador de incremento. A fórmula e pseudocódigo para este estão aqui: - autotradingstrategy. wordpress20091130exponential-moving-average Obrigado novamente, desculpas para o meu mal-entendido de alguns dos princípios :( Kind regards, Chris J Quanto ao código que eu postei, você está certo sobre o tamanho do array Isso deve ser facilmente corrigido Quanto às suas perguntas: 1) A constante do filtro representa um corte de freqüência. Eu usei um Digital Signal Processing (DSP) para esta técnica. En. wikipedia. orgwi kiLow-pas sfilter é uma explicação simples. Você deseja a seção Discrete-Time Realization. No meu caso, o A é o RC-Constant que eles falam. Assim a freqüência que corta para fora está acima de 1 (2piA). Se você não tem uma compreensão da teoria de domínio de freqüência, isso pode ficar complicado. No seu caso, Quanto mais alto você faz A, menor a freqüência que este filtro permitirá, o que significa que vai suavizar a curva mais e mais. Quanto mais baixo você fizer, mais ruído é permitido no sistema. Lembre-se A deve ser maior ou igual a 1 para ser eficaz. Eu reattached o XLS outra vez, esta vez sem os números mudando do rand (). Ajustar a constante A e ver como quotsmoothsquot (ou filtros) as variações de alta freqüência. 2) O último ponto da matriz de entrada tem o valor mais recente. 3) O mesmo é verdadeiro para a matriz de saída. O último é o valor mais recente. 5) O NUMVALS é arbitrário. Você pode adicionar continuamente para a matriz de entrada e saída quantas vezes você gosta e não afetaria o filtro. Em particular, usei 49 pontos. Mas eu posso apagar facilmente os últimos 20 e as primeiras 29 saídas permanecerão as mesmas. A função não é baseada em quantos pontos estão sendo usados. Gostaria de mencionar que desenvolvi esta função para uma conversão única. Se você quisesse fazer uma conversão para o valor seguinte na mosca você poderia tentar algo mais simples (como unido). Novamente Im rusty em c. Espero que isto esteja certo. A única coisa que você precisaria fornecer é a constante de entrada e filtro. Avise-me se isso ajudar.

No comments:

Post a Comment