Tuesday 26 September 2017

Mudar O Applet De Filtro Médio


Eu essencialmente tenho uma série de valores como este: a matriz acima é simplificada, estou coletando 1 valor por milissegundo no meu código real e preciso processar a saída em um algoritmo que escrevi para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olhava para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados para serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu lido muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair, solicitado 8 de fevereiro às 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): instanciar com o parâmetro de decaimento desejado (pode ser necessário que a sintonização esteja entre 0 e 1) e depois use a média () para filtrar. Ao ler uma página sobre uma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em arrays e seqüências com subscritos. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos da seqüência média saltarão em torno de um bit devido a efeitos de limites, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica média móvel na média e experimentar sem incomodar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então é errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está indo para baixo). A menos que você tenha média de todos os seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, então corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizar, levando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro número), a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito período três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e a média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados mais antigos inferiores aos novos dados, esta é uma maneira de polarizar o alisamento para trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Então, a saída que você obtém seria os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e término dos dados, pois claramente você não pode significar os últimos 5 termos quando estiver no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito de o que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2017 Stack Exchange, Inc Este applet java é uma demonstração de filtros digitais. Você deve ouvir uma forma de onda de ruído quando o applet é iniciado. Se você receber uma mensagem Precisa de java 2 para o som, então você deve obter o plug-in Java. O applet inicia com um filtro passa-baixa. Mostra a resposta de frequência do filtro, o espectro da forma de onda filtrada que está sendo reproduzida, a própria forma de onda e a resposta de impulso do filtro. Clique na curva de resposta para alterar a frequência de corte. O gráfico de resposta de freqüência mostra a resposta do filtro (mostrado verticalmente, em dB, com linhas a intervalos de 10 dB) em relação à freqüência (mostrada horizontalmente, com linhas verticais marcando oitavas). O gráfico do espectro mostra o espectro da saída de som. O menu pop-up de Entrada permite que você selecione uma forma de onda de entrada. As escolhas são: Noise Sine Wave - selecione a freqüência clicando no espectro. Sawtooth Wave Triangle Wave Square Wave Ruído periódico - selecione a freqüência clicando no espectro. Varrer - uma onda senoidal que varre o espectro de freqüência a uma taxa ajustável. Impulsos Vários arquivos mp3 (você pode adicionar o seu próprio, baixando o applet e depois editando o arquivo index. html) O menu pop-up Filtro permite que você selecione um filtro. Veja este site para obter detalhes técnicos sobre os tipos de filtro. As opções são: FIR Low-pass: filtra as altas freqüências (tudo abaixo da freqüência de corte, que é ajustável clicando no gráfico de resposta com o mouse). FIR High-pass - filtra as baixas frequências. FIR Band-pass - filtra tudo, exceto uma variedade de freqüências. Use os controles deslizantes da Freq. Central e da Distância de Passband para ajustar o alcance. FIR Band-stop - filtra uma variedade de frequências. Aqui estão alguns parâmetros ajustáveis ​​que afetam a qualidade dos filtros FIR: o número de pontos, que você pode ajustar com o controle deslizante Ordem (mais pontos é melhor) e a janela, que você seleciona com o menu pop-up Janela. Um filtro FIR é definido por sua resposta de impulso, que você pode ver perto da parte inferior da janela. Para visualizar a função da janela, selecione FIR Low-pass. Ajuste a freqüência de corte perto de zero e veja a resposta de impulso. FIR personalizado - desenhe no gráfico de resposta de freqüência para especificar seu próprio filtro. A resposta real, mostrada em vermelho, é afetada pelo controle deslizante Ordem e Janela popup. Nenhum - sem filtragem Butterworth Low-pass - um filtro plano que filtra as altas freqüências Butterworth High-pass - um filtro plano que filtra as baixas freqüências Butterworth Band-pass - um filtro plano que filtra as freqüências fora de uma certa banda Butterworth Band - Stop - um filtro plano que filtra as freqüências dentro de uma certa faixa Chebyshev Low-pass - um filtro passa-baixa com uma quantidade ajustável de ondulação na passband Chebyshev High-pass, Band-pass, Band-stop Inv Cheby Low-pass - Chebyshev inverso (também conhecido como Chebyshev tipo II), um filtro de passagem baixa com uma banda de passagem plana, mas uma quantidade ajustável de ondulação na faixa de batente Inv Cheby Passagem de alta, Passe de banda, Baixa-Elíptica Baixa passagem - ( Também conhecido como Cauer), um filtro passa-baixa com uma quantidade ajustável de ondulação na banda passante e banda de parada. Ajustar a largura da faixa de transição mudará a atenuação da banda de interrupção. Elliptic High-pass, Band-pass, Band-stop Comb () - este filtro (usado no ruído) parece que alguém sopra em um tubo. Peito (-) - este é um tubo com uma extremidade coberta. Atraso - um filtro de eco (o mesmo que um filtro de pente, mas com atrasos mais longos) Filtro de cordas arrancadas - quando o popup de Entrada está configurado para Impulsos, isso soa como uma seqüência de caracteres sendo arrancada. Reson w Reson - ressoa em uma freqüência Reson w Zeros - um filtro de ressonância com zeros adicionados a 0 e metade da taxa de amostragem Notch - filtra uma faixa estreita de freqüências Moving Average - uma simples tentativa FIR em um filtro passa-baixa. Este filtro (quando usado no ruído) me lembra um Atari 2600. Tripass Allpass - passa todas as freqüências igualmente, mas com atraso de fase diferente. Use o item de Resposta de Fase no menu Exibir para visualizar a resposta de fase. Para baixas frequências, este filtro age como um atraso fraccional (um atraso de menos de uma amostra). Gaussian - a resposta de impulso e a resposta de freqüência são ambas gaussianas em forma aleatória Custom IIR - arraste os pólos e os zeros em torno de mudar o filtro. O popup da taxa de amostragem permite que você veja ou altere a taxa de amostragem. Você não pode alterar a taxa se a entrada for um MP3. O menu Exibir permite-lhe ligar ou desligar as várias visualizações. O item Escala de freqüência de registro que mostra a resposta de freqüência usando um gráfico logarítmico em vez de linear. O item Mostrar toda a forma de onda irá comprimir os segmentos da forma de onda horizontalmente para que cada um se encaixa na janela dessa maneira, toda a forma de onda será exibida, mas a janela normalmente não será ampla o suficiente para mostrar cada amostra separadamente. O item Ferris Plot exibirá uma Parcela Ferris da função de transferência. Ao exibir a resposta de freqüência, o applet mostra apenas a porção do espectro de 0 para a freqüência de Nyquist (pi). O resto da resposta até 2pi é apenas uma imagem espelhada disso, e então a resposta é repetida a cada 2pi. Por exemplo, aqui está uma resposta de freqüência como mostrado no applet (até pi): Aqui está a resposta até 4pi: bons livros sobre filtros digitais: Steiglitz (excelente introdução ao DSP tem informações sobre filtros de pente, resons, plucked-string ) Smith (descarregável) Winder MitraMuch versão mais simples: classe pública MovingAverageInSlidingWIndow int windowsize Fila de fila int sum public MovingAverageInternetLinkWIndow (int windowsize) this. windowsize windowsize this. queue new LinkedList () this. sum 0 encontra a média móvel depois de inserir o item n em dados Transmissão privado double findMovingAverage (int n) if (queue. size () gt windowsize - 1) sum sum - queue. poll () queue. offer (n) sum sumn return (double) soma queue. size () public static void Principal (String args) int windowsize 3 MovingAverageInSlidingWIndow m new MovingAverageInslidingWIndow (windowsize) para (int i 1 i lt 20 i) System. out. println (quotAfter Adicionando quot i quot para a fila: Average is: quot m. findMovingAverage (i) ) Podemos simplesmente persistir Soma atual de elementos na fila na variável global. Assim, reduzindo a computação no próximo () método. Classe pública MovingAverage LinkedList fila int size int sum 0 contém soma da fila Inicialize sua estrutura de dados aqui. Public MovingAverage (tamanho int) this. queue new LinkedList () this. size tamanho public double next (int val) queue. offer (val) sum val if (queue. size () gtthis. size) sum - queue. poll ()

No comments:

Post a Comment