diff --git a/src/streamchannel.cpp b/src/streamchannel.cpp
--- a/src/streamchannel.cpp
+++ b/src/streamchannel.cpp
@@ -17,9 +17,10 @@
   along with serialplot.  If not, see .
 */
 
+#include 
 #include "streamchannel.h"
 
-StreamChannel::StreamChannel(unsigned i, const FrameBuffer* x,
+StreamChannel::StreamChannel(unsigned i, const XFrameBuffer* x,
               FrameBuffer* y, ChannelInfoModel* info)
 {
     _index = i;
@@ -37,8 +38,37 @@ unsigned StreamChannel::index() const {r
 QString StreamChannel::name() const {return _info->name(_index);};
 QColor StreamChannel::color() const {return _info->color(_index);};
 bool StreamChannel::visible() const {return _info->isVisible(_index);};
-const FrameBuffer* StreamChannel::xData() const {return _x;}
+const XFrameBuffer* StreamChannel::xData() const {return _x;}
 const FrameBuffer* StreamChannel::yData() const {return _y;}
 FrameBuffer* StreamChannel::yData() {return _y;}
 const ChannelInfoModel* StreamChannel::info() const {return _info;}
-void StreamChannel::setX(const FrameBuffer* x) {_x = x;};
+void StreamChannel::setX(const XFrameBuffer* x) {_x = x;};
+
+double StreamChannel::findValue(double x) const
+{
+    int index = _x->findIndex(x);
+    Q_ASSERT(index < (int) _x->size());
+
+    if (index >= 0)
+    {
+        // can't do estimation for last sample
+        if (index == (int) _x->size() - 1)
+        {
+            return _y->sample(index);
+        }
+        else
+        {
+            // calculate middle of the line
+            double prev_x = _x->sample(index);
+            double next_x = _x->sample(index+1);
+            double ratio = (x - prev_x) / (next_x - prev_x);
+            double prev_y = _y->sample(index);
+            double next_y = _y->sample(index+1);
+            return ratio * (next_y - prev_y) + prev_y;
+        }
+    }
+    else
+    {
+        return std::numeric_limits::quiet_NaN();
+    }
+}