Filtro de média Este exemplo mostra o fluxo de trabalho recomendado para gerar código C de uma função MATLAB usando o comando codegen. Estas são as etapas: 1. Adicione a diretiva codegen à função MATLAB para indicar que ela se destina a geração de código. Esta diretiva também permite que o analisador de código MATLAB identifique avisos e erros específicos para MATLAB para geração de código. 2. Gerar uma função MEX para verificar se o código MATLAB é adequado para geração de código. Se ocorrerem erros, você deve corrigi-los antes de gerar o código C. 3. Teste a função MEX no MATLAB para garantir que seja funcionalmente equivalente ao código MATLAB original e que não ocorrem erros de tempo de execução. 4. Gerar código C. 5. Inspecione o código C. Pré-requisitos Não há pré-requisitos para este exemplo. Criar uma nova pasta e copiar arquivos relevantes O código a seguir criará uma pasta na sua pasta de trabalho atual (pwd). A nova pasta apenas conterá os arquivos relevantes para este exemplo. Se você não quiser afetar a pasta atual (ou se você não pode gerar arquivos nesta pasta), você deve mudar sua pasta de trabalho. Comando Executar: Crie uma Nova Pasta e Copie Arquivos Relevantes Sobre a Função de Filtragem de média A função de média de filtragem. m atua como um filtro de média no sinal de entrada, ele toma um vetor de valores de entrada e calcula uma média para cada valor no vetor. O vetor de saída é do mesmo tamanho e forma que o vetor de entrada. A diretiva de compilação do codegen indica que o código MATLAB destina-se à geração de código. Crie alguns dados de amostra Gerar uma onda seno ruidosa e traçar o resultado. Gerar uma função MEX para testes Gerar uma função MEX usando o comando codegen. O comando codegen verifica se a função MATLAB é adequada para geração de código e gera uma função MEX que você pode testar no MATLAB antes de gerar código C. Como C usa tipagem estática, codegen deve determinar as propriedades de todas as variáveis nos arquivos MATLAB em tempo de compilação. Aqui, a opção de linha de comando - args fornece um exemplo de entrada para que o codegen possa inferir novos tipos com base nos tipos de entrada. Usando o sinal de amostra criado acima como o exemplo de entrada garante que a função MEX possa usar a mesma entrada. Por padrão, codegen gera uma função MEX chamada médiafiltermex na pasta atual. Isso permite que você teste o código MATLAB e a função MEX e compare os resultados. Teste a função MEX no MATLAB Execute a função MEX no MATLAB Cria o código C Inspecione o código gerado O comando codegen com a opção - config coder. config (lib) gera o código C empacotado como uma biblioteca C autônoma. O código C gerado está na pasta codegenlibaveragingfilter. Os arquivos são: Inspecione o código C para o filtro de média. c Função Selecione seu país É 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 O poder de dois para permitir o deslocamento de bits em vez de dividir, mas não precisar de 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 indicado 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 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 de GPS que escrevi. Comece com 1 amostra e divida em 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 um matemático, mas isso pareceu uma boa maneira de fazê-lo. Achei que isso tornaria o estômago de um verdadeiro matemático, mas, é uma das maneiras aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que deseja seguir. Isso pode não ser importante na maioria das vezes, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição atual e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um comprimento 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. Respondeu 16 de novembro 16 às 23:03 inicialize o total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), um add totalnewValue, um incremento (contagem), uma média de divisão (quantidade total) Esta seria uma média móvel em relação a 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 e, em seguida, 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 em 3 de fevereiro de 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, Inc
No comments:
Post a Comment