Esta é uma continuação de uma pergunta anterior .
Estou tentando analisar os sons da respiração e do ronco e, embora eu possa detectar muito bem o ronco agora, a respiração é um desafio maior.
Aprendi que se eu quebrar a faixa de frequência analisada (cerca de 4KHz, amostrada em cerca de 8KHz, com um tamanho de quadro de 1024) em cerca de 5 subfaixas, muitas vezes uma das subfaixas exibe uma boa sensibilidade (usando diferença espectral) enterrada no ruído na faixa geral. O truque é determinar em qual subrange "confiar" quando.
Presumivelmente, o subintervalo "confiável" exibirá variabilidade a uma taxa entre cerca de 2Hz e 0,05Hz, enquanto os subfaixas "ruins" se comportariam de maneira mais aleatória, com a maior parte de sua variação em intervalos mais curtos.
Eu poderia criar algum tipo de algoritmo para suavizar os valores em uma resolução de segundo e depois calcular a variabilidade em intervalos mais longos, mas me pergunto se não existe um algoritmo "fixo" para esse tipo de coisa - algo com talvez um pouco de teoria por trás disso?
Alguma sugestão?
[Nota: Eu sei que, em teoria, é possível usar um FFT para extrair essas informações, mas isso parece usar um taco de beisebol para matar uma pulga. Talvez algo um pouco mais leve?]
Adicionado:
De certa forma (para usar uma analogia), estou tentando detectar um sinal de "banda base" em uma transmissão de RF (apenas o "RF" é frequências de áudio e a "banda de base" está abaixo de 8Hz). E, de certa forma, o "RF" é "espectro de espalhamento" - os sons que eu quero detectar tendem a gerar muitos harmônicos e / ou têm vários componentes de frequência separados; portanto, se uma banda do espectro é muito barulhenta, posso provavelmente faça uso de outro. O objetivo é determinar basicamente algumas métricas semelhantes ao SNR para as várias bandas de frequência, supondo que a maioria dos "ruídos" seja> 2Hz e meu sinal seja menor que 2Hz.
Tenho como entrada neste algoritmo as amplitudes brutas (soma das amplitudes de FFT em todas as frequências incluídas) para cada banda, medidas em intervalos de 8Hz.
(Deve-se observar que, embora eu não tenha feito nenhuma medição formal do SNR, o SNR geral em todo o espectro processado parece estar freqüentemente próximo ou abaixo de 1,0 - se você observar visualmente o envelope sonoro em uma ferramenta como o Audacity, nenhuma modulação do o envelope é perceptível (mesmo que o ouvido possa discernir claramente os sons da respiração), e é por isso que é necessário analisar as faixas para encontrar pessoas com SNR decente.)
fonte
Respostas:
Daniel,
Ao reler sua pergunta, parece que o que aprendi a ser conhecido como 'Largura de banda de Gabor "pode ser útil nesse caso, para você tentar medir a' variabilidade espectral '. (Dilip forneceu uma boa resposta para minha pergunta sobre momentos espectrais aqui).
Quando eu a estudei mais, a largura de banda de Gabor parece realmente ser apenas uma medida de quão 'espalhado' o espectro é a partir de sua média. (Daí a manipulação dos momentos).
Dê uma olhada e veja o que você acha.
fonte
Você já experimentou o fluxo espectral. Há implementação do MATLAB aqui: http://blog.weisu.org/2009/12/spectral-flux-sf-in-audio.html
fonte
O que você precisa parece muito maior que uma pulga. Portanto, talvez você precise ir na direção oposta e fazer mais do que apenas uma FFT. Talvez análise de cepstro de baixa frequência ou cepstral para encontrar sua frequência "exiter".
fonte
Aqui está o que eu sugiro:
Para cada n:
Escolha a sub-banda com o maior pico de autocorrelação (= o mais "achatado").
Medidas de pico para observar:
Esse tipo de métrica é usado, por exemplo, para distinguir fala sonora / sonora.
fonte