Dado um fluxo de áudio, encontrar quando uma porta bate (pressão sonora de cálculo nível?)

StackOverflow https://stackoverflow.com/questions/499795

Pergunta

Não ao contrário de um detector de bater palmas ( "aplauso on! clap clap off aplauso! clap clap aplauso on, off aplauso, o Clapper! clap clap ") Eu preciso para detectar quando uma porta se fecha. Isto é, em um veículo, que é mais fácil do que a porta da sala ou doméstico:

Ouça: http://ubasics.com/so/van_driver_door_closing.wav

Look:
imagem de forma de onda mostra linha constante, então súbita interrupção, estabelecendo-se para a linha constante

É amostragem em 16bits 4khz, e eu gostaria de evitar lotes de processamento ou armazenamento de amostras.

Quando você olha para ele em audácia ou outra ferramenta de forma de onda é bastante distinta, e quase sempre clips devido ao aumento da pressão sonora no veículo - mesmo quando as janelas e outras portas estão abertas:

Ouça: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

Look:
text alt

Eu espero que há um algoritmo relativamente simples que levaria leituras em 4 kHz, 8 bits, e manter o controle do 'estado estacionário'. Quando o algoritmo detecta um aumento significativo no nível de som que iria marcar o local.

  • Quais são seus pensamentos?
  • Como você detectar este evento?
  • Existem exemplos de código de cálculos de nível de pressão sonora que possa ajudar?
  • Can I fugir com amostragem menos frequente (1kHz ou mesmo mais lento?)

Update: Jogando com Octave (análise numérica de código aberto - semelhante ao Matlab) e ver se o quadrado médio de raiz vai me dar o que eu preciso (que resulta em algo muito parecido com o SPL)

Update2: computar o RMS encontra a porta fechar-se facilmente no caso simples:
text alt text alt
Agora eu só precisa de olhar para os casos difíceis (rádio ligado, calor / ar em alta, etc). O CFAR parece realmente interessante -. Eu sei que vou ter que usar um algoritmo adaptativo, e CFAR certamente se encaixa no projeto

-Adam

Foi útil?

Solução

Olhando para as imagens dos arquivos de áudio de origem, de uma maneira simples para detectar uma mudança no nível de som seria fazer um integração numérica das amostras para descobrir a 'energia' da onda em um momento específico.

Um algoritmo áspero seria:

  1. Divida as amostras em seções
  2. Calcule a energia de cada seção
  3. Tome a proporção das energias entre a janela anterior eo atual janela
  4. Se a relação for superior a um limite, determinar que houve um súbito barulho.

Pseudocódigo

samples = load_audio_samples()     // Array containing audio samples
WINDOW_SIZE = 1000                 // Sample window of 1000 samples (example)

for (i = 0; i < samples.length; i += WINDOW_SIZE):
    // Perform a numerical integration of the current window using simple
    // addition of current sample to a sum.
    for (j = 0; j < WINDOW_SIZE; j++):
        energy += samples[i+j]

    // Take ratio of energies of last window and current window, and see
    // if there is a big difference in the energies. If so, there is a
    // sudden loud noise.
    if (energy / last_energy > THRESHOLD):
        sudden_sound_detected()

    last_energy = energy
    energy = 0;

eu deveria adicionar um aviso de que eu não tentei isso.

Desta forma, deve ser possível de ser realizado sem ter as amostras de todos gravados em primeiro lugar. Enquanto não é tampão de algum comprimento (WINDOW_SIZE no exemplo), uma integração numérica pode ser realizada para calcular a energia da secção de som. Isto significa no entanto, que haverá um atraso no processamento, dependente do comprimento do WINDOW_SIZE. Determinar um comprimento bom para uma seção de som é outra preocupação.

Como dividido em seções

No primeiro arquivo de áudio, parece que a duração do som do fechamento da porta é de 0,25 segundos, assim que a janela utilizada para integração numérica provavelmente deve ser, no máximo, metade disso, ou mesmo mais como um décimo, de modo que o diferença entre o silêncio e som repentino pode ser notado, mesmo se a janela está sobreposição entre o setor silencioso ea seção ruído.

Por exemplo, se a janela de integração era de 0,5 segundos, e a primeira janela foi cobrindo os 0,25 segundos de silêncio e 0,25 segundos de fecho da porta, e a segunda janela foi cobrindo 0,25 segundos de fecho da porta e 0,25 segundos de silêncio, isto pode parecer que as duas seções de som tem o mesmo nível de ruído, portanto, não provocando a detecção de som. I imaginar ter uma janela curta iria aliviar este problema um pouco.

No entanto, ter uma janela que é muito curta significa que o aumento do som pode não caber inteiramente em uma janela, e pode apppear que há pouca diferença de energia entre as seções adjacentes, o que pode causar o som para ser desperdiçada.

Eu acredito que o WINDOW_SIZE e THRESHOLD são ambos vai ter que ser determinado empiricamente para o som que vai ser detectado.

Por uma questão de determinar quantas amostras que este algoritmo terá que manter na memória, digamos, o WINDOW_SIZE é 1/10 do som do fechamento da porta, que é cerca de 0,025 segundo. A uma taxa de amostragem de 4 kHz, que é de 100 amostras. Essa parece ser não muito de uma exigência de memória. Usando amostras de 16 bits que é 200 bytes.

Vantagens / Desvantagens

A vantagem deste método é que o processamento pode ser realizada com aritmética simples inteiro se a fonte de áudio é alimentado como inteiros. O problema é, como já mencionado, que o processamento em tempo real terá um atraso, dependendo do tamanho da seção que está integrada.

Há um par de problemas que eu posso pensar para essa abordagem:

  1. Se o ruído de fundo é muito alto, a diferença de energia entre o ruído de fundo e o fechamento da porta não será facilmente distinguidos, e pode não ser capaz de detectar o fechamento da porta.
  2. Qualquer ruído abrupto, como uma salva de palmas, poderia ser considerado como a porta está se fechando.

Talvez, combinando as sugestões em outras respostas, como a tentativa de analisar a assinatura do fechamento da porta usando análise de Fourier, o que exigiria mais processamento, mas seria torná-lo menos propenso a erros de frequência.

Provavelmente vai levar algumas experiências antes de encontrar uma maneira de modolve este problema.

Outras dicas

Você deve tocar para os interruptores de porta fechar no carro. Tentar fazer isso com a análise do som é overengineering.

Há uma série de sugestões sobre processamento de sinal diferente abordagens para tomar, mas realmente, pelo tempo que você aprender sobre a detecção teoria, construir uma placa de processamento de sinal embutido, aprender o processamento arquitetura para o chip que você escolheu, tente um algoritmo, depurá-lo, e em seguida ajustá-lo para o carro que você quer usá-lo em (e, em seguida, re-tune e re-debug -lo para todos os outros carros), você estará desejando que você acabou de stickey gravado um junco interruptor dentro do carro e hotglued um ímã para a porta.

Não que isso não é um problema interessante para resolver os especialistas DSP, mas do jeito que você está fazendo esta pergunta, é claro que o som processamento não é o caminho que pretende tomar. Será apenas um pesadelo para fazer o trabalho direito.

Além disso, a válvula é apenas um filtro de passagem alta alimentada a um detector de limiar. (Mais um temporizador para garantir 2 palmas rapidez suficiente juntos)

Há um monte de literatura relevante sobre este problema no mundo do radar (que é chamado de teoria de detecção).

Você pode ter um olhar para a detecção de "média celular CFAR" (constante da taxa de falso alarme). Wikipedia tem um pouco aqui . Sua idéia é muito semelhante a este, e ele deve funcionar! :)

Boa sorte!

Gostaria de começar por olhar para o espectral. Eu fiz isso nos dois arquivos de áudio que você deu, e não parece haver alguma similaridade você poderia usar. Por exemplo, a principal diferença entre os dois parece ser em torno de 40-50Hz. Meu .02.

Atualizar

Eu tinha uma outra idéia depois de postar isso. Se você puder, adicione um acelerômetro no dispositivo. Em seguida, correlacionar os sinais vibratórios e acústicos . Isso deve ajudar com a detecção de porta do veículo cruz. Eu estou pensando que deve ser bem correlacionada desde que o som é vibrationally conduzido, wheres o aparelho de som, por exemplo, não é. Eu tive um dispositivo que foi capaz de detectar o meu rotação do motor com uma montagem (ventosa) do pára-brisa, por isso, a sensibilidade pode estar lá. (Eu não faço promessas Isso funciona!)

text alt
(fonte: charlesrcook.com )

%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001

%% Van driver door
data = wavread('van_driver_door_closing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

O processo para encontrar pico distinta em sinais de áudio é chamado de transitória detecção . Aplicações como detecção transitória noreferrer nofollow da Sony ácido e Ableton usar o Live para encontrar as batidas da música para fazer vencer correspondência.

O pico distinto que você vê na forma de onda acima é chamado de transitório, e existem vários algoritmos boas para detectá-lo. O papel Transient detecção e classificação em matéria de energia descreve 3 métodos para fazer isso.

Eu imagino que a frequência e amplitude também variar significativamente de veículo para veículo. Melhor maneira de determinar que estaria tomando uma amostra em um Civic contra um grande SUV. Talvez você poderia ter o usuário fechar a porta em um modo de "aprendizagem" para obter a assinatura de amplitude e frequência. Então, você poderia usar isso para comparar quando em modo de utilização.

Você também pode considerar usando Fourier análise para eliminar ruídos de fundo que não estão associados com a porta fechar.

Talvez você deve tentar detectar aumento imediato significativo na pressão do ar que deve marcar a porta fechar. Você pode emparelhá-lo com esta análise de forma de onda e nível de som e todos eles podem dar-lhe um melhor resultado.

Sobre a questão da amostragem menos frequentes, a maior frequência de som que pode ser capturado é metade da taxa de amostragem. Assim, se o som porta do carro foi mais forte em 1000Hz (por exemplo), em seguida, uma taxa de amostragem abaixo 2000Hz perderia aquele som inteiramente

A porta de ruído muito simples seria provavelmente fazer muito bem na sua situação. Basta esperar para a primeira amostra cuja amplitude está acima de um valor limite especificado (para evitar o disparo com o ruído de fundo). Você só precisa ficar mais complicado do que isso, se você precisa distinguir entre diferentes tipos de ruído (por exemplo, uma porta se fechando contra um palmas).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top