Friday, 29 December 2017

Moving average in c language


Eu estou tentando fazer um filtro de média móvel em linguagem C, Ive adaptado um programa matlab que funciona corretamente, a entrada do meu filtro é um arquivo. pcm (um sinal de varredura de áudio), o problema para mim é o arquivo de saída do movimento Média na linguagem C, a saída vai mal, o sinal só diminui ao longo do tempo (não filtter). Abaixo do meu código C: A imagem abaixo é a saída do programa matlab para a média móvel com comprimento 16: Esta imagem é a saída em linguagem C com média móvel com comprimento 16: Alguém sabe o que pode ser Abaixo do código em matlab, que Ive Adaptado: Atualização 1 (Usando a resposta acima): O início do sinal ainda com interferência, mas a partir do meio para o final do sinal é corretamente. Eu quero desenvolver cálculo para a média móvel de preço das ações. Mas muitos cálculos complexos foram planejados mais tarde. Meu primeiro passo para saber como calcular a média móvel de forma eficiente. Eu preciso saber como tomar a entrada e retorno de saída de forma eficiente. Considerado data e preço de entrada. Data, Preço e Média Móvel. Se eu tiver 500 registros e eu quero calcular média móvel por 5 dias o que é a maneira effient em vez de ir para a frente e para trás na matriz de data e preço novamente sugerir o que é a melhor maneira de receber entrada (ArrayList, Table, array Etc) e retorno de saída. Nota: MA de hoje de 5 dias será média dos últimos 5 dias incluindo preço de hoje. Ontem MA será média dos últimos 5 dias de ontem. Eu quero manter os dias para ser flexível em vez de 5 ele poderia ser 9, 14, 20 etc Se você precisa de cálculo simples sem o seu esforço do que você pode usar TA-Lib. Mas se você quiser que seu cálculo seja mais eficiente do que o TA-Lib, então você pode criar seu próprio indicador técnico. TA-Lib é grande, mas o problema é que esta biblioteca tem apenas métodos estáticos. Isso significa que quando você precisa calcular os valores da matriz SMA com base em barras de preço de 500, então você enviará toda a matriz de barras e ele retornará matriz de valores SMA. Mas se você receber novo valor 501-st, então você deve enviar novamente toda a matriz e TA-Lib novamente calculará e retornará SMA matriz de valores. Agora imagine que você precisa desse indicador no feed de preços reais, e para cada mudança de preço você precisa de um novo valor indicador. Se você tem um indicador não é um grande problema, mas se você tiver centenas de indicadores de trabalho, que poderia ser um problema de desempenho. Eu estava em tal situação e começar a desenvolver indicadores em tempo real que são eficientes e fazer cálculos adicionais para a nova barra de preços ou para a barra de preço alterado apenas. Unfortunatelly Eu nunca precisei SMA indicador para os meus sistemas de negociação, mas eu tenho tal para EMA, WMA, AD, e outros. Um desses indicadores AD é publicado no meu blog e você pode ver a partir daí o que é a estrutura básica da minha classe indicador em tempo real. Espero que você vai precisar de pequenas mudanças para implementar SMA indicador, porque é um dos mais simples. A lógica é simples. Para calcular SMA tudo que você precisa é n últimos preços. Assim classe instância terá coleta de preços, que irá armazenar manter apenas último n número de preços como SMA é definido (no seu caso 5). Então, quando você tem um novo bar, você removerá o mais antigo e adicionará um novo e criará um cálculo. Quinta-feira, 10 de abril de 2008 16:04 Todas as respostas Há uma biblioteca chamada TA-Lib que faz tudo isso para você e é de código aberto. Tem cerca de 50 indicadores eu acho. Weve usou-o no ambiente da produção e é muito eficiente e realible. Você pode usá-lo em C, Java, C, etc Se você precisa de um cálculo simples sem o seu esforço do que você pode usar TA-Lib. Mas se você quiser que seu cálculo seja mais eficiente do que o TA-Lib, então você pode criar seu próprio indicador técnico. TA-Lib é grande, mas o problema é que esta biblioteca tem apenas métodos estáticos. Isso significa que quando você precisa calcular os valores da matriz SMA com base em barras de preço de 500, então você enviará toda a matriz de barras e ele retornará matriz de valores SMA. Mas se você receber novo valor 501-st, então você deve enviar novamente toda a matriz e TA-Lib novamente calculará e retornará SMA matriz de valores. Agora imagine que você precisa desse indicador no feed de preços reais, e para cada mudança de preço você precisa de um novo valor indicador. Se você tem um indicador não é um grande problema, mas se você tiver centenas de indicadores de trabalho, que poderia ser um problema de desempenho. Eu estava em tal situação e começar a desenvolver indicadores em tempo real que são eficientes e fazer cálculos adicionais para a nova barra de preços ou para a barra de preço alterado apenas. Unfortunatelly Eu nunca precisei SMA indicador para os meus sistemas de negociação, mas eu tenho tal para EMA, WMA, AD, e outros. Um desses indicadores AD é publicado no meu blog e você pode ver a partir daí o que é a estrutura básica da minha classe indicador em tempo real. Espero que você vai precisar de pequenas mudanças para implementar SMA indicador, porque é um dos mais simples. A lógica é simples. Para calcular SMA tudo que você precisa é n últimos preços. Assim classe instância terá coleta de preços, que irá armazenar manter apenas último n número de preços como SMA é definido (no seu caso 5). Então, quando você tem um novo bar, você removerá o mais antigo e adicionará um novo e criará um cálculo. Quinta-feira, 10 de abril de 2008 16:04 Eu calcularia a média móvel no banco de dados por meio de um procedimento armazenado ou em um cubo. Você já olhou no Analysis Services, ele tem a capacidade de calcular médias móveis. Quinta-feira, 10 de abril de 2008 16:05 Sim. TA-LIB é bom, mas pode não ser adequado para mim. Quando eu adicionar novo valor ou valor atualizado para o histórico de registros vou fazer o cálculo em uma função separada apenas para essa nova cotação e armazená-lo no banco de dados. Estou planejando atualizar a cotação a cada hora. Eu preciso fazer cerca de 25 a 30 indicadores técnicos para 2200 ações. Quinta-feira, 10 de abril de 2008 17:51 Tempo de execução de uma chamada TA-Lib em uma matriz de 10000 elementos leva cerca de 15 milissegundos (em um Intel Core Duo 2.13 Ghz). Esta é a média de todas as funções. Entre os mais rápidos, SMA leva menos de 2,5 milissegundos. O mais lento, HTTRENDMODE, leva 450 milissegundos. Com menos elementos é mais rápido. SMA leva cerca de 0,22 milissegundos para 1000 elementos de entrada. O ganho de velocidade é quase linear (a sobrecarga de realização da chamada de função é desprezível). No contexto de sua aplicação, TA-Lib é muito improvável que seja seu gargalo para desempenho de velocidade. Também eu geralmente não recomendo essa solução nquot quotlast. Leia abaixo para mais detalhes. Primeiro, uma correção para Boban. s declaração Todas as funções em TA-Lib também pode calcular um único último valor usando um mínimo de quotlast nquot elementos. Você pode ter uma matriz de tamanho 10000, ter dados inicializar apenas para os primeiros 500 elementos, adicionar um elemento e chamar TA-Lib para calcular o SMA somente para o novo elemento. TA-Lib vai olhar para trás não mais do que o necessário (se SMA de 5, em seguida, TA-Lib irá calcular um único SMA usando os últimos 5 valores). Isso é possível com o parâmetro startIdx e endIdx. Você pode especificar um intervalo a ser calculado ou um único valor. Neste cenário, você faria startIdx endIdx 500 para calcular o elemento 501st. Por que essa solução quotlast nquot é potencialmente perigosa para alguns Independentemente da escolha da solução Boban. s ou TA-Lib consideram que usar um pequeno número finito de dados passados ​​não funcionará bem com a maioria das funções TA. Com SMA, é óbvio que você só precisa de elemento n para calcular uma média sobre o elemento n. Não é tão simples com EMA (e muitas outras funções TA). O algo geralmente depende do valor anterior para calcular o novo valor. A função é recursiva. Isso significa que todos os valores passados ​​influenciam os valores futuros. Se você decidir quotlimitquot seu algo para usar apenas uma pequena quantidade de passado n valor, você não obterá o mesmo resultado como alguém que calcula sobre um grande número de valores passados. A solução é um compromisso entre velocidade e precisão. Muitas vezes discuti isso no contexto de TA-Lib (chamo-o o período quotunstable na documentação e fórum). Para mantê-lo simples, minha recomendação geral é se você não pode fazer a diferença entre um algo com uma resposta de impulso finito (FIR) de um algo com uma resposta de impulso infinita (IIR), você será mais seguro para calcular todos os dados que você tem disponível. TA-Lib especifica no código qual das suas funções tem um período instável (IIR). Eu tenho uma quantidade de 4000 dados de estoque, e tring para calcular a média móvel para todos os valores de dados, mas desde a mudança Média é baseada em dados anteriores e eu não posso calcular o SMA de 15 dias para os primeiros 14 dias, ignorar os primeiros 14 dias e calcular o SMA sobre o resto dos dados. E é preciso usar o LINQ para realizar. Alguém pode dar uma amostra ou sugestão de como usar o LINQ para calcular a média móvel A saída para os valores médios são todos em torno de 500s eu realmente não entendo como é que é possível obter esse valor elevado. Movendo o averager com o arranjo das somas: 06/07/2017 562.49 571.72 06/08/2017 565.84 580.32 06/11/2017 568.56 571.17 06/12/2017 569.55 576.16 13.06.2017 570.56 572.16 14.06.2017 570.63 571.53 06 / 15/2017 571,21 574,13 18/06/2017 572,78 585,78 19/06/2017 573,79 587,41 20/06/2017 574,23 585,74 21/06/2017 574,22 577,67 22/06/2017 575,63 582,10 25/06/2017 576,06 570,77 06/26 / 2017 576,68 572,03 27/06/2017 576,88 574,50 28/06/2017 576,7 569,05 06/29/2017 576,95 584,00 07/02/2017 578,37 592,52 07/03/2017 579,92 599,41 07/03/2017 581,74 599,41 Editado por Leemx Sexta-feira , 16 de novembro de 2017 2:59 AM Movido por Lisa Zhu Pessoal contingente da Microsoft Monday, November 19, 2017 7:38 AM linq related (De: Visual C Geral) sexta-feira, 16 de novembro de 2017 2:42 Para criar uma média móvel , Eu começaria criando uma escala de 0 a (comprimento da lista de dados - comprimento do período movente), então para cada valor na escala selecione elementos x a x 43 comprimento do período movente e calcule a média. Tudo em uma declaração LINQ agradável: Note que isso não é extremamente eficiente, uma vez que basicamente iterar sobre a lista de dados para cada valor no intervalo .. Hey, olha Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer Sexta-feira, novembro 23, 2017 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 7 de dezembro de 2017 2:44 sexta-feira, 23 de novembro de 2017 16:41 Todas as respostas Um exemplo de sua instrução LINQ ajudaria. Para criar uma média móvel, eu começaria criando um intervalo de 0 a (comprimento da lista de dados - duração do período em movimento), então para cada valor no intervalo selecionar elementos x Para x 43 duração do período móvel e calcular a média. Tudo em uma declaração LINQ agradável: Note que isso não é extremamente eficiente, uma vez que basicamente iterar sobre a lista de dados para cada valor no intervalo .. Hey, olha Este sistema permite assinaturas de mais de 60 cha Editado por Arno Brouwer Sexta-feira, novembro 23, 2017 4:42 PM Marcado como resposta por Alexander Sun sexta-feira, 07 de dezembro de 2017 2:44 sexta-feira, 23 de novembro de 2017 16:41 Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite nossa página UserVoice para enviar e votar em ideasC: média móvel simples Calculando a média móvel simples de uma série de números. Criar uma função stateful / classe / instância que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Descrição Uma média móvel simples é um método para calcular uma média de um fluxo de números, calculando apenas a média dos últimos números P do fluxo, onde P é conhecido como o período. Ele pode ser implementado chamando uma rotina de iniciação com P como seu argumento, I (P), que deve então retornar uma rotina que quando chamado com membros individuais, sucessivos de um fluxo de números, calcula a média de (até), a Último P deles, vamos chamar este SMA (). A palavra stateful na descrição da tarefa refere-se à necessidade de SMA () lembrar certas informações entre chamadas para ele: O período, P Um contêiner ordenado de pelo menos os últimos números P de cada uma de suas chamadas individuais. Stateful também significa que chamadas sucessivas para I (), o inicializador, devem retornar rotinas separadas que não compartilham estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudocódigo para uma implementação de SMA é: Mais do meu site C: Regra Horner8217s para avaliação polinomial C: Construir a partir do número racional C: Lucas-Lehmer Teste C: Série Hickerson de quase inteiros C: Gerar um número aleatório na faixa C: Harshad / Niven Série C: Fibonacci N-Passo Número Seqüências C: Kaprekar Números C: Hofstadter-Conway 10.000 Seqüência C: Linear Congruential Gerador 11 Top HBO Mostra 7 Top Hedge Fundos 10 Mais Storied NCAA Programas de Futebol PayPal Mafia: Os 12 homens por trás do dinheiro Online Gigante 12 Pessoas Mais Poderosas do Vale do Silício 9 Mulheres Mais Poderosas do Mundo 11 Ditadores Mais Brutal do Século 20 14 Pessoas Mais Poderosas em Wall Street 8 Mulheres Mais Poderosas do Vale do Silício 5 Principais Empresas de Capital de Risco no Vale do Silício 8 Amazing Zambia Facts 10 Awesome Sites para desperdiçar tempo com 5 melhores alongamentos para cada grupo muscular Copyright 2017 TFE Times, LLC. Todos os direitos reservados. Médias / Média média simples / Média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer linguagem que você conheça. Calculando a média móvel simples de uma série de números. Criar uma função stateful / classe / instância que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma m�ia m�el simples �um m�odo para calcular uma m�ia de um fluxo de n�eros calculando apenas a m�ia dos �timos n�eros de 160 P 160 a partir do fluxo 160, em que 160 P 160 �conhecido como o per�do. Ele pode ser implementado chamando uma rotina de iniciação com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de Para), os últimos 160 P 160 deles, vamos chamar este 160 SMA (). A palavra 160 estado 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar determinadas informações entre as chamadas para ele: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um dos Suas chamadas individuais. Stateful 160 também significa que chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que não 160 não compartilham o estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para conter os valores p mais recentes. Cada função retornada de init-moving-average tem seu estado em um átomo contendo um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula de lista que mantém o valor apenas movendo para fora da janela e para ser substituído com o valor apenas adicionado. Usando um fechamento editar Atualmente este sma não pode ser nogc porque ele aloca um encerramento no heap. Alguma análise de escape pode remover a alocação de heap. Usando uma edição de estrutura Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: Para evitar que as aproximações de ponto flutuante sigam se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Esta implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (ler a partir da escrita) em vez de combiná-los em um objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa elixir abaixo gera uma função anônima com um período embutido p, que é usado como o período da média móvel simples. A função de execução lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida pela entrada agrupada, formando a base de cada média móvel. Erlang tem fechamentos, mas variáveis ​​imutáveis. Uma solução então é usar processos e uma simples mensagem passando API baseada. As linguagens de matriz têm rotinas para calcular os avarages deslizando para uma determinada seqüência de itens. É menos eficiente para loop como nos comandos a seguir. Solicita continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND / 1, e a média pode ser encontrada em List / OPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: list é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i , 5) - Inicializando o cálculo da média móvel e definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), eo novo resultado será armazenado na variável x, e exibido (43) / 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável de índice, e aponta para o fim da sub-lista a lista sendo calculada a média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será utilizado no cálculo médio. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo será normalmente negativo, de modo que a seguinte equação evitará índices negativos: max (i-p1,1) ou, arranjar a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - índice de início 1) ou, arranjar a equação, (i - (max (ip, 0) 1) e então , (I-max (ip, 0)). A variável z detém o valor comum (max (ip), 0) então o beginindex será (z1) e os numberofelements serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média .) Irá somá-los soma (.) / (Iz) ri irá média deles e armazenar o resultado no lugar apropriado na lista de resultados Usando um fecho e criando uma função

No comments:

Post a Comment