diff --git a/drt.cpp b/drt.cpp
index 46f6c465c005d5420a5b2f71218528a828405775..456458c4fee2fd29cd96bd044c58ffd10e0c52c2 100644
--- a/drt.cpp
+++ b/drt.cpp
@@ -219,13 +219,25 @@ template Eigen::VectorX<float> calcDrt<float>(Eigen::VectorX<std::complex<float>
 	Eigen::VectorX<float>&, FitMetics& fm, const FitParameters& fp, float* rSeries);
 
 template<typename fv>
-fv testFn()
+Eigen::VectorX<std::complex<fv>> calcImpedance(const Eigen::VectorX<fv>& drt, fv rSeries, Eigen::VectorX<fv>& omegaVector)
 {
-	fv value = 0.001;
-	return value;
+	Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> aMatrixImag = aImag<fv>(omegaVector);
+	Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> aMatrixReal = aReal<fv>(omegaVector);
+
+	Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> realMul = aMatrixReal*drt;
+	Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> imagMul = aMatrixImag*drt;
+	Eigen::Matrix<std::complex<fv>, Eigen::Dynamic, Eigen::Dynamic> realMulCplx = realMul.template cast<std::complex<fv>>();
+	Eigen::Matrix<std::complex<fv>, Eigen::Dynamic, Eigen::Dynamic> imagMulCplx = imagMul.template cast<std::complex<fv>>()*std::complex<fv>(0,1);
+
+	Eigen::VectorX<std::complex<fv>> z = ((realMulCplx + imagMulCplx).array() + std::complex<fv>(rSeries,0)).matrix();
+	return z;
 }
 
-template double testFn<double>();
+template Eigen::VectorX<std::complex<double>> calcImpedance<double>(const Eigen::VectorX<double>& drt, double rSeries,
+	Eigen::VectorX<double>& omegaVector);
+template Eigen::VectorX<std::complex<float>> calcImpedance<float>(const Eigen::VectorX<float>& drt, float rSeries,
+	Eigen::VectorX<float>& omegaVector);
+
 
 #ifdef USE_EISGEN
 std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector,
@@ -247,5 +259,19 @@ std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics&
 	std::vector<fvalue> stdvector(drt.data(), drt.data()+drt.size());
 	return stdvector;
 }
+
+std::vector<eis::DataPoint> calcImpedance(const std::vector<fvalue>& drt, fvalue rSeries, const std::vector<fvalue>& omegaVector)
+{
+	Eigen::VectorX<fvalue> omega = Eigen::VectorX<fvalue>::Map(omegaVector.data(), omegaVector.size());
+
+	Eigen::VectorX<fvalue> drtVec = Eigen::VectorX<fvalue>::Map(drt.data(), drt.size());
+	Eigen::VectorX<std::complex<fvalue>> spectra = calcImpedance<fvalue>(drtVec, rSeries, omega);
+	return eigentoeis(spectra, &omega);
+}
+
+std::vector<eis::DataPoint> calcImpedance(const std::vector<fvalue>& drt, fvalue rSeries, const eis::Range& omegaRange)
+{
+	return calcImpedance(drt, rSeries, omegaRange.getRangeVector());
+}
 #endif
 
diff --git a/eisdrt/eigendrt.h b/eisdrt/eigendrt.h
index 7cc3338f526f2711089b3aeb87b6952cd8f24fbc..7b4a50a11fc502fdb3e36c42974b3a7ae267f656 100644
--- a/eisdrt/eigendrt.h
+++ b/eisdrt/eigendrt.h
@@ -40,11 +40,23 @@ Api for use with Eigen applications
  * @param rSeries an optional paramter where the seires resistance is stored
  * @return a vector with the drt values
  */
-
 template<typename fv>
 Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, Eigen::VectorX<fv>& omegaTensor,
 	FitMetics& fm, const FitParameters& fp, fv* rSeries = nullptr);
 
+
+/**
+ * @brief calculate impedance from drt using eigen datatypes
+ *
+ * @tparam fv precision to be used, either double or float
+ * @param drt the drt to caluclate impedance from
+ * @param omegaVector vector with the omega values that the impedances where mesured at
+ * @param rSeries an optional paramter where the seires resistance is stored
+ * @return a vector with the drt values
+ */
+template<typename fv>
+Eigen::VectorX<std::complex<fv>> calcImpedance(const Eigen::VectorX<fv>& drt, fv rSeries, const  Eigen::VectorX<fv>& omegaVector);
+
 /**
 ....
 * @}
diff --git a/eisdrt/eisdrt.h b/eisdrt/eisdrt.h
index 9052df665ac61f4e7d6ebdff3e2331e424eadaed..b45db5bff1c23f457479315f1a8b084c2fd5cc21 100644
--- a/eisdrt/eisdrt.h
+++ b/eisdrt/eisdrt.h
@@ -53,6 +53,26 @@ std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::
  */
 std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics& fm, const FitParameters& fp, fvalue* rSeries = nullptr);
 
+/**
+ * @brief calculate impedance from drt using eisgenerator datatypes
+ *
+ * @param drt the drt to caluclate impedance from
+ * @param omegaVector vector with the omega values that the impedances where mesured at
+ * @param rSeries an optional paramter where the seires resistance is stored
+ * @return a vector with the impedance values
+ */
+std::vector<eis::DataPoint> calcImpedance(const std::vector<fvalue>& drt, fvalue rSeries, const std::vector<fvalue>& omegaVector);
+
+/**
+ * @brief calculate impedance from drt using eisgenerator datatypes
+ *
+ * @param drt the drt to caluclate impedance from
+ * @param omegaRange range that describes the omega values the drt was taken at
+ * @param rSeries an optional paramter where the seires resistance is stored
+ * @return a vector with the impedance values
+ */
+std::vector<eis::DataPoint> calcImpedance(const std::vector<fvalue>& drt, fvalue rSeries, const eis::Range& omegaRange);
+
 /**
 ....
 * @}
diff --git a/eisdrt/eistorchdrt.h b/eisdrt/eistorchdrt.h
index 4f5b9f39e4850ce590bdbe4481a75afca232f7ca..eb8e9b552f71140e6cd37c320302cff26dcc03f6 100644
--- a/eisdrt/eistorchdrt.h
+++ b/eisdrt/eistorchdrt.h
@@ -32,6 +32,8 @@ torch::Tensor calcDrtTorch(const std::vector<eis::DataPoint>& data, const std::v
 
 torch::Tensor calcDrtTorch(const std::vector<eis::DataPoint>& data, FitMetics& fm,  const FitParameters& fp);
 
+torch::Tensor calcImpedance(torch::Tensor& drt, fvalue rSeries, const std::vector<fvalue>& omegaVector);
+
 /**
 ....
 * @}
diff --git a/eisdrt/torchdrt.h b/eisdrt/torchdrt.h
index 6cbbd3f7456977958705e80dbdba4aee13b3339d..3888f38dfffcf84272eb561351476602660986cf 100644
--- a/eisdrt/torchdrt.h
+++ b/eisdrt/torchdrt.h
@@ -41,6 +41,15 @@ Api for use with libtorch applications
 template<typename fv>
 torch::Tensor calcDrtTorch(torch::Tensor& impedanceSpectra, torch::Tensor& omegaTensor, FitMetics& fm, const FitParameters& fp);
 
+/**
+ * @brief calculates impedance from drt
+ *
+ * @tparam fv precision to be used, either double or float
+ * @param drt the drt to calcualte impedance from
+ * @return a complex tensor with the impedance spectra
+ */
+template<typename fv>
+torch::Tensor calcImpedance(torch::Tensor& drt, fv rSeries, torch::Tensor& omegaVector);
 
 /**
 ....
diff --git a/eistoeigen.h b/eistoeigen.h
index df351474fddbbc198c0c2d1407e7efe4bb624077..1aca508385dcda716f0b64e6ca96c403a545d222 100644
--- a/eistoeigen.h
+++ b/eistoeigen.h
@@ -21,6 +21,7 @@
 
 #pragma once
 
+#include "Eigen/src/Core/Matrix.h"
 #include <Eigen/Core>
 #include <eisgenerator/eistype.h>
 #include <vector>
@@ -40,3 +41,19 @@ Eigen::VectorX<std::complex<fvalue>> eistoeigen(const std::vector<eis::DataPoint
 	}
 	return out;
 }
+
+std::vector<eis::DataPoint> eigentoeis(const Eigen::VectorX<std::complex<fvalue>>& data, const Eigen::Vector<fvalue, Eigen::Dynamic>* omega = nullptr)
+{
+	assert(!omega || omega->size() == data.size());
+	std::vector<eis::DataPoint> out(data.size());
+
+	for(ssize_t i = 0 ; i < data.size(); ++i)
+	{
+		out[i].im = data[i];
+		if(omega)
+			out[i].omega = (*omega)[i];
+		else
+			out[i].omega = -1;
+	}
+	return out;
+}
diff --git a/main.cpp b/main.cpp
index 63cecf8996711670ffccf4620920ceda78c6e772..3c0469ceae84dfa1ee53df3ca4ea62f48445a1ed 100644
--- a/main.cpp
+++ b/main.cpp
@@ -64,7 +64,7 @@ int main(int argc, char** argv)
 
 	// specify the angular frequency range of the spectra to be
 	// simulated to be 1-1*10^6 Hz with 3 steps and log10 distrobution
-	eis::Range omega(1, 1e6, 3, true);
+	eis::Range omega(1, 1e6, 10, true);
 
 	// specify circut to be simulated
 	eis::Model model("r{10}-r{50}p{0.02, 0.8}");
@@ -84,11 +84,17 @@ int main(int argc, char** argv)
 
 	assert(x.size() == data.size());
 
+	std::vector<eis::DataPoint> recalculatedSpectra = calcImpedance(x, rSeries, omega);
+	fvalue dist = eisNyquistDistance(data, recalculatedSpectra);
+
 	// print some info on the drt
 	std::cout<<"Iterations: "<<fm.iterations<<'\n';
 	std::cout<<"fx "<<fm.fx<<"\ndrt: ";
 	printFvalueVector(x);
 	std::cout<<"r series: "<<rSeries<<'\n';
+	std::cout<<"dist: "<<dist<<'\n';
+	std::cout<<"recalculatedSpectra:\n";
+	printImpedance(recalculatedSpectra);
 
-	return 0;
+	return dist < 2 ? 0 : 1;
 }