Question

Ressembler à un détecteur de coup (& "; Clap on! Clap Clap Clap off! Clap Clap ) Clap on, clap off, le Claper! clap clap ") Je dois détecter le moment où une porte se ferme. C’est dans un véhicule, ce qui est plus facile que la porte d’une pièce ou d’un foyer:

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

Regardez:
l'image de la forme d'onde montre une ligne continue, puis une perturbation soudaine, s'installant jusqu'à une ligne continue

L’échantillonnage est effectué à 16 bits à 4 kHz et je voudrais éviter de trop traiter et stocker les échantillons.

Lorsque vous le regardez avec audace ou un autre outil de forme d'onde, il est assez distinctif et se clipse presque toujours en raison de l'augmentation de la pression acoustique dans le véhicule - même lorsque les fenêtres et les portes sont ouvertes:

Écouter p>

Regardez:
alt text

Je suppose qu’il existe un algorithme relativement simple qui prendrait des lectures à 4 kHz, 8 bits, tout en gardant une trace de "l’état stable". Lorsque l’algorithme détecte une augmentation significative du niveau sonore, il marque le point.

  • Quelles sont vos pensées?
  • Comment détecteriez-vous cet événement?
  • Existe-t-il des exemples de code de calcul de niveau de pression acoustique qui pourraient aider?
  • Puis-je sortir avec un échantillonnage moins fréquent (1 kHz ou même plus lent?)

Mise à jour: Jouer avec Octave (analyse numérique en source ouverte - similaire à Matlab) et voir si le carré moyen me donnera ce dont j'ai besoin (ce qui donne un résultat très similaire à SPL)

Update2: En calculant le serveur RMS, la porte se ferme facilement, par exemple:
alt text  alt text
Maintenant, il me suffit de regarder les cas difficiles (radio allumée, chaleur / air en haut, etc.). Le CFAR a l'air vraiment intéressant - je sais que je vais devoir utiliser un algorithme adaptatif, et le CFAR convient certainement.

-Adam

Était-ce utile?

La solution

En regardant les captures d'écran des fichiers audio sources, un moyen simple de détecter un changement de niveau sonore consiste à effectuer une opération intégration numérique des exemples pour connaître le " énergie &"; de la vague à un moment précis.

Un algorithme approximatif serait:

  1. Divisez les échantillons en sections
  2. Calculez l'énergie de chaque section
  3. Prendre le rapport des énergies entre la fenêtre précédente et la fenêtre actuelle
  4. Si le rapport dépasse un certain seuil, déterminez qu'il y a un bruit fort et 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 devrais ajouter un avertissement selon lequel je n'ai pas essayé cette solution.

De cette manière, il devrait être possible d’être effectué sans que tous les échantillons soient d'abord enregistrés. Tant qu'il existe un 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 signifie toutefois qu'il y aura un retard dans le traitement, en fonction de la longueur du THRESHOLD. Déterminer une bonne longueur pour une section de son est une autre préoccupation.

Comment scinder en sections

Dans le premier fichier audio, il semble que la durée du son de la fermeture de la porte soit de 0,25 seconde; la fenêtre utilisée pour l'intégration numérique devrait donc être au maximum égale à la moitié de celle-ci, ou même plus semblable à & # 12288 un dixième, de sorte que la différence entre le silence et le son soudain puisse être remarquée, même si la fenêtre chevauche la section silence et la section bruit.

Par exemple, si la fenêtre d'intégration dure 0,5 seconde et que la première fenêtre couvre les 0,25 seconde de silence et 0,25 seconde de fermeture de la porte et que la seconde fenêtre couvre 0,25 seconde de porte et 0,25 seconde de silence, Il peut sembler que les deux sections du son ont le même niveau de bruit et ne déclenchent donc pas la détection du son. J'imagine qu'avoir une courte fenêtre atténuerait quelque peu ce problème.

Cependant, si la fenêtre est trop courte, la montée du son risque de ne pas s’intégrer parfaitement à une fenêtre et il peut sembler que la différence d’énergie entre les sections adjacentes est faible, ce qui peut entraîner la perte de son. être manqué.

Je pense que les <=> et <=> vont devoir être déterminés de manière empirique pour le son qui va être détecté.

Afin de déterminer le nombre d'échantillons que cet algorithme devra conserver en mémoire, disons, le <=> correspond à 1/10 du son de la porte qui se ferme, ce qui correspond à environ 0,025 seconde. À une fréquence d'échantillonnage de 4 kHz, c'est 100 échantillons. Cela ne semble pas être trop une exigence de mémoire. Utilisation d'échantillons 16 bits de 200 octets.

Avantages / Inconvénients

L’avantage de cette méthode est que le traitement peut être effectué avec une arithmétique entière simple si l’audio source est introduit sous forme d’entiers. Comme indiqué plus haut, le problème est que le traitement en temps réel sera retardé en fonction de la taille de la section intégrée.

Je peux penser à quelques problèmes avec cette approche:

  1. Si le bruit de fond est trop fort, la différence d'énergie entre le bruit de fond et la fermeture de la porte ne sera pas facilement distinguée et il sera peut-être impossible de détecter la fermeture de la porte.
  2. Tout bruit soudain, tel qu'un coup de poing, peut être considéré comme une porte en train de se fermer.

Peut-être, en combinant les suggestions dans les autres réponses, par exemple en essayant d’analyser la signature de fréquence de la porte en utilisant l’analyse de Fourier, ce qui nécessiterait plus de traitement, mais la rendrait moins sujette aux erreurs.

Cela va probablement demander quelques expériences avant de trouver un moyen de résoudre ce problème.

Autres conseils

Vous devez utiliser les interrupteurs de fermeture de porte dans la voiture. Essayer de le faire avec une analyse sonore, c'est trop d'ingénierie.

Il y a beaucoup de suggestions sur le traitement du signal différent approches à prendre, mais vraiment, au moment où vous en apprendrez sur la détection théorie, construction d’une carte de traitement de signal intégrée, apprentissage du traitement architecture pour la puce que vous avez choisie, essayez un algorithme, corrigez-le, puis réglez-le sur la voiture sur laquelle vous souhaitez l'utiliser (puis réaccordez et re-déboguez pour toute autre voiture), vous souhaiterez simplement coller un roseau collé passez à l'intérieur de la voiture et collez à chaud un aimant sur la porte.

Ce n’est pas un problème intéressant à résoudre pour les experts en dsp, mais de la façon dont vous posez cette question, il est clair que le son le traitement n'est pas la voie que vous souhaitez emprunter. Ce sera juste un cauchemar pour que cela fonctionne correctement.

De plus, le clapet n’est qu’un filtre passe-haut introduit dans un détecteur de seuil. (plus une minuterie pour vous assurer que 2 applaudissements sont assez rapides ensemble)

Il existe de nombreux ouvrages sur ce problème dans le monde des radars (cela s'appelle la théorie de la détection).

Vous pouvez jeter un oeil à & "Calculer la moyenne des cellules CFAR &"; détection (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!

Je commencerais par regarder le spectre. Je l'ai fait sur les deux fichiers audio que vous avez donnés, et il semble y avoir une certaine similitude que vous pourriez utiliser. Par exemple, la principale différence entre les deux semble se situer autour de 40-50Hz. Mon 0,02.

MISE À JOUR

J'ai eu une autre idée après avoir posté ceci. Si vous le pouvez, ajoutez un accéléromètre sur le périphérique. Ensuite, mettez en corrélation les signaux vibratoires et acoustiques . Cela devrait aider à la détection des portes croisées du véhicule. Je pense que cela devrait être bien corrélé puisque le son est piloté par les vibrations, contrairement à la stéréo, par exemple. J'ai un appareil capable de détecter le régime de mon moteur avec une monture de pare-brise (ventouse), de sorte que la sensibilité est peut-être là. (Je ne fais aucune promesse, ça marche!)

 alt text
(source: 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))

Peut-être devriez-vous essayer de détecter une augmentation instantanée significative de la pression atmosphérique qui devrait marquer la fermeture d’une porte. Vous pouvez l'associer à cette analyse de forme d'onde et de niveau sonore et tout cela pourrait vous donner un meilleur résultat.

Sur la question des échantillonnages moins fréquents, la fréquence sonore la plus élevée pouvant être capturée est la moitié du taux d'échantillonnage. Ainsi, si le son de la porte de la voiture était le plus fort à 1000Hz (par exemple), un taux d’échantillonnage inférieur à 2000Hz perdrait totalement ce son

Une barrière de bruit très simple ferait probablement l'affaire dans votre cas. Attendez simplement le premier échantillon dont l'amplitude est supérieure à une valeur de seuil spécifiée (pour éviter le déclenchement avec un bruit de fond). Vous n’auriez besoin que d’être plus compliqué que cela si vous avez besoin de distinguer différents types de bruit (par exemple, une porte qui se ferme ou un battement de main).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top