Mover Média Circular Buffer


Eu usei-o para um log in-memory com um tamanho restrito. Por exemplo, o aplicativo escreveria entradas de log durante o processamento de solicitações de usuários. Sempre que ocorreu uma exceção (que seria perigosa para o processamento), os registros de registro atualmente na memória seriam despejados junto com ele. O benefício de um buffer circular é que você não precisa de quantidades infinitas de memória, já que as entradas antigas são substituídas automaticamente. O challange é que você precisa encontrar um tamanho adequado para sua usecase. No exemplo acima, seria muito lamentável quando o registro de registro com as informações mais vitais sobre a exceção já tivesse sido substituído. Alguns aplicativos de sistemas têm ferramentas para permitir que você extraia o conteúdo atual do buffer on demand, e não apenas quando ele seria extrair automaticamente (se alguma vez). Eu acredito ETW e o registro de estresse CLRs. Entre muitos outros sistemas de kernel ou registro de rastreamento de alto desempenho, são implementados dessa forma. O conceito de usar esses buffers para registro de rastreamento na memória é realmente bastante comum (para não dizer que este é o único uso - certamente não), porque é muito mais rápido do que registros escritos em um banco de dados de arquivos que talvez você nunca esteja interessado A menos que ocorra um erro. E em uma nota relacionada, ele conserva o espaço no disco rígido. Os buffers circulares são bons para fluxos de dados em série em sistemas embarcados. Os microcontroladores muitas vezes têm um UART para lidar com um byte em série, esses precisam ser armazenados em ordem e tratados mais tarde (os bytes geralmente chegam a uma taxa mais rápida do que eles podem ser manipulados). O buffer efetivamente divide a resposta cronológica necessária (quando os bytes entram, em microssegundos) para a resposta não cronológica crítica para toda a mensagem (por exemplo, exibir a mensagem que veio em milissegundos), por exemplo: 1) Sobre O recebimento de um byte do UART pode gerar uma interrupção para o qual o software responde tomando rapidamente o byte recebido e o empurra para o final do buffer. 2) As rotinas de software de fundo podem então verificar regularmente se o buffer tem algo nele ainda e esvaziá-lo conforme necessário. Como o tamanho do buffer circular pode ser definido antes da compilação, o tamanho é limitado. Isso ajuda a melhorar a eficiência espacial e deve eliminar a corrupção de memória em um trade off para quantos bytes podem ser recebidos antes que os dados comecem a se perder. Eu sei que isso é trapaça, mas a wikipedia tem uma ótima explicação. Um buffer circular, buffer cíclico ou buffer de anel é uma estrutura de dados que usa um único buffer de tamanho fixo como se estivesse conectado de ponta a ponta. Esta estrutura se presta facilmente ao armazenamento de dados de córregos. Um exemplo que possivelmente pode usar um buffer circular de substituição é com multimídia. Se o buffer for usado como o buffer limitado no problema produtor-consumidor, provavelmente é desejado para o produtor (por exemplo, um gerador de áudio) substituir dados antigos se o consumidor (por exemplo, a placa de som) não conseguir acompanhar momentaneamente. Outro exemplo é o método de síntese de guia de onda digital que usa buffers circulares para simular eficientemente o som de cordas vibratórias ou instrumentos de sopro. No que diz respeito à comparação com as listas de dupla ligação, eu imagino que realmente depende do que você está usando a lista. A implementação de buffers de circulos parece ser mais complexa, por favor (novamente) consulte a página do wiki, isto explica implementação, considerações etc. e também mostra código de exemplo. Respondeu 31 de março 10 às 14: 25 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 trás na 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 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 figura 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. Vamos ver a arquitetura interna que permite essa magnífica performance.

Comments

Popular posts from this blog

Binary Options Brokers Blacklist 2015

Free Forex Day Trading Strategy