Friday 2 February 2018

Mover média circular buffer


O Guia de cientistas e engenheiros para processamento de sinal digital Por Steven W. Smith, Ph. D. Capítulo 28: processadores de sinais digitais Os processadores de sinais digitais foram projetados para executar rapidamente filtros FIR e técnicas similares. Para entender o hardware. Primeiro devemos entender os algoritmos. Nesta seção, vamos fazer uma lista detalhada das etapas necessárias para implementar um filtro FIR. Na próxima seção, veremos como os DSPs são projetados para executar estas etapas da forma mais eficiente possível. Para começar, precisamos distinguir entre processamento off-line e processamento em tempo real. No processamento off-line, o sinal de entrada inteiro reside no computador ao mesmo tempo. Por exemplo, um geofísico pode usar um sismômetro para registrar o movimento do solo durante um terremoto. Depois que a agitação terminar, a informação pode ser lida em um computador e analisada de alguma forma. Outro exemplo de processamento off-line é a imagem médica, como a tomografia computadorizada e a ressonância magnética. O conjunto de dados é adquirido enquanto o paciente está dentro da máquina, mas a reconstrução da imagem pode atrasar-se até mais tarde. O ponto chave é que toda a informação está simultaneamente disponível para o programa de processamento. Isso é comum em pesquisa científica e engenharia, mas não em produtos de consumo. O processamento off-line é o domínio de computadores pessoais e mainframes. No processamento em tempo real, o sinal de saída é produzido ao mesmo tempo em que o sinal de entrada está sendo adquirido. Por exemplo, isso é necessário na comunicação telefônica, aparelhos auditivos e radar. Essas aplicações devem ter a informação imediatamente disponível, embora possa ser adiada por um valor curto. Por exemplo, um atraso de 10 milissegundos em uma chamada telefônica não pode ser detectado pelo falante ou ouvinte. Da mesma forma, não faz diferença se um sinal de radar for atrasado por alguns segundos antes de ser exibido para o operador. As aplicações em tempo real introduzem uma amostra, executam o algoritmo e produzem uma amostra, sobre-e-sobre. Alternativamente, eles podem inserir um grupo de amostras, executar o algoritmo e produzir um grupo de amostras. Este é o mundo dos processadores de sinais digitais. Agora, olhe para a Fig. 28-2 e imagine que este é um filtro FIR que está sendo implementado em tempo real. Para calcular a amostra de saída, devemos ter acesso a um certo número de amostras mais recentes da entrada. Por exemplo, suponha que usemos oito coeficientes neste filtro, um 0. Um 1. Hellip a 7. Isso significa que devemos conhecer o valor das oito amostras mais recentes do sinal de entrada, x n, x n -1, hellip x n -7. Essas oito amostras devem ser armazenadas na memória e atualizadas continuamente à medida que novas amostras são adquiridas. Qual é a melhor maneira de gerenciar essas amostras armazenadas. A resposta é o armazenamento em buffer circular. A Figura 28-3 ilustra um buffer circular de oito amostras. Colocamos este buffer circular em oito locais de memória consecutivos, 20041 a 20048. A Figura (a) mostra como as oito amostras da entrada podem ser armazenadas em um instante particular no tempo, enquanto (b) mostra as mudanças após a próxima amostra ser adquirido. A idéia de armazenamento em buffer circular é que o final desta matriz linear está conectado ao seu local de memória inicial. 20041 é visto como próximo ao 20048, assim como 20044 é próximo a 20045. Você acompanha a matriz por um ponteiro (uma variável cujo O valor é um endereço) que indica onde a amostra mais recente reside. Por exemplo, em (a) o ponteiro contém o endereço 20044, enquanto está em (b) contém 20045. Quando uma nova amostra é adquirida, ela substitui a amostra mais antiga na matriz e o ponteiro é movido para um endereço à frente. Os buffers circulares são eficientes porque apenas um valor precisa ser alterado quando uma nova amostra é adquirida. São necessários quatro parâmetros para gerenciar um buffer circular. Primeiro, deve haver um ponteiro que indique o início do buffer circular na memória (neste exemplo, 20041). Em segundo lugar, deve haver um ponteiro que indique o fim da matriz (por exemplo, 20048), ou uma variável que contenha seu comprimento (por exemplo, 8). Em terceiro lugar, o tamanho do passo do endereçamento da memória deve ser especificado. Na Fig. 28-3 o tamanho do passo é um. Por exemplo: o endereço 20043 contém uma amostra, o endereço 20044 contém a próxima amostra, e assim por diante. Isso geralmente não é o caso. Por exemplo, o endereçamento pode se referir a bytes e cada amostra pode exigir dois ou quatro bytes para manter seu valor. Nesses casos, o tamanho do passo precisaria ser de dois ou quatro, respectivamente. Esses três valores definem o tamanho e configuração do buffer circular e não serão alterados durante a operação do programa. O quarto valor, o ponteiro para a amostra mais recente, deve ser modificado conforme cada nova amostra é adquirida. Em outras palavras, deve haver uma lógica de programa que controle como esse quarto valor é atualizado com base no valor dos três primeiros valores. Embora esta lógica seja bastante simples, deve ser muito rápida. Este é o ponto principal desta discussão. Os DSPs devem ser otimizados no gerenciamento de buffers circulares para atingir a velocidade de execução mais alta possível. Por sua vez, o armazenamento em buffer circular também é útil no processamento off-line. Considere um programa onde os sinais de entrada e de saída estão completamente contidos na memória. O buffer de circulação não é necessário para um cálculo de convolução, pois cada amostra pode ser acessada imediatamente. No entanto, muitos algoritmos são implementados por etapas. Com um sinal intermediário sendo criado entre cada etapa. Por exemplo, um filtro recursivo realizado como uma série de biquads opera dessa maneira. O método de força bruta é armazenar todo o comprimento de cada sinal intermediário na memória. O buffer circular oferece outra opção: armazene apenas as amostras intermediárias necessárias para o cálculo em mãos. Isso reduz a quantidade necessária de memória, à custa de um algoritmo mais complicado. A importante idéia é que os buffers circulares são úteis para o processamento off-line, mas críticos para aplicações em tempo real. Agora podemos observar as etapas necessárias para implementar um filtro FIR usando buffers circulares tanto para o sinal de entrada como para os coeficientes. Esta lista pode parecer trivial e sobreexaminada - não é O tratamento eficiente dessas tarefas individuais é o que separa um DSP de um microprocessador tradicional. Para cada nova amostra, todas as etapas a seguir devem ser tomadas: o objetivo é fazer com que essas etapas sejam executadas rapidamente. Uma vez que as etapas 6-12 serão repetidas várias vezes (uma vez por cada coeficiente no filtro), deve ser dada especial atenção a essas operações. Os microprocessadores tradicionais geralmente devem realizar esses 14 passos em série (um após o outro), enquanto os DSPs são projetados para executá-los em paralelo. Em alguns casos, todas as operações no loop (etapas 6 a 12) podem ser concluídas em um único ciclo de clock. Olhe para a arquitetura interna que permite essa magnífica performance. Sei que isso é viável com o impulso 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 números 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir 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 correspondiam melhor às 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, conforme 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ê só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu 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. Então isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo decorrido desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar o alfa ser (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 amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados substituídos, evitando a passagem O (N) dispendiosa para calcular a soma - necessária para a demanda média. 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 adicional de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (o melhor que renomeou 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 visto. 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 jun 14 às 14:27

No comments:

Post a Comment