2009-12-16 33 views
1

J'ai deux formes d'onde qui sont liées par un facteur numérique. J'ai besoin d'utiliser la mise à l'échelle optimale (moindres carrés) entre les deux formes d'onde pour calculer ce facteur dans Matlab. Malheureusement, je n'ai aucune idée de comment faire cela. Les deux formes d'ondes sont des signaux sismiques liés à la vitesse des ondes sismiques, que j'essaie de calculer. Des idées? Besoin de plus d'infos?Mise à l'échelle optimale des moindres carrés

+0

Les deux ondes sont-elles liées par un facteur d'amplitude ou par un facteur de fréquence? Y a-t-il un déphasage entre les deux ondes? –

+0

L'amplitude des formes d'onde doit être proportionnelle au facteur que j'essaie de calculer. Il peut y avoir un petit changement de phase mais supposons pour l'instant qu'il n'y en a pas. – Jon

Répondre

1

Appelez W1 et W2 les deux vecteurs. Pour que cela fonctionne, ils doivent être des vecteurs de colonne. Transposez-les s'ils sont des lignes plutôt que des colonnes. Ensuite, si nous souhaitons trouver la valeur de k telle que W1 = k * W2, il suffit d'utiliser une barre oblique inverse. La barre oblique inversée vous donne ici un estimateur par régression linéaire (moindres carrés), comme demandé. Cela ne gère pas le cas de déphasage inconnu bien sûr.

+0

Y a-t-il une limite à la capacité de cette équation comme estimateur? J'attends des valeurs de 2500-4000 mais cette méthode me donne une valeur de 0.9913. Je peux me rapprocher de ma valeur attendue en divisant les valeurs uniques des deux vecteurs colonnes. Je viens de penser aussi, parfois le rapport signal sur bruit est extrêmement faible, ce qui signifie que les ondes seront complètement déphasées. Je vais devoir limiter l'équation aux zones S/N élevées uniquement. – Jon

+0

Désolé, j'ai mal l'équation. Je l'ai maintenant corrigé mais je reçois toujours un résultat très variable lorsque je l'utilise sur de petits segments de forme d'onde, et les résultats attendus sont supposés être assez linéaires. – Jon

+1

Si vous voulez une transformation * affine *, vous devez inclure un terme d'interception: 'betas = [ones (numel (W2), 1), W2 (:)] \ W1 (:)', après quoi 'W1' est approximativement 'betas (1) + betas (2) * W2'; – shabbychef

1

Une manière cheesy d'estimer le facteur linéaire sans avoir à traiter le déphasage est de calculer le rapport des échelles estimées des vagues. la nase est d'utiliser l'écart-type:

k = std(W1)/std(W2);

si vous vous souciez de robustesse, je remplacerais dans le MAD ou l'IQR; le MAD est l'écart médian absolu, que vous pouvez (un peu inefficacement) « en ligne », comme si:

MAD = @(x)(median(abs(bsxfun(@minus,x,median(x))))); 
k = MAD(W1)/MAD(W2); 

l'IQR est la gamme interquartile, ce qui nécessite un calcul quantile approprié. vous pouvez implémenter cela de manière inefficace en utilisant sort. Je laisse cela comme un exercice au lecteur.

+0

BTW, ce genre de choses est le pain et le beurre de l'oxymétrie de pouls. Si vous manquez d'idées, consultez la documentation sur les bons de commande ou parcourez les brevets déposés par Nellcor et Massimo. – shabbychef