Quais são alguns métodos para detectar um sinusóide no ruído?

7

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:

  1. deve ser viável para implementação em tempo real.

  2. 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.

  3. Não há outro sinal, ou seja, se o sinusóide não estiver presente, haverá apenas ruído

  4. a entrada é limitada à banda e o sinusóide, se presente, é garantido dentro dessa faixa.

  5. 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)

  6. 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:

  1. A entrada é a saída de um filtro de passagem de banda; portanto, o ruído também é significativo apenas na banda de passagem.

  2. 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.

ankit
fonte
11
Provavelmente, um analisador Fourier de janela deslizante (ou caminhando) faria o trabalho. São necessários mais alguns detalhes: o ruído também é limitado pela banda? Existe um tempo de sintonia garantido quando apenas o ruído está presente na entrada? O ruído e a amplitude sinusóide são estáveis ​​ao longo do tempo?
precisa saber é o seguinte
Até onde eu entendi, você detectará sinais sonoros em um canal barulhento. Você deve especificar um limite de amplitude (energia) que distinga um sinal sonoro entre o ruído. Você também mencionou o limite de banda do sinal sonoro. Isso significa que um espectro de bipes é de banda larga ou que um espectro de bipes é estreito, mas em qualquer lugar dentro da banda. Você também deve especificar como um sinal sonoro é percebido - é como um tom de subida / descida rápido ou lento, é acompanhado por um clique de ligar / desligar, e quão curto / longo eles podem ser em relação à janela de digitalização.
precisa saber é
Obrigado! Isso fornece MUITO mais informações sobre o problema.
Peter K.
Você sabe alguma coisa sobre a distribuição do ruído? Além disso, com que precisão você conhece a frequência do sinusóide a priori (se é que existe)?
Jason R
@ Jason R o barulho é gaussiano. A frequência do sinusóide não é conhecida. Só é garantido que esteja na faixa de 80-250 Hz. Diferentes "bipes" estarão na mesma frequência central, mas as amplitudes podem variar.
ankit

Respostas:

2

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.

Kitchi
fonte
2
Implementação reduzida da MUSIC: que e . é uma matriz NxP em que as colunas são os vetores próprios correspondentes aos menores valores próprios P ​​da matriz de autocorrelação, . Determinar o que P deve ser não é trivial e é coberto por Wax e Kailath (1985), embora às vezes você possa fazer uma estimativa do "globo ocular" para determinar os autovalores do sinal versus os autovalores do ruído. PMUSIC(ω)=1eHPnePn=EnEnHeH=[0,ejω,...,e(N1)ω]EnRxx
Dave C
2

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":

insira a descrição da imagem aqui

Peter K.
fonte
O algoritmo de Goertzel parece ser um detector ressonante de mono-frequência. Como isso funciona para tons de banda larga na tarefa de pôster original?
precisa saber é
O OP parece querer "banda ilimitada" e não "banda larga". Se você escolher bem o comprimento de Goertzel, deverá conseguir lidar com os sinusóides "ilimitados de banda". Concordo que há uma troca: um sinusóide precisamente na frequência central de Goertzel dará uma leitura mais alta que uma da mesma amplitude em uma frequência diferente. A maioria das abordagens baseadas na FFT tem o mesmo problema. Você sempre pode executar dois ou três detectores Goertzel com diferentes frequências centrais, se este for um problema.
Peter K.
@PeterK, Por que alguém simplesmente não usaria uma família de tons DFT complexos para fazer down-mix? (Em outras palavras, que vantagem o AG tem sobre a técnica anterior?). Resposta interessante btw.
Spacey
@ Mohammad: Uma família de tons DFT complexos é exatamente o que o algoritmo Goertzel está implementando (se você implementar vários filtros Goertzel com deslocamento de frequência).
Peter K.
11
A família de algoritmos de Goertzel pode ser considerada simplesmente a fusão computacional de um gerador exponencial / de onda senoidal complexa mais um produto de pontos vetoriais, idêntico a obter a magnitude de uma downmix complexa usando o mesmo gerador de função trigonométrica (exceto possivelmente para estabilidade numérica e dinâmica). questões de alcance).
precisa saber é o seguinte
2

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:

  1. Execute uma caracterização offline do ruído do seu sistema (no domínio da frequência). Se o nível de ruído ambiente mudar com o tempo, atualize periodicamente esse nível de ruído on-line quando o algoritmo tiver alta confiança de que o sinal de interesse não está presente. Se o ruído não for muito estacionário, isso pode não ajudar muito (e pode doer).
  2. Execute uma FFT deslizante em janelas de tempo discretas. Procure frequências com energias acima do ruído de fundo. Obtenha uma lista de "picos" de candidatos que possam ser o sinal de interesse. Optei por manter um buffer circular de dados, incluindo amostras de janelas de tempo anteriores, para que a FFT tivesse uma melhor resolução de frequência.
  3. Crie filtros combinados sinusoidais para as frequências de pico de interesse identificadas na FFT. Procure respostas acima de algum limite. O filtro de correspondência (também conhecido como função de autocorrelação) pode atenuar o ruído muito bem e, no meu sistema, era muito bom em detectar detecções do que, à primeira vista, pareciam ser dados sem esperança. Como filtro no domínio do tempo, o filtro correspondente também pode informar quando o sinal aparece e quando desaparece.

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.

Bob D'Agostino
fonte
"A baixa detecção de SNR pode ser um pouco obscura". Verdade. Estou curioso, você obtém um pico espúrio na FFT, constrói um filtro correspondente (como você escolheu o comprimento) e, em seguida, se correlaciona e, às vezes, rejeita a resposta? Como você pode ter tido um pico espúrio em primeiro lugar?
Spacey
Você obtém o comprimento do filtro correspondente ao saber sua taxa de amostragem e a frequência dos picos candidatos. Você constrói uma onda senoidal completa e verifica a correlação da onda senoidal construída sobre a janela atual dos dados no domínio do tempo. Mas você constrói apenas os filtros correspondentes nas frequências que foram determinadas como picos candidatos na FFT. O filtro correspondente é mais capaz de encontrar detecções SNR baixas do que a FFT e serve como uma validação. Se você tem SNR alto, os picos de FFT não precisam de validação extra, mas se o SNR for baixo, a FFT tende a gerar picos falsos.
Bob D'Agostino
Bob, entendo. E como você decide que existe inicialmente um pico na FFT? (Que métrica você usa para calcular isso?) Algo como max over mean?
Spacey
@ BobD'Agostino: O DFT pode ser visto como um banco de filtros de amostras críticas, cada um com uma resposta de impulso que é uma função exponencial complexa. Não está claro como isso seria muito diferente da abordagem que você está sugerindo, a menos que suas "frequências de pico de interesse" sejam medidas com compensações fracionárias da bandeja DFT, permitindo assim que o filtro seja mais centrado no tom de interesse. No SNR baixo, porém, pode ser difícil localizar os locais de pico precisos.
Jason R
0

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).

mbaitoff
fonte
Eu acho isso interessante, mas você me perdeu na parte da média e classificação. Você poderia esclarecer seus passos? Obrigado.
Spacey
Na verdade, não é necessário classificar as amostras de energia; você pode apenas procurar por picos de frequência e coletar algumas amostras em torno do pico e calculá-las como uma média. Provavelmente, a classificação nem é necessária aqui, a menos que você procure por mediana.
precisa saber é o seguinte
0

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.

hotpaw2
fonte