41 votes

Avec un flux audio, trouvez quand une porte claque (calcul du niveau de pression sonore?)

Pas à la différence d'un claquement de détecteur ("Coup sur! clap clap Clap off! clap clap Clap sur, clap off, le Battant! clap clap ") j'ai besoin de détecter quand une porte se ferme. C'est dans un véhicule, qui est plus facile que d'une chambre ou d'un ménage de la porte:

Écouter: http://ubasics.com/so/van_driver_door_closing.wav

Regardez:
image of waveform shows steady line, then sudden disruption, settling down to steady line

C'est d'échantillonnage à 16bits 4 khz, et je voudrais éviter beaucoup de traitement ou de stockage des échantillons.

Quand vous regardez dans audacity ou un autre de la forme d'onde de l'outil, il est tout à fait distinctif, et presque toujours des clips en raison de l'augmentation de pression sonore dans le véhicule, même lorsque les fenêtres et les portes sont ouvertes:

Écouter: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

Regardez:
alt text

Je m'attends il y a un algorithme relativement simple qui permettrait de prendre des mesures au 4 khz, 8 bits, et de garder trace de la stabiliser. Lorsque l'algorithme de détection d'une augmentation significative du niveau sonore, il serait de marquer l'endroit.

  • Quelles sont vos pensées?
  • Comment voulez-vous détecter cet événement?
  • Existe-il des exemples de code de niveau de pression acoustique calculs qui pourraient aider?
  • Puis-je sortir avec de moins en moins fréquentes, l'échantillonnage de 1 khz ou même plus lent?)

Mise à jour: Jouer avec Octave (open source d'analyse numérique - similaire à Matlab) et de voir si la racine de la moyenne des carrés va me donner ce dont j'ai besoin (qui aboutit à quelque chose de très similaire à la SPL)

Update2: le Calcul du RMS trouve la porte se fermer facilement dans le cas simple:
alt text alt text
Maintenant j'ai juste besoin de regarder les cas difficiles (radio, de la chaleur/air en haut, etc). Le CFAR a l'air vraiment intéressant - je sais que je vais avoir à utiliser un algorithme adaptatif, et CFAR certainement correspond à la facture.

28voto

coobird Points 70356

En regardant les captures d'écran de la source des fichiers audio, un moyen simple de détecter un changement dans le niveau sonore serait de faire une intégration numérique des échantillons, à savoir "l'énergie" de l'onde à un moment précis.

Une rude algorithme serait:

  1. Diviser les échantillons en sections
  2. Calculer l'énergie de chaque section
  3. Prendre le rapport des énergies entre la fenêtre précédente et la fenêtre en cours
  4. Si le ratio dépasse un certain seuil, de déterminer qu'il y avait un bruit fort soudain.

Pseudocode

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;

Je me dois d'ajouter un avertissement que je n'ai pas essayé ce.

De cette façon devrait être possible d'être effectuées sans avoir les échantillons de toutes enregistrées en premier. Tant qu'il y a de la mémoire tampon d'une certaine longueur (WINDOW_SIZE dans l'exemple), une intégration numérique peut être effectuée pour calculer l'énergie de la section de son. Cela ne signifie toutefois qu'il y aura un retard dans le traitement, dépend de la longueur de l' WINDOW_SIZE. La détermination d'une bonne longueur pour une section de son est un autre sujet de préoccupation.

Comment Diviser en Sections

Dans le premier fichier audio, il apparaît que la durée du son de la fermeture de la porte est de 0,25 secondes, de sorte que la fenêtre utilisée pour l'intégration numérique devrait probablement être à plus de la moitié, ou même plus comme un dixième, de sorte que la différence entre le silence et soudain le son peut-être remarqué, même si la fenêtre est le chevauchement entre le silence de la section et le bruit de la section.

Par exemple, si la fenêtre d'intégration était de 0,5 secondes, et le premier de la fenêtre a été couvrant les 0,25 secondes de silence et de 0,25 secondes de fermeture de la porte, et la deuxième fenêtre couvrait de 0,25 secondes de fermeture de la porte et de 0,25 secondes de silence, il peut sembler que les deux sections de son a le même niveau de bruit, donc pas de déclenchement de la détection audio. J'imagine une petite fenêtre permettrait d'atténuer ce problème quelque peu.

Cependant, avoir une fenêtre qui est trop court signifie que la hausse le son ne peut pas totalement s'inscrivent dans une fenêtre, et il peut apppear qu'il y a peu de différence en énergie entre les sections adjacentes, ce qui peut provoquer le son à manquer.

Je crois que le WINDOW_SIZE et THRESHOLD sont à la fois être déterminés de façon empirique pour le son qui va être détecté.

Pour l'amour de déterminer le nombre d'échantillons que cet algorithme devra garder en mémoire, disons, l' WINDOW_SIZE est de 1/10, le son de la fermeture de la porte, qui est d'environ 0.025 seconde. À une fréquence d'échantillonnage de 4 kHz, qui est de 100 échantillons. Qui ne semble pas être trop beaucoup d'une exigence de mémoire. En utilisant des échantillons de 16 bits c'est 200 octets.

Avantages / Inconvénients

L'avantage de cette méthode est que le traitement peut être effectué avec une simple arithmétique entière si la source audio est alimenté en tant que nombres entiers. Le hic, c'est, comme déjà mentionné, que le traitement en temps réel disposera d'un délai, selon la taille de la section qui est intégré.

Il ya un couple de problèmes que je peux penser de cette approche:

  1. Si le bruit de fond est trop forte, la différence d'énergie entre le bruit de fond et la fermeture de la porte ne sera pas facile à distinguer, et il peut ne pas être en mesure de détecter la fermeture de la porte.
  2. Brusques bruit, comme un tonnerre, pourrait être considéré comme la porte se referme.

Peut-être, en combinant les suggestions dans les autres réponses, comme par exemple essayer d'analyser la fréquence de la signature de la fermeture de la porte à l'aide de l'analyse de Fourier, qui aurait besoin de plus de traitement mais la rendrait moins sujettes à l'erreur.

Elle va probablement prendre quelques essais avant de trouver une façon de résoudre ce problème.

8voto

James Caccese Points 730

Vous devez puiser dans la porte fermer les interrupteurs dans la voiture. Essayez de faire cela avec son analyse est overengineering.

Il ya beaucoup de suggestions sur les différents traitement du signal les approches à prendre, mais vraiment, le temps que vous apprenez au sujet de la détection de la théorie, de construire un intégré de traitement du signal conseil, apprendre le traitement l'architecture de la puce que vous avez choisi, la tentative d'un algorithme, le débogage, puis tune pour la voiture que vous souhaitez utiliser (et puis re-tune et re-debug pour toutes les autres voitures), vous serez en souhaitant que vous venez de stickey enregistré un roseau commutateur à l'intérieur de la voiture et hotglued un aimant de la porte.

Non pas que ce n'est pas un problème intéressant à résoudre pour le dsp experts, mais de la façon dont vous vous posez cette question, il est clair que le son le traitement n'est pas la route que vous voulez prendre. Il va juste être un tel cauchemar pour le faire marcher droit.

Aussi, le battant est juste un filtre passe-haut de la fed dans un détecteur de seuil. (en plus d'une minuterie, assurez-2 claps assez rapidement ensemble)

7voto

Drew Hall Points 15917

Il existe de nombreux ouvrages sur ce problème dans le monde du radar (la théorie de la détection).

Vous pouvez jeter un coup d'œil à la détection de "moyenne des cellules, CFAR" (taux de fausse alarme constant). Wikipedia a un peu ici . Votre idée est très similaire à celle-ci, et ça devrait marcher! :)

Bonne chance!

5voto

ccook Points 3190

Je voudrais commencer par regarder la spectrales. Je l'ai fait sur les deux fichiers audio que vous avez donné, et il semble y avoir une certaine similitude, que vous pouvez utiliser. Par exemple, la principale différence entre les deux semble être autour de 40-50 hz. Mon .02.

Mise à JOUR

J'ai eu une autre idée après cette annonce. Si vous le pouvez, ajouter un accéléromètre sur l'appareil. Ensuite, la corrélation de l'vibratoire et acoustique des signaux. Cela devrait faciliter la croix de porte de véhicule de détection. Je pense qu'il doit être bien corrélées car le son est vibration conduit, wheres la stéréo par exemple, ne l'est pas. J'ai eu un appareil capable de détecter mon moteur tr / min avec un support de pare-brise (ventouse), de sorte que la sensibilité peut être là. (Je fais pas de promesses, cela fonctionne!)

alt text

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

4voto

Nick Haddad Points 4326

Le processus pour trouver distinctes flambée des signaux audio est appelée détection de transitoire. Des Applications comme Sony Acide et Ableton Live utilisation transitoire de détection pour trouver les battements de la musique pour faire des beat matching.

L'distinctes spike vous voir dans la forme d'onde ci-dessus est appelé une passagère, et il y a plusieurs algorithmes pour la détection d'elle. Le papier Transitoire de détection et de classification en matière d'énergie décrit 3 méthodes pour ce faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X