As you know, B-splines smooth, run between the data points.
If you want to interpolate, go through the data points exactly,
using a B-spline function, here's how.
In: data points $f_i$ at the integers $i = 0\ 1\ 2 \dots n$
$\ \ \ \ \ $ a cubic B-spline function $B( x; data_i )$ for $0 \leq x \leq n$
Out: a wrapper function $I( x; data_i )$ that interpolates, $I(i) = f_i$ .
Method:
we know that $B(i) = (f_{i-1} + 4 f_i + f_{i+1}) \,/\, 6, i = 0\ 1\ 2 \dots$
or in matrix form,
$\ b = A f$ with $A$ tridiagonal.
Solve $\ A y = f$
then $\ \ B(y) = B( A^{-1} f ) = f$
i.e. $\ \ \ \ \, I( x; f_i ) \equiv B( x; A^{-1} f )$ interpolates.
Notes:
Solving this tridiagonal system is fast and easy.
(You need boundary conditions such as $f_{-1} = f_0$ or $f_{-1} = 0$ ,
and similarly for $f_{n+1}$.)
A function like $(B + 2 I)\, /\, 3$ is between $B()$ and $I()$:
it smooths less than $B$, but is not as sensitive to noise as $I$ .
This particular blend is called an M-N filter, after
Mitchell and Netravali,
Reconstruction Filters in Computer Graphics,
1988, 8p.
M-N splines also have less overshoot than Interpolating splines; see
what-is-the-maximum-overshoot-of-interpolating-splines-in-d-dimensions.
A fancier way of using B-splines to interpolate, using IIR filters, is given in
M. Unser,
Splines: A perfect fit for signal and image processing ,
1999, 17p .
What you need is something called "Boehm's algorithm" (after its originator, Wolfgang Boehm). It has a simple geometric interpretation, and drawing a few pictures should make it clear. There is a pretty good explanation (with pictures) in this document.
The algorithm is based on a process called "knot insertion". You keep inserting knots into the b-spline curve until each knot has multiplicity 3. Then, the b-spline control points of this refined curve give you the Bezier control points of its segments.
So, if you're writing code to do this, one approach is to write a knot insertion function first, and then call it repeatedly.
There is knot insertion code here.
Best Answer
See this question.
The answers include several useful links.
One of the links provides a very detailed explanation, plus C++ code for biarc approximation.