Anpassen mit Faltung


Inhalt

  1. 1 Zusammenfassung
  2. 2 Was Sie lernen werden
  3. 3 Beispiele und Schritte
    1. 3.1 Hintergrund
    2. 3.2 Funktion definieren
    3. 3.3 Kurve anpassen


Zusammenfassung

Beim Durchführen einer Kurvenanpassung für die Versuchsdaten ergibt sich möglicherweise die Notwendigkeit, die Antwort des Instruments in den Daten zu berücksichtigen. Eine Möglichkeit besteht darin, zuerst eine Entfaltung der Daten durchzuführen, um die Instrumentantwort zu entfernen, und dann die Kurvenanpassung in einem zweiten Schritt durchzuführen. Die Entfaltung ist jedoch nicht immer zuverlässig, da die Ergebnisse sehr anfällig sein können gegenüber jeglicher Art von Rauschen in den Daten. Eine zuverlässigere Möglichkeit ist das Durchführen einer Faltung der Anpassungsfunktion mit der Instrumentantwort, während die Anpassung durchgeführt wird. Dieses Tutorial erläutert, wie die Faltung während der Anpassung durchgeführt wird.

Wenn Ihre Daten eine Faltung von Gauss- und Exponential-Funktionen darstellt, können Sie einfach die Standardanpassungsfunktion GaussMod in der Kategorie Peakfunktionen verwenden, um Ihre Daten direkt anzupassen.

Origin-Version mind. erforderlich: Origin 2016 SR0

Was Sie lernen werden

Dieses Tutorial zeigt Ihnen, wie Sie:

  • während der Durchführung von Iterationen auf Anpassungsfunktonen zugreifen.
  • eine Faltung während des Anpassens durchführen.

Beispiel und Schritte

Hintergrund

Beginnen Sie dieses Beispiel mit dem Import der Datei \Samples\Curve Fitting\FitConv.dat.

Tutorial Fitting With Convolution 001.png

Die Quelldaten umfassen Abtastpunkte, Ausgabesignal und Peakantwort. Dieser Versuch geht davon aus, dass das Ausgabesignal die Faltung einer exponentiellen Zerfallsfunktion mit einer Gauss-Antwort ist:

Tutorial Fitting With Convolution 002.png

Jetzt, da wir bereits das Ausgabesignal und die Antwortdaten haben, können wir die exponentielle Zerfallsfunktion ermitteln, indem wir das Signal an das unten stehende Modell anpassen:

y = y_0 + \int_{-\infty}^{+\infty} Ae^{-tx} \otimes Response, dx

Die Funktion definieren

Offensichtlich entsprechen Spalte 1 und Spalte 2 x bzw. y in der Funktion. Was ist mit Spalte 3, der Peakantwort? Wir greifen auf diese Spalte innerhalb der Anpassungsfunktion zu und berechnen die theoretische exponentielle Kurve aus den Abtastpunkten. Dann können wir die schnelle Fourier-Transformation verwenden, um die Faltung durchzuführen.

Drücken Sie F9, um den Dialog Fitfunktionen verwalten zu öffnen und eine Funktion zu definieren:

 

 

Funktionsname: FitConv
Funktionstyp: Benutzerdefiniert
Unabhängige Variable: x
Abhängige Variable: y
Parameternamen: y0, A, t
Funktionsform: Origin C
Funktion:

 

Klicken Sie auf die Schaltfläche (Symbol) neben dem Feld Funktion und schreiben Sie den Funktionskörper in den Code Builder:

#pragma warning(error : 15618)
#include <origin.h>
// Header files need to be included
#include <ONLSF.H>
#include <fft_utils.h>
//
// 
void _nlsfTestConv(
// Fit Parameter(s):
double y0, double A, double t,
// Independent Variable(s):
double x,
// Dependent Variable(s):
double& y)
{
	// Beginning of editable part	
	NLFitContext *pCtxt = Project.GetNLFitContext();
        Worksheet wks;
        DataRange dr;
        int c1,c2;
        dr = pCtxt->GetSourceDataRange(); //Get the source data range
        dr.GetRange(wks, c1, c2);  //Get the source data worksheet
	if ( pCtxt )
	{	
		// Vector for the output signal in each iteration.
		static vector vSignal;
		// If parameters were updated, we will recalculate the convolution result.
		BOOL bIsNewParamValues = pCtxt->IsNewParamValues();
		if ( bIsNewParamValues )
		{
			// Read sampling and response data from worksheet.
			Dataset dsSampling(wks, 0);
			Dataset dsResponse(wks, 2);
			int iSize = dsSampling.GetSize();
 
			vector vResponse, vSample;
 
			vResponse = dsResponse;
			vSample = dsSampling;
 
			vSignal.SetSize(iSize);
			vResponse.SetSize(iSize);
			vSample.SetSize(iSize);
 
			// Compute the exponential decay curve
			vSignal = A * exp( -t*vSample );
			// Perform convolution
			int iRet = fft_fft_convolution(iSize, vSignal, vResponse);
                        //Correct the convolution by multiplying the sampling interval
                        vSignal = (vSample[1]-vSample[0])*vSignal;
 
 
		}
 
		NLSFCURRINFO    stCurrInfo;
		pCtxt->GetFitCurrInfo(&stCurrInfo);
		// Get the data index for the iteration
		int nCurrentIndex = stCurrInfo.nCurrDataIndex;
		// Get the evaluated y value
		y = vSignal[nCurrentIndex] + y0;
		// For compile the function, since we haven't use x here.
		x;
	}
	// End of editable part
}

Üblicherweise gibt die Funktion für ein bestimmtes X den entsprechenden Y-Wert aus. Wenn die Faltung jedoch mit eingebunden wird, muss der Vorgang für die gesamte Kurve durchgeführt werden, nicht nur für einen bestimmten Datenpunkt. Ab Origin 8 SR2 wurde die Klasse NLFitContext eingeführt, mit der einige Schlüsselinformationen innerhalb des Fitters ermittelt werden. In jeder Iteration wird NLFitContext verwendet, um die angepassten Parameter zu beobachten; sobald sie aktualisiert sind, wird die Faltung mit Hilfe der schnellen Fourier-Transformation nach der Methode fft_fft_convolution berechnet. Die Ergebnisse werden im Vektor vSignal vector gespeichert. Dann erhalten wir für jedes X das ausgewertete Y aus vSignal mit dem aktuellen Datenindex in NLSFCURRINFO.

Kurve anpassen

Im Anpassungsfunktionskörper werden die Antwortdaten direkt aus dem aktiven Arbeitsblatt gelesen. Daher sollte die Anpassung aus dem Arbeitsblatt erfolgen.

  1. Markieren Sie die Spalte B und drücken Sie Strg + Y, um das Dialogfeld der Nichtlinearen Anpassung aufzurufen.
  2. Wählen Sie für X-Datentyp auf der Seite Angepasste Kurven die Option Das Gleiche wie die Eingabedaten.
  3. Gehen Sie zurück zur Seite Funktionsauswahl, um die Funktion FitConv auszuwählen, die Sie gerade definiert haben.
  4. Wechseln Sie zur Registerkarte Parameter, um die Parameter al y0=0, A=10, t=1 zu initialisieren.
  5. Klicken Sie auf die Schaltfläche Fit, um die Ergebnisse zu erzeugen.

Wenn Sie eine Anpassungsfunktion verwenden, die der Funktion in diesem Tutorial ähnlich ist, beachten Sie bitte, wenn Sie die Nichtlineare Anpassung in Origin im Dialog NLFit ausführen, dass Sie für den X-Datentyp auf der Seite Angepasste Kurven die Option Das Gleiche wie die Eingabedaten wählen.