La meilleure façon d'évaluer la «qualité» de l'autocorrélation?


9

Ceci est un détour par mon application de ronflement .

J'ai eu du mal à produire une autocorrélation du signal audio, pour voir si cela "corrélait" très bien avec le ronflement / la respiration. J'ai un algorithme simple (produit 1.0 comme élément zéro, ce qui est un bon signe), mais je me demande comment évaluer le résultat pour déterminer si l'autocorrélation est forte et, peut-être plus loin, comment l'utiliser pour séparer diverses sources sonores possibles.

Question n ° 1: Le RMS de l'autocorrélation (saut d'élément zéro) est-il une métrique de "qualité" aussi bonne, ou y a-t-il quelque chose de mieux?

Pour élaborer: je veux simplement une méthode numérique (vs "regarder" un graphique) pour distinguer un signal hautement autocorrélé d'un signal moins bien autocorrélé.

(Je ne sais pas vraiment assez pour savoir quelles autres questions poser.)

Quelques premiers résultats: dans certains cas, l'autocorrélation (RMS ou pic) montre un saut spectaculaire sur un ronflement - précisément la réponse que j'aimerais voir. Dans d'autres cas, il n'y a aucun mouvement apparent dans ces mesures (et cela peut être deux ronflements successifs avec les deux réponses), et dans des situations de bruit élevé, les mesures plongent réellement (légèrement) pendant un ronflement.

Mise à jour - 22 mai: J'ai enfin eu un peu de temps pour y travailler encore. (J'ai été retiré sur une autre application qui est littéralement une douleur.) J'ai alimenté la sortie de l'autocorrélation dans une FFT et la sortie est quelque peu intéressante - elle montre un pic assez dramatique près de l'origine quand un ronflement commence.

Alors maintenant, je suis confronté au problème de quantifier ce pic d'une manière ou d'une autre. Curieusement, les pics les plus élevés, en termes de magnitude absolue, se produisent à d'autres moments, mais j'ai essayé le rapport pic / moyenne arithmétique et cela suit assez bien. Alors, quelles sont les bonnes façons de mesurer le "pic" de la FFT. (Et s'il vous plaît , ne dites pas que je dois en prendre une FFT - cette chose est déjà proche d'avaler sa propre queue. :))

De plus, il m'est venu à l'esprit que la qualité de la FFT pourrait être quelque peu améliorée si je reflétais les résultats d'autocorrélation alimentés en miroir, avec zéro (qui est par définition de magnitude 1,0) au milieu. Cela mettrait la «queue» aux deux extrémités. Est-ce (peut-être) une bonne idée? L'image miroir doit-elle être verticale ou inversée? (Bien sûr, je vais l'essayer indépendamment de ce que vous dites, mais j'ai pensé que je pourrais peut-être obtenir des indices sur les détails.)

Planéité éprouvée -

Mes cas de test peuvent être divisés en gros dans la catégorie «bien élevé» et la catégorie «enfants à problème».

Pour les cas de test "bien comportés", la planéité de la FFT de l'autocorrélation baisse de façon spectaculaire et le rapport du pic à l'autocorrélation moyenne grimpe pendant un ronflement. Le rapport de ces deux nombres (rapport de pic divisé par la planéité) est particulièrement sensible, présentant une montée de 5 à 10 fois pendant un souffle / ronflement.

Pour les «enfants à problème», cependant, les chiffres vont exactement dans la direction opposée. Le rapport pic / moyenne baisse légèrement tandis que la planéité augmente en fait de 50 à 100%

La différence entre ces deux catégories est (principalement) triple:

  1. Les niveaux de bruit sont (généralement) plus élevés chez les "enfants à problèmes"
  2. Les niveaux audio sont (presque toujours) plus bas chez les "enfants à problèmes"
  3. Les «enfants à problèmes» consistent généralement en plus de respiration et moins de ronflements réels (et je dois détecter les deux)

Des idées?

Mise à jour - 25/05/2012: C'est un peu prématuré d'avoir une danse de victoire, mais quand j'ai réfléchi à l'autocorrélation sur un point, j'ai pris la FFT de cela, puis j'ai fait la planéité spectrale, mon schéma de rapport combiné a montré un bon saut dans plusieurs environnements différents. La réflexion de l'autocorrélation semble améliorer la qualité de la FFT.

Un point mineur, cependant, est que, puisque la "composante continue" du "signal" réfléchi est nulle, le résultat nul de la FFT est toujours nul, et cela casse un peu une moyenne géométrique qui inclut zéro. Mais sauter l'élément zéro semble fonctionner.

Le résultat que j'obtiens est loin d'être suffisant pour identifier les ronflements / respirations par lui-même, mais cela semble être une "confirmation" assez sensible - si je n'obtiens pas le "saut", ce n'est probablement pas un ronflement / respiration.

Je ne l'ai pas analysé de près, mais je soupçonne que ce qui se passe est qu'un sifflement se produit quelque part pendant le souffle / ronflement, et que ce sifflement est ce qui est détecté.


En ce qui concerne la mesure de la force de la corrélation, ce que vous devez faire est de normaliser vos deux signaux corrélés, avant de faire une corrélation. (Après normalisation, la somme de chaque signal doit être égale à 1). Ensuite, le pic de corrélation existera toujours entre -1 et 1. C'est votre force. Je ne suis pas sûr du reste de votre question, vous pouvez peut-être éditer un peu.
Spacey

J'ai affaire à l'autocorrélation, donc les deux signaux sont identiques et sont, par définition, «normalisés» l'un par rapport à l'autre. Par "force", je veux dire combien il y a d'autocorrélation.
Daniel R Hicks

Je ne comprends pas ce que vous voulez, mais je pense que vous voudriez mesurer la valeur maximale du pic d'autocorrélation, pas la valeur RMS de l'ensemble.
endolith

@endolith Je pense qu'il pourrait se poser des questions sur une mesure de «pic» de votre fonction d'autocorrélation, afin de distinguer un signal avec un delta, (autocorrélation du bruit) d'un signal à plusieurs pics? (autocorrélation du signal avec les harmoniques). Peut-être que l'utilisation de la mesure de planéité spectrale peut également être utilisée ici ...
Spacey

On dirait que la planéité spectrale est ce qu'il veut. Daniel: Voulez-vous déterminer la différence entre le signal et le bruit blanc?
Emre

Réponses:


3

Préliminaires

Cette démonstration est plus simple avec le package MATLAB audioread , qui permet de lire / écrire des fichiers MP3. Alternativement, vous pouvez convertir le fichier MP3 de l'exemple en WAV manuellement.

Étui facile

Avant d'examiner votre fichier problématique, dirigeons-nous vers SoundCloud et saisissons un ronflement décent afin que nous sachions à quoi nous attendre lorsque le SNR est élevé. Il s'agit d'un MP3 stéréo à 44,1 kHz 52s. Téléchargez-le dans un dossier dans le chemin de MATLAB.

Calculons maintenant le spectrogramme (j'ai choisi une fenêtre Hann de 8192 échantillons) et la planéité spectrale:

[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

Planéité spectrale du ronflement de Brobar

Les immenses creux dans la planéité spectrale (c'est-à-dire la déviation du bruit blanc) crient "Je ronfle". Nous pouvons facilement le classer en examinant l'écart par rapport à la ligne de base (médiane):

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

La planéité spectrale classée du ronflement de Brobar

Nous avons eu plus de deux écarts-types d'espace libre. La variation standard elle-même, pour référence, est de 6,8487 .

Étui rigide

Jetons maintenant un œil à votre dossier . Il s'agit d'un fichier WAV de 8 minutes à 8 kHz. Étant donné que le niveau est si bas, il aide à compand le signal.

[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);

Planéité spectrale de la lime bruyante

Voir ces belles trempettes accompagnant chaque ronflement? Moi non plus. Et les beaux sommets? Ils ne ronflent pas, mais le son du sujet en mouvement. L'écart type est dérisoire 0,9388

Conclusion

Vous devez acquérir un signal plus propre si vous voulez vous fier à la planéité spectrale! Je l'avais compand juste pour entendre quoi que ce soit. Si un SNR faible est détecté, incitez l'utilisateur à rapprocher le téléphone ou utilisez un microphone comme le téléphone fourni avec le casque.

La bonne nouvelle est qu'il est possible de détecter le ronflement même dans le cas problématique. Cependant, comme cette question ne concernait pas seulement la détection des ronflements, je m'arrêterai ici et expliquerai comment procéder dans votre autre question .


Vous avez maintenant une idée de ce à quoi je suis confronté. Cet échantillon était de qualité "moyenne" parmi les échantillons avec lesquels je dois travailler - il y en a bien pire. Et je peux assez bien lire cet échantillon avec mes algorithmes existants.
Daniel R Hicks

Quels sont ces algorithmes?
Emre

En bref: le son passe par la FFT 8 fois par seconde, le spectre est découpé en 5 bandes de fréquences, la puissance et la différence spectrale pour chaque bande sont calculées, puis les résultats sont notés d'une manière qui donne plus de poids aux bandes qui apparaissent varier au bon rythme.
Daniel R Hicks

@Emre Je suis vos liens, j'ai créé un compte soundcloud, mais je ne vois pas exactement comment vous avez téléchargé ce ronflement. Il n'y a pas de bouton de téléchargement à côté ou ailleurs.
Spacey

@Mohammad: J'ai fourni un lien de téléchargement.
Emre

1

L'autocorrélation est directement liée à la DFT inverse de la densité spectrale de puissance de votre signal. En ce sens, toutes les informations contenues dans l'amplitude au carré de votre DFT sont également contenues dans la fonction d'autocorrélation.

Cela dit, la seule chose que l'autocorrélation peut vous dire est la présence d'harmoniques. (La distance entre le pic central et le plus haut suivant). Peut-être que la respiration du ronflement VS a différentes harmoniques fondamentales, et si c'est le cas, la `` méthode d'autocorrélation '' serait certainement un bon point de départ pour extraire des caractéristiques (dans ce cas, les harmoniques).

Ainsi, l'autocorrélation du bruit blanc, sera une fonction delta, et n'aura aucun pic secondaire (ou tout autre pic d'ailleurs) hors de son pic central. En revanche, si le signal a des harmoniques, sa fonction d'autocorrélation contiendra des pics secondaires et tertiaires, proportionnels à l'harmonique fondamentale présente. La distance entre le pic principal (centre) et le pic secondaire, la période de votre fréquence fondamentale.

ÉDITER:

Je pense que ce que vous recherchez est une mesure - un nombre - codifiant à quel point une fonction d'autocorrélation est similaire à un delta, VS une fonction d'autocorrélation qui semble avoir de nombreux pics. À cette fin, la mesure de la planéité spectrale pourrait être applicable, ou dans un cas plus général, la mesure de votre moyenne géométrique en moyenne arithmétique.


J'avais l'impression que l'autocorrélation distinguerait mieux le signal (rythmique) du bruit (aléatoire) - le bruit serait autocorrélé près de zéro. Un DFT, OTOH, représentera le bruit comme du bruit - un spectre étalé. C'est du moins la "théorie" telle que je la comprends.
Daniel R Hicks

Veuillez voir mes modifications.
Spacey
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.