Saturday 11 November 2017

Cuda moving average filter


Para outra abordagem, você pode truncar a janela da média móvel exponencial e, em seguida, calcular o seu sinal filtrado fazendo uma convolução entre o sinal e a exponencial janela. A convolução pode ser calculada usando a biblioteca FFT CUDA livre (cuFFT) porque, como você pode saber, a convolução pode ser expressa como a multiplicação pontual dos dois sinais no domínio fourier (Este é o nome apropriado do Teorema da Convolução, Que corre com uma complexidade de O (n log (n))). Este tipo de abordagem minimizará o código do kernel CUDA e executará muito rapidamente, mesmo em uma GeForce 570. Especialmente, se você puder fazer todos os seus cálculos em uma única precisão (flutuante). Respondeu 30 de abril 14 às 17:04 Eu proporia manipular a equação de diferença acima conforme indicado abaixo e depois usando primitivas de impulso CUDA. MANIPULAÇÃO DE EQUAÇÃO DE DIFERENÇA - FORMA EXPLÍCITA DA EQUILÍBRIA DE DIFERENÇA Por álgebra simples, você pode encontrar o seguinte: Conseqüentemente, a forma explícita é a seguinte: CUDA THRUST IMPLEMENTATION Você pode implementar a forma explícita acima pelas seguintes etapas: Inicializar uma sequência de entrada dinput para Alfa, exceto para dinput0. 1. Defina um vetor d1overbetatothen igual a 1, 1beta, 1beta2, 1beta3. Multiplique o dinposto elementar por d1overbetatothen Execute um inclusivecan para obter a seqüência do yn betan Divida a seqüência acima por 1, 1beta, 1beta2, 1beta3. A abordagem acima pode ser recomendada para sistemas Linear Time-Varying (LTV). Para os sistemas Linear Time-Invariant (LTI), a abordagem FFT mencionada por Paul pode ser recomendada. Eu estou fornecendo um exemplo dessa abordagem usando o CUDA Thrust e cuFFT na minha resposta ao filtro FIR no CUDA. O filtro é um filtro com janela da classe linear, que suaviza o sinal (imagem). O filtro funciona como de passagem baixa. A idéia básica por trás do filtro é que qualquer elemento do sinal (imagem) tenha uma média em sua vizinhança. Se tivermos uma matriz mxn e queremos aplicar um filtro médio com o tamanho k, então para cada ponto na matriz p: (i, j) o valor do ponto seria a média de todos os pontos no quadrado. Esta figura é Para o kernel quadrado de filtragem com o tamanho 2. que a caixa amarela é o pixel a ser calculado em média, e toda a grade é o quadrado dos pixels vizinhos, que o valor novo dos pixels será a média deles. O problema é que esse algoritmo é muito lento, especialmente em imagens grandes, então pensei em usar GPGPU. A questão agora é. Como isso pode ser implementado em cuda, se for possível. Este é um caso clássico de problema de processamento de imagem embaraçosamente paralelo que pode ser facilmente mapeado para o framework CUDA. O filtro de média é conhecido como Box Filter em domínios de processamento de imagem. A abordagem mais fácil seria usar texturas CUDA para o processo de filtragem, pois as condições de contorno podem ser tratadas muito facilmente por texturas. Supondo que você tenha ponteiros de origem e destino alocados no host. O procedimento seria algo assim. Alocar memória suficientemente grande para manter as imagens de origem e de destino no dispositivo. Copie a imagem de origem do host para o dispositivo. Vincule o ponteiro do dispositivo da imagem de origem à textura. Especifique um tamanho de bloco apropriado e uma grade grande o suficiente para cobrir todos os pixels da imagem. Inicie o kernel de filtragem usando a grade especificada e o tamanho do bloco. Copie os resultados de volta para o host. Desanexar a textura Ponteiros de dispositivo gratuitos. Exemplo de implementação do filtro de caixa A boa notícia é que você não precisa implementar o filtro sozinho. O CUDA Toolkit vem com biblioteca gratuita de processamento de sinal e imagem chamada NVIDIA Performance Primitives, também conhecido como NPP, fabricado pela NVIDIA. A NPP utiliza GPUs habilitadas para CUDA para acelerar o processamento. O filtro de média já está implementado na NPP. A versão atual do NPP (5.0) possui suporte para imagens de 8 bits, 1 canal e 4 canais. As funções são: nppiFilterBox8uC1R para imagem de 1 canal. NppiFilterBox8uC4R para imagem de 4 canais. Respondeu 15 de janeiro às 10:50 Sua resposta parece ser muito boa, mas eu não estou realmente ciente de tudo o que você está descrevendo lá, como eu programa principalmente no matlab, e tenho bons conhecimentos sobre a programação em C, o que eu preciso é um Código de ajuda, acho que o protótipo da função kernel seria: global void ApplyAverageFilter (int Image, int Result, int filterSize). Preciso de ajuda com o código. Ndash Sameh Kamal 15 de janeiro 13 às 10:56 Oh. Eu atualizei minha resposta e adicionei um link para o kernel CUDA para filtragem de caixa. Mas você precisa aprender CUDA primeiro para usá-lo. Caso contrário, o NPP é uma opção melhor se você não tiver muito fundo CUDA. Ndash sgarizvi 15 de janeiro 13 às 10:59 Se o tamanho dos filtros for normal e não humongous, o filtro médio é um caso muito bom para a implementação com CUDA. Você pode configurar isso usando blocos quadrados e cada segmento do bloco é responsável pelo cálculo do valor de um pixel, somando e promediando seus vizinhos. Se você armazena a imagem na Memória Global, então ela pode ser programada facilmente, mas você terá muitos conflitos bancários. Uma possível otimização é que você carrega blocos da imagem nos blocos Memória compartilhada. Usando elementos fantasmas (para que você não exceda as dimensões dos blocos compartilhados ao procurar pixels vizinhos), você pode calcular a média dos pixels dentro de um bloco. O único pensamento de que você deve ter cuidado é como a costura será feita no final, porque os blocos de memória compartilhados se sobrepõem (por causa dos pixels de preenchimento extras) e você não deseja calcular seus valores duas vezes. Respondeu em 15 de janeiro às 9:27 Sua resposta 2017 Stack Exchange, IncMoving Average Na análise estatística e, por exemplo, na análise de dados da bolsa de valores, pode-se interessar-se pelas seguintes duas situações: 1. Uma tem uma longa seqüência de itens E quer calcular um certo número de médias, calculando a média em diferentes números de itens, ou seja, usando diferentes comprimentos para a janela da média móvel. 2. Um tem uma série de seqüências, armazenadas consecutivamente na memória, e quer em média em paralelo com uma janela de média fixa de tamanho 2 RADIUS 1. Abaixo, a. O operador da média móvel é um operador fundamental nas estatísticas. O artigo da Wikipedia fornece uma visão abrangente sobre este tópico. Sua implementação CUDA fornece um exemplo muito bom sobre como usar a memória compartilhada e sobre como carregar e gerenciar regiões halo na memória compartilhada. Abaixo está um exemplo completo executado implementando o operador de média móvel em CUDA. Include ltthrustdevicevector. hgt define RADIUS 3 define BLOCKSIZE 32 iDivUp FUNCTION. Suponha que se tenha o filtro de média móvel exponencial definido pela equação de diferença abaixo yn yn-1 beta alpha xn onde alfa e beta são constantes. A questão é sobre como implementar eficientemente isso na CUDA. Uma possibilidade seria calcular a forma explícita da resposta do filtro e depois usar as primitivas oferecidas pelo CUDA Thrust. Em particular, por álgebra simples, pode-se encontrar o seguinte: y1 beta y0 alfa x1 y2 beta2 y0 alfa seja. Categorias

No comments:

Post a Comment