Estou procurando uma classificação ampla sobre os tipos de técnicas disponíveis. Algo que posso usar para iniciar uma pesquisa de literatura.
Alguns detalhes:
deve ser viável para implementação em tempo real.
Decisão binária, eu deveria ser capaz de introduzir o sinal continuamente, e o algo tem que detectar os tempos de início e parada do sinusóide na forma de onda.
Não há outro sinal, ou seja, se o sinusóide não estiver presente, haverá apenas ruído
a entrada é limitada à banda e o sinusóide, se presente, é garantido dentro dessa faixa.
As trocas são entre velocidade (quanto tempo após o aparecimento do sinusóide o algo pode detectar sua presença) e falsos positivos (devem ser mínimos)
- Não posso fornecer números exatos sobre medidas de desempenho aceitáveis, porque não tenho certeza. Pretendo implementar todas as suas sugestões para o meu aplicativo e me descobrir. Estou apenas procurando as técnicas "padrão" para resolver esse problema.
Detalhes adicionais:
A entrada é a saída de um filtro de passagem de banda; portanto, o ruído também é significativo apenas na banda de passagem.
Não há garantia quando o sinusóide pode aparecer. A duração do sinusóide está na faixa de 50 a 100 ms. As amplitudes do sinusóide variam.
Respostas:
Dependendo da frequência da amostragem, uma FFT (Fast Fourier Transform) funcionará. Por exemplo, se sua taxa de amostragem for apenas uma vez a cada 20 ms, você obterá apenas algumas amostras do senoide, mas se estiver amostrando a cada 0,5 ms, obterá muito mais amostras. As FFTs geralmente funcionam melhor com um grande número de amostras com uma média acima da média. Nesse caso, mesmo que seu sinal seja a soma de alguns sinusóides, eles podem ser determinados com precisão.
Como alternativa, você pode dar uma olhada no algoritmo MUSIC . Não tenho muita certeza dos detalhes de como ele é implementado, mas foi implementado em vários cenários de detecção em tempo real. Uma alternativa para MUSIC é o algoritmo Esprit .
Ainda assim, se o tamanho da amostra for grande o suficiente e o ruído não inundar completamente o sinal, uma FFT será (em média) a opção mais rápida.
fonte
Uma maneira de detectar um sinusóide é usar o algoritmo de Goertzel . Rick Lyons fornece um ótimo artigo sobre como usá-lo para detecção .
Esse segundo link tem essa equação para filtrar o sinal recebido e calcular a "estatística de decisão":
fonte
Tudo depende do SNR. Quanto menor o SNR, mais processamento é necessário para separar o sinal do ruído. Eu resolvi um problema semelhante no passado, onde procurava um sinal sinusoidal SNR baixo e intermitente em uma faixa bastante ampla de frequências. Isto é o que funcionou para mim:
Como outros recomendaram, experimentei o algoritmo MUSIC para separar o sinal do ruído. Para o meu problema, foi um pouco melhor em encontrar sinais candidatos SNR baixos do que a FFT, mas como a carga computacional era muito maior (e meu algoritmo estava sendo executado em um DSP de ponto fixo fraco), optei por não usá-lo. Era mais fácil definir o limite de detecção mais baixo com a FFT, detectar picos mais espúrios e eliminá-los no estágio de filtragem correspondente. A detecção de SNR baixo pode ser um pouco obscura, mas se você souber o suficiente sobre o seu sistema, poderá detectar sinais de forma confiável com uma amplitude menor do que os níveis de ruído ambiente. Tudo depende das informações que você conhece sobre o seu sistema que você pode explorar.
fonte
Eu proporia o seguinte:
1. organize uma janela deslizante que seja larga o suficiente para conter toda a banda do sinal (pelo menos vários períodos do sinal de menor frequência)
2. Execute uma FFT de amostras que estão atualmente dentro de uma janela, obtenha um espectro de energia a partir dele.
3. Corte o espectro com os limites de banda conhecidos.
4. Classifique os valores restantes do espectro de potência em ordem decrescente. Como o ruído é gaussiano, o espectro do ruído seria geralmente plano dentro da banda e, se o sinal sonoro monotônico estivesse presente na janela, produziria o (s) pico (s).
5. Identifique a largura de banda típica do pico. Colete as amostras de maior amplitude de um espectro de potência classificado por uma colheita, obtenha uma média. Essa seria a energia potencial de "bip".
6. Obtenha também uma média das amostras de banda restantes, que seria a energia do ruído.
7. Calcule uma razão de energias obtida em (5) e (6). Se a proporção exceder o limite especificado, defina o sinalizador indicando que o bipe foi encontrado. Caso contrário, defina o sinalizador de que não há sinal sonoro no momento.
8. Deslize a janela para o próximo quadro (amostra por amostra ou por uma etapa maior).
fonte
Este é um problema estatístico. Se você puder caracterizar o ruído, poderá procurar características específicas do seu sinal de interesse cuja probabilidade esteja abaixo de alguma probabilidade (sua taxa de erro falso positivo necessária) para aparecer aleatoriamente no ruído.
Se você souber a duração mínima do seu sinusóide de interesse (por exemplo, 50 mS), poderá tentar janelas FFT deslizantes sobrepostas pelo comprimento dessa duração e procurar picos espectrais acima de algum limite calculado pela caracterização do ruído. Se o mesmo pico acima do nível do ruído aparecer em várias janelas FFT sucessivas, o comprimento do senoide pode corresponder mais, dependendo do comprimento e da sobreposição do quadro da FFT.
fonte