Citando o clássico Processamento digital de sinais de Bellanger - Teoria e prática , o ponto não é onde está sua frequência de corte, mas quanta atenuação você precisa, quanta ondulação no sinal que deseja preservar pode tolerar e, o mais importante, como restringir sua transição da faixa de passagem para a faixa de parada (largura da transição) precisa ser.
Suponho que você queira um filtro de fase linear (embora você especifique uma latência mínima, não acho que um filtro de fase mínimo seja uma boa ideia, em geral, a menos que você saiba muito bem o que fará com seu sinal posteriormente) . Nesse caso, a ordem do filtro (que é o número de toques) é
N≈ 23registro10[ 110 δ1δ2]fsΔ f
com
fsΔ fδ1δ2 a taxa de amostragem a largura de transição, ie a diferença entre o fim da banda de passe e o início da banda de parada a ondulação na banda passante, ie "quanto da amplitude original você pode dar ao luxo de variar" a supressão na banda de parada .
Vamos conectar alguns números! Você especificou uma frequência de corte de ; portanto, seguirei em frente e afirmo que a largura da sua transição não será mais da metade disso, então .fs100Δ f= fs200
Vindo da tecnologia SDR / RF, 60 dB de supressão geralmente são totalmente suficientes - o hardware, sem custos absurdos, não será melhor em manter os sinais indesejados fora da sua entrada, então, não deixe de desperdiçar a CPU com um filtro fantástico melhor do que o seu hardware pode fazer. Portanto, .δ2= - 60 dB = 10- 3
Digamos que você possa viver com uma variação de amplitude de 0,1% na banda passante (se você pode viver com mais, considere também tornar o requisito de supressão menos rigoroso). Isso é .δ1= 10- 4
Então, conectando isso:
NO filtro de Tommy≈ 23registro10[ 110 δ1δ2]fsΔ f= 23registro10[ 110 ⋅ 10- 4⋅ 10- 3]fsfs200= 23registro10[ 110 ⋅ 10- 7]200= 23registro10[ 110- 6]200= 23( log10106)200= 23⋅ 6 ⋅ 200= 800 .
Portanto, com suas 200 torneiras, você está longe, se você usar uma faixa de passagem extremamente estreita em seu filtro, como eu supunha.
Observe que isso não precisa ser um problema - em primeiro lugar, um filtro de 800 torneiras é assustador, mas, francamente, apenas à primeira vista:
- Como testei nesta resposta no StackOverflow : Atualmente, a CPU é rápida , se você usar a implementação de FIR otimizada para CPU de alguém. Por exemplo, usei a implementação FFT-FIR do GNU Radio com exatamente o esquema de especificação de filtro acima. Consegui um desempenho de 141 milhões de amostras por segundo - isso pode ou não ser suficiente para você. Então, aqui está o nosso caso de teste específico da pergunta (que levou alguns segundos para produzir):
- Dizimação: se você quiser manter apenas uma fração da largura de banda de entrada, a saída do filtro será drasticamente superamostrada. A introdução de uma dizimação de significa que seu filtro não fornece todas as amostras de saída, mas apenas as uma - o que normalmente levaria a muitos e muitos aliases, mas como você está erradicando todo sinal que poderia ter alias, você pode savely fazê-lo. Implementações inteligentes de filtros (dizimadores polifásicos) podem reduzir o esforço computacional por M dessa maneira. No seu caso, você pode dizimar facilmente e, em seguida, seu computador precisará calcularMMM= 50120050.= 24multiplicações / acumulações por amostra de entrada - muito, muito mais fácil. Os filtros no GNU Radio geralmente têm essa capacidade. E dessa maneira, mesmo fora da FFT FIR (que não se presta muito bem a uma implementação de dizimador polifásico), posso extrair outro fator de 2 no desempenho. Não posso fazer muito mais. Isso é bem parecido com a largura de banda da RAM, na minha experiência, no meu sistema. Para
- Latência: não se importe com isso. Realmente, não, a menos que você precise. Você está fazendo isso com taxas de amostragem de áudio típicas? Lembre-se de mencionados acima. Portanto, o tempo gasto computando a saída do filtro será relevante apenas para o fluxo de sinal ao vivo do MS / s. Para DSP com dados offline: bem, adicione um atraso a qualquer sinal que você tenha paralelamente ao seu filtro para compensar. (Se o seu filtro for de fase linear, o atraso será metade do comprimento do filtro.) Isso pode ser relevante na implementação de hardware do filtro FIR.96kSs≪ridiculamente141SENHORAs
- Implementação de hardware: talvez a CPU e o SO do seu PC ou dispositivo incorporado realmente não permitam cumprir suas restrições de latência e, portanto, você está procurando FIRs implementados em FPGA. A primeira coisa que você notará é que, para o hardware, existe um paradigma de design diferente - um "Eu suprimo tudo, exceto1100da minha taxa de entrada "O filtro precisa de uma largura de bits grande para os números de pontos fixos que você manipularia no Hardware (em oposição aos números de pontos flutuantes em uma CPU). Esse é o primeiro motivo pelo qual você normalmente dividiria esse filtro em vários , filtros FIR em dizimação menores e em cascata. Outro motivo é que você pode, com cada "etapa" em cascata, permitir que seus multiplicadores (normalmente, "fatias DSP") sejam executados em uma taxa mais baixa e, portanto, multiplexá-los (número de fatias DSP normalmente, é muito limitado), usando um multiplicador para vários toques.Outra razão é que especialmente os filtros de meia banda, ou seja, passagens baixas que suprimem metade da banda de entrada e fornecem metade da taxa de entrada, são muito eficientemente implementáveis em hardware (pois possuem metade as torneiras são zero, algo difícil de explorar em uma implementação de CPU / SIMD).