Ejemplo n.º 1
0
bool ViFourierInterpolator::interpolateFixedSplines(const qreal *leftSamples, const int &leftSize, const qreal *rightSamples, const int &rightSize, qreal *outputSamples, const int &outputSize, const qreal &scaling, ViError *error)
{
	if(validParameters(mMode, leftSize, rightSize, mDegree, mDerivatives))
	{
		ViEigenBaseVector *coefficients = (this->*estimateModelPointer)(mDegree, mDerivatives, leftSamples, leftSize, rightSamples, rightSize, outputSize, scaling);

		// Use the middel spline for prediction
		int outputOffset[outputSize];
		splineOffsetOutput(outputOffset, outputSize, (mDegree * 2) + 1, leftSize);
		(this->*interpolateModelPointer)(mDegree, coefficients, outputSamples, outputSize, leftSize, scaling, outputOffset);

		if(error != NULL)
		{
			qreal interpolationLeft[leftSize];
			qreal interpolationRight[rightSize];
			int rightStart = leftSize + outputSize;

			int leftOffsets[leftSize];
			int rightOffsets[rightSize];
			splineOffsetLeft(leftOffsets, leftSize, (mDegree * 2) + 1);
			splineOffsetRight(rightOffsets, rightSize, (mDegree * 2) + 1, leftSize + outputSize, outputSize);
			(this->*interpolateModelPointer)(mDegree, coefficients, interpolationLeft, leftSize, 0, scaling, leftOffsets);
			(this->*interpolateModelPointer)(mDegree, coefficients, interpolationRight, rightSize, rightStart, scaling, rightOffsets);

			error->add(interpolationLeft, leftSamples, leftSize);
			error->add(interpolationRight, rightSamples, rightSize);
		}
		mEigen->clear(coefficients);
		return true;
	}
	LOG("Invalid parameter combination detected.", QtCriticalMsg);
	return false;
}
Ejemplo n.º 2
0
bool ViFourierInterpolator::interpolateBestNormal(const qreal *leftSamples, const int &leftSize, const qreal *rightSamples, const int &rightSize, qreal *outputSamples, const int &outputSize, const qreal &scaling, ViError *error)
{
	static int i, rightStart, bestDegree;
	static qreal currentMse, bestMse;

	ViEigenBaseVector *bestCoefficients = NULL;

	qreal interpolationLeft[leftSize];
	qreal interpolationRight[rightSize];
	rightStart = leftSize + outputSize;
	bestMse = DBL_MAX;
	bestDegree = 1;

	for(i = 1; i <= mDegree; ++i)
	{
		if(validParameters(mMode, leftSize, rightSize, i, 0))
		{
			ViEigenBaseVector *currentCoefficients = (this->*estimateModelPointer)(i, 0, leftSamples, leftSize, rightSamples, rightSize, outputSize, scaling);
			(this->*interpolateModelPointer)(i, currentCoefficients, interpolationLeft, leftSize, 0, scaling, NULL);
			(this->*interpolateModelPointer)(i, currentCoefficients, interpolationRight, rightSize, rightStart, scaling, NULL);
			currentMse = ViError::calculateMse(interpolationLeft, leftSamples, leftSize, interpolationRight, rightSamples, rightSize);
			if(currentMse < bestMse)
			{
				mEigen->clear(bestCoefficients);
				bestDegree = i;
				bestMse = currentMse;
				bestCoefficients = currentCoefficients;
			}
			else
			{
				mEigen->clear(currentCoefficients);
				break;
			}
		}
	}
	if(bestMse == DBL_MAX) return false;

	if(error != NULL)
	{
		(this->*interpolateModelPointer)(bestDegree, bestCoefficients, interpolationLeft, leftSize, 0, scaling, NULL);
		(this->*interpolateModelPointer)(bestDegree, bestCoefficients, interpolationRight, rightSize, rightStart, scaling, NULL);
		error->add(interpolationLeft, leftSamples, leftSize);
		error->add(interpolationRight, rightSamples, rightSize);
	}

	(this->*interpolateModelPointer)(bestDegree, bestCoefficients, outputSamples, outputSize, leftSize, scaling, NULL);
	mEigen->clear(bestCoefficients);

	return true;
}
Ejemplo n.º 3
0
bool ViFourierInterpolator::interpolateFixed(const qreal *leftSamples, const int &leftSize, const qreal *rightSamples, const int &rightSize, qreal *outputSamples, const int &outputSize, const qreal &scaling, ViError *error)
{
	if(validParameters(mMode, leftSize, rightSize, mDegree, mDerivatives))
	{
		ViEigenBaseVector *coefficients = (this->*estimateModelPointer)(mDegree, mDerivatives, leftSamples, leftSize, rightSamples, rightSize, outputSize, scaling);
		(this->*interpolateModelPointer)(mDegree, coefficients, outputSamples, outputSize, leftSize, scaling, NULL);
		if(error != NULL)
		{
			qreal interpolationLeft[leftSize];
			qreal interpolationRight[rightSize];
			int rightStart = leftSize + outputSize;
			(this->*interpolateModelPointer)(mDegree, coefficients, interpolationLeft, leftSize, 0, scaling, NULL);
			(this->*interpolateModelPointer)(mDegree, coefficients, interpolationRight, rightSize, rightStart, scaling, NULL);
			error->add(interpolationLeft, leftSamples, leftSize);
			error->add(interpolationRight, rightSamples, rightSize);
		}
		mEigen->clear(coefficients);
		return true;
	}
	LOG("Invalid parameter combination detected.", QtCriticalMsg);
	return false;
}
Ejemplo n.º 4
0
bool ViLagrangeInterpolator::validParameters(const int &leftSize, const int &rightSize)
{
	return validParameters(leftSize + rightSize);
}
Ejemplo n.º 5
0
bool ViLagrangeInterpolator::validParameters()
{
	return validParameters(mWindowSize);
}
Ejemplo n.º 6
0
bool ViFourierInterpolator::validParameters()
{
	if(mEstimation == Best) return true;
	return validParameters(mMode, mWindowSize, mDegree, mDerivatives);
}
Ejemplo n.º 7
0
bool ViFourierInterpolator::interpolateBestSplines(const qreal *leftSamples, const int &leftSize, const qreal *rightSamples, const int &rightSize, qreal *outputSamples, const int &outputSize, const qreal &scaling, ViError *error)
{
	static int i, j, rightStart, bestDegree;
	static qreal currentMse, bestMse;
	static bool wasBad, wasBadAgain;

	ViEigenBaseVector *bestCoefficients = NULL;

	qreal interpolationLeft[leftSize];
	qreal interpolationRight[rightSize];

	rightStart = leftSize + outputSize;
	bestMse = DBL_MAX;
	bestDegree = 1;
	wasBad = false;
	wasBadAgain = false;

	int leftOffsets[leftSize];
	int rightOffsets[rightSize];

	for(i = 1; i <= mDegree; ++i)
	{
		for(j = 1; j <= mDerivatives; ++j)
		{
			if(validParameters(mMode, leftSize, rightSize, i, j))
			{
				ViEigenBaseVector *currentCoefficients = (this->*estimateModelPointer)(i, j, leftSamples, leftSize, rightSamples, rightSize, outputSize, scaling);

				splineOffsetLeft(leftOffsets, leftSize, (i * 2) + 1);
				splineOffsetRight(rightOffsets, rightSize, (i * 2) + 1, leftSize + outputSize, outputSize);
				(this->*interpolateModelPointer)(i, currentCoefficients, interpolationLeft, leftSize, 0, scaling, leftOffsets);
				(this->*interpolateModelPointer)(i, currentCoefficients, interpolationRight, rightSize, rightStart, scaling, rightOffsets);

				currentMse = ViError::calculateMse(interpolationLeft, leftSamples, leftSize, interpolationRight, rightSamples, rightSize);
				if(currentMse < bestMse)
				{
					mEigen->clear(bestCoefficients);
					bestDegree = i;
					bestMse = currentMse;
					bestCoefficients = currentCoefficients;
					wasBad = false;
				}
				else
				{
					mEigen->clear(currentCoefficients);
					if(wasBad) wasBadAgain = true;
					else wasBad = true;
					break;
				}
			}
		}
		if(wasBadAgain) break;
	}
	if(bestMse == DBL_MAX) return false;

	if(error != NULL)
	{
		splineOffsetLeft(leftOffsets, leftSize, (bestDegree * 2) + 1);
		splineOffsetRight(rightOffsets, rightSize, (bestDegree * 2) + 1, leftSize + outputSize, outputSize);
		(this->*interpolateModelPointer)(bestDegree, bestCoefficients, interpolationLeft, leftSize, 0, scaling, leftOffsets);
		(this->*interpolateModelPointer)(bestDegree, bestCoefficients, interpolationRight, rightSize, rightStart, scaling, rightOffsets);
		error->add(interpolationLeft, leftSamples, leftSize);
		error->add(interpolationRight, rightSamples, rightSize);
	}

	int outputOffset[outputSize];
	splineOffsetOutput(outputOffset, outputSize, (bestDegree * 2) + 1, leftSize);
	(this->*interpolateModelPointer)(bestDegree, bestCoefficients, outputSamples, outputSize, leftSize, scaling, outputOffset);
	mEigen->clear(bestCoefficients);

	return true;
}
Ejemplo n.º 8
0
bool ViFourierInterpolator::validParameters(const Mode &mode, const int &leftSize, const int &rightSize, const int &degree, const int &derivatives)
{
	if((mode == Osculating || mode == Osculating) && (leftSize == 0 || rightSize == 0)) return false;
	return validParameters(mode, leftSize + rightSize, degree, derivatives);
}
Ejemplo n.º 9
0
 // updateParameters
 bool functor::updateParameters() {
   // return true only if the parameters are valid
   return validParameters();
 }