Melhor maneira de avaliar a "qualidade" da autocorrelação?

9

Esta é uma viagem lateral do meu aplicativo de ronco .

Eu tive uma falha ao produzir uma autocorrelação do sinal de áudio, para ver se isso "se correlaciona" com o ronco / respiração muito bem. Eu tenho um algoritmo simples (produz 1.0 como o elemento zeroth, o que é um bom sinal), mas estou pensando em como avaliar o resultado para determinar se a autocorrelação é forte e, talvez ainda mais, como usá-lo para separar várias fontes sonoras possíveis.

Pergunta 1: O RMS da autocorrelação (ignorando o elemento zero) é uma métrica de "qualidade" tão boa quanto qualquer outra, ou existe algo melhor?

Para elaborar: eu simplesmente quero uma maneira numérica (vs "olhar" para um gráfico) para distinguir um sinal altamente correlacionado automaticamente de um sinal menos correlacionado automaticamente.

(Eu realmente não sei o suficiente para saber que outras perguntas fazer.)

Alguns resultados iniciais: Em alguns casos, a autocorrelação (RMS ou pico) mostra um salto dramático na ressonância - precisamente a resposta que eu gostaria de ver. Em outros casos, não há movimento aparente nessas medidas (e isso pode ser dois roncos sucessivos com as duas respostas) e, em situações de alto ruído, as medições realmente diminuem (levemente) durante um ronco.

Atualização - 22 de maio: finalmente consegui mais tempo para trabalhar nisso. (Fui contratado para outro aplicativo que é literalmente uma dor.) Alimentei a saída da autocorrelação em uma FFT e a saída é um pouco interessante - mostra um pico bastante dramático perto da origem quando um ronco começa.

Então agora estou diante do problema de quantificar esse pico de alguma forma. Estranhamente, os picos mais altos, em termos de magnitude absoluta, ocorrem em outros momentos, mas tentei a razão entre o pico e a média aritmética e isso acompanha muito bem. Então, quais são algumas boas maneiras de medir o "pico" da FFT. (E, por favor , não diga que eu preciso fazer uma FFT - isso já está perto de engolir o próprio rabo. :))

Além disso, ocorreu-me que a qualidade da FFT poderia melhorar um pouco se eu refletisse os resultados da autocorrelação, com zero (que é por definição 1,0 magnitude) no meio. Isso colocaria as "caudas" nas duas extremidades. Esta é (possivelmente) uma boa ideia? A imagem no espelho deve estar na vertical ou invertida? (Claro, vou tentar, independentemente do que você diz, mas pensei que talvez eu pudesse obter algumas dicas sobre os detalhes.)

Tentei flatness--

Meus casos de teste podem ser divididos aproximadamente na categoria "bem comportado" e na categoria "filhos problemáticos".

Para os casos de teste "bem-comportados", a planicidade da FFT da autocorrelação diminui drasticamente e a proporção do pico para a autocorrelação média sobe durante um ronco. A proporção desses dois números (razão de pico dividida pela planicidade) é particularmente sensível, exibindo uma subida de 5 a 10 vezes durante uma respiração / ronco.

Para os "filhos problemáticos", no entanto, os números seguem exatamente na direção oposta. A relação pico / média diminui levemente, enquanto o nivelamento aumenta de 50 a 100%

A diferença entre essas duas categorias é (principalmente) tripla:

  1. Os níveis de ruído são (geralmente) mais altos nos "filhos problemáticos"
  2. Os níveis de áudio são (quase sempre) mais baixos nos "filhos problemáticos"
  3. Os "filhos problemáticos" tendem a consistir em mais respiração e menos ronco (e eu preciso detectar os dois)

Alguma ideia?

Atualização - 25/5/2012: É um pouco prematuro ter uma dança da vitória, mas quando refleti a autocorrelação sobre um ponto, peguei a FFT disso e depois aplanei o espectro, meu esquema de taxa combinada mostrou um bom salto vários ambientes diferentes. Refletir a autocorrelação parece melhorar a qualidade da FFT.

Um ponto menor, porém, é que, como o "componente DC" do "sinal" refletido é zero, o resultado zero da FFT é sempre zero, e isso meio que quebra uma média geométrica que inclui zero. Mas pular o elemento zeroth parece funcionar.

O resultado que estou obtendo está longe de ser suficiente para identificar os roncos / respirações por si só, mas parece ser uma "confirmação" bastante sensível - se eu não der o "pulo", provavelmente não será um ronco / respiração.

Não analisei de perto, mas suspeito que o que está acontecendo é que um som de assobio ocorre em algum lugar durante a respiração / ronco, e esse apito é o que está sendo detectado.

Daniel R Hicks
fonte
Quanto à medida de correlação da "força", o que você precisa fazer é normalizar seus dois sinais, antes de fazer uma correlação. (Após a normalização, a soma de cada sinal deve ser 1). Então o pico de correlação sempre existirá entre -1 e 1. Essa é a sua força. Não tenho certeza sobre o restante da sua pergunta, talvez você possa editar um pouco.
Spacey
Como estou lidando com autocorrelação, os dois sinais são um e o mesmo e, por definição, "normalizados" um em relação ao outro. Por "força", quero dizer quanta autocorrelação existe.
Daniel R Hicks
Não entendo o que você deseja, mas acho que você deseja medir o valor máximo do pico de autocorrelação, não o valor RMS da coisa toda.
Endolith 18/05/12
@ endolith Eu acho que ele pode estar perguntando sobre uma medida de 'pico' da sua função de autocorrelação, a fim de distinguir um sinal com um delta (autocorrelação de ruído) de um sinal de muitos picos? (autocorrelação de sinal com harmônicos). Talvez usando a medida espectral-planicidade também podem ser usados aqui ...
Spacey
Parece que planicidade espectral é o que ele quer. Daniel: Você quer determinar a diferença entre o sinal e o ruído branco?
Emre

Respostas:

3

Preliminares

Essa demonstração é mais fácil com o pacote auditivo do MATLAB , que permite a leitura / gravação de arquivos MP3. Como alternativa, você pode converter o arquivo MP3 no exemplo em WAV manualmente.

Caso fácil

Antes de examinarmos seu arquivo problemático, vamos ao SoundCloud e roncaremos decentemente para saber o que esperar quando o SNR estiver alto. Este é um MP3 estéreo de 44.1KHz de 52s. Faça o download para uma pasta no caminho do MATLAB.

Agora vamos calcular o espectrograma (escolhi uma janela Hann de 8192 amostras) e o nivelamento espectral:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

Planicidade espectral do ronco de brobar

As enormes quedas no nivelamento espectral (isto é, desvio do ruído branco) gritam "Estou roncando". Podemos classificá-lo facilmente observando o desvio da linha de base (mediana):

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

A planicidade espectral classificada do ronco de brobar

Tivemos mais de dois desvios padrão de altura livre. A variação padrão em si, para referência, é 6,8487 .

Caso difícil

Agora vamos dar uma olhada no seu arquivo . É um arquivo WAV de 10 minutos e 8KHz. Como o nível é tão baixo, ajuda a compandecer o sinal.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

Nivelamento espectral do arquivo barulhento

Vê aqueles mergulhos agradáveis ​​que acompanham cada ronco? Nem eu. E os bons picos? Eles não estão roncando, mas o som do assunto se movendo. O desvio padrão é um insignificante 0,9388

Conclusão

Você precisa adquirir um sinal mais limpo se quiser confiar na planicidade espectral! Eu o compara apenas para ouvir qualquer coisa. Se um SNR baixo for detectado, instale o usuário a colocar o telefone mais próximo ou use um microfone como o telefone que acompanha o fone de ouvido.

A boa notícia é que é possível detectar o ronco mesmo no caso problemático. No entanto, como essa pergunta não era apenas sobre detecção de ronco, pararei aqui e explicarei como fazer isso em sua outra pergunta .

Emre
fonte
Agora você tem uma noção do que eu estou enfrentando. Essa amostra foi de qualidade "média" entre as amostras com as quais tenho que trabalhar - há muito pior. E eu posso ler bem essa amostra com meus algoritmos existentes.
Daniel R Hicks
Quais algoritmos são esses?
Emre
Resumindo: o som é executado através da FFT 8 vezes por segundo, o espectro é dividido em 5 bandas de frequência, a potência e a diferença espectral para cada banda são calculadas e, em seguida, os resultados são pontuados de maneira a dar mais peso às bandas que aparecem estar variando na taxa certa.
Daniel R Hicks
@ Emre Estou seguindo seus links, criou uma conta na soundcloud, mas não consigo ver exatamente como você baixou esse ronco. Não há botão de download ao lado ou em qualquer outro lugar.
Spacey 25/05
@ Mohammad: eu forneci um link para download.
Emre
1

A autocorrelação está diretamente relacionada ao DFT inverso da densidade espectral de potência do seu sinal. Nesse sentido, qualquer informação contida na magnitude ao quadrado da sua DFT também está contida na função de autocorrelação.

Dito isso, no entanto, a única coisa que a autocorrelação pode dizer é a presença de harmônicos. (A distância do pico central ao próximo mais alto). Talvez a respiração do ronco VS tenha diferentes harmônicos fundamentais e, nesse caso, o "método de autocorrelação" certamente seria um bom ponto de partida para que os recursos (neste caso, harmônicos) possam ser extraídos.

Assim, a autocorrelação do ruído branco será uma função delta e não terá picos secundários (ou outros picos nesse sentido) fora do pico central. Por outro lado, se o sinal tiver harmônicos, sua função de autocorrelação conterá picos secundários e terciários, proporcionais ao harmônico fundamental presente. A distância do pico principal (centro) ao pico secundário, o período da sua frequência fundamental.

EDITAR:

Eu acho que o que você procura é uma medida - um número - que codifique o quanto uma função de autocorrelação é semelhante a um delta, VS uma função de autocorrelação parecendo ter muitos picos. Para esse fim, a medida do nivelamento espectral pode ser aplicável ou, em um caso mais geral, a medida da sua média geométrica para média aritmética.

Spacey
fonte
Fiquei com a impressão de que a autocorrelação distinguiria melhor o sinal (rítmico) do ruído (aleatório) - o ruído se autocorrelaria próximo de zero. Um DFT, OTOH, representará ruído como ruído - um espectro espalhado. Pelo menos essa é a "teoria" como eu a entendo.
Daniel R Hicks
Por favor, veja minhas edições.
Spacey