diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8e4699ffce900c41ef6ea05dc47163a1a61ffcba..11a4862b21dd9852d24732d18f3b267c8a31581f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -392,6 +392,7 @@ set(hpp_for_lib
     ${PROJECT_SOURCE_DIR}/cpp/omputils.hpp
     ${PROJECT_SOURCE_DIR}/cpp/shared_array.hpp
     ${PROJECT_SOURCE_DIR}/cpp/spline.hpp
+    ${PROJECT_SOURCE_DIR}/cpp/spectrum_function.hpp
     ${PROJECT_SOURCE_DIR}/cpp/full_code/ornstein_uhlenbeck_process.hpp
     ${PROJECT_SOURCE_DIR}/cpp/full_code/ou_vorticity_equation.hpp
     )
diff --git a/cpp/spectrum_function.hpp b/cpp/spectrum_function.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ae33f860ad738b270b014d8821ccdf8544de1265
--- /dev/null
+++ b/cpp/spectrum_function.hpp
@@ -0,0 +1,32 @@
+#include<cmath>
+#include<vector>
+
+#include "kspace.hpp"
+
+template <field_backend be,
+          kspace_dealias type dt>
+class spectrum_function
+{
+    private:
+        const kspace<be, dt> *kk;
+        const std::vector<double> values;
+
+    public:
+        spectrum_function(
+                const kspace<be, dt> *KK,
+                const std::vector &source_values):
+            kk(KK),
+            values(source_values)
+        {
+            assert(this->values.size() == this->kk->nshells);
+        }
+        ~spectrum_function(){}
+
+        double operator()(double kvalue)
+        {
+            assert(kvalue >= double(0));
+            int index = floor(kvalue / this->kk->dk);
+            assert(index < this->values.size());
+            return this->values[index];
+        }
+}