Anpassen mit Faltung
Fitting-Convolution
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.
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:
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:
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.
- Markieren Sie die Spalte B und drücken Sie Strg + Y, um
das Dialogfeld der Nichtlinearen Anpassung aufzurufen.
- Wählen Sie für X-Datentyp auf der Seite Angepasste Kurven
die Option Das Gleiche wie die Eingabedaten.
- Gehen Sie zurück zur Seite Funktionsauswahl, um die Funktion FitConv
auszuwählen, die Sie gerade definiert haben.
- Wechseln Sie zur Registerkarte Parameter, um die Parameter al y0=0,
A=10, t=1 zu initialisieren.
- 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.
|