Free-knot spline approximation (BSFK) problem
    7 views (last 30 days)
  
       Show older comments
    
@BrunoLuong 
My data acquisition system produce periodically 1-D measured noised data with the fixed time window length W. I want to produce smoothed data for each window W separately, with specific constraints on continuous (k=2) or smooth (k = 3 or 4) processed signal connections between consecutive time measurement windows. So, for each window W I get finally separate "pp" structure. How to set proper BSFK options setting to fulfil these constraints?
The second question is: Is there any method how to merge separate "pp" structures to one "pp" structure for several processing windows at one? 
Add note: May by some processing windows overlap could be required. Do you have any experiance with using BSFK in streaming regime?     
13 Comments
  Bruno Luong
      
      
 on 23 Sep 2022
				
      Edited: Bruno Luong
      
      
 on 23 Sep 2022
  
			You could try to recursively enforce the continuity for function/derivative when you call  BSFK on the next interval using the pp of the previous interval, just tell BSFK to have function/derivative of the most left knot (current) = previous pp function/derivative at the right knot (previous).
Accepted Answer
  Bruno Luong
      
      
 on 23 Sep 2022
        
      Edited: Bruno Luong
      
      
 on 12 Jan 2023
  
      Reference to BSFK function https://fr.mathworks.com/matlabcentral/fileexchange/25872-free-knot-spline-approximation
Here is the recursive pointwise constraint. You'll see it does the job (zoom in) the transition is not nice
data=load('result_4_8.mat')
data=data.result;
[m,n] = size(data);
x = cellfun(@(data) data.x, data, 'unif', 0);
y = cellfun(@(data) data.y, data, 'unif', 0);
j = 1; % n
close all
figure
hold on
for i = 1:m
    % Normalize data so that dy/dx is comparable to y
    xij = x{i,j}/10000;
    yij = y{i,j}/10000;
    options = struct('lambda', 1e-8);
    if i >= 2
        xleft = pp.breaks(end);
        yleft = ppval(pp,xleft);
        ydleft = ppval(ppder(pp),xleft);
        xij = [xleft; xij];
        yij = [yleft; yij];
        pntcon = struct('p', {0 1}, 'x', {xleft,xleft}, 'v', {yleft ydleft});
        options.pntcon = pntcon;
    end
    pp =BSFK(xij, yij, 4, [], [], options);
    xi = linspace(min(xij),max(xij),1000);
    yi = ppval(pp, xi);
    plot(xij, yij,'c.');
    plot(xi, yi, 'r', 'Linewidth', 2);
    drawnow
end
function ppd = ppder(pp)
ppd = pp;
coefs = ppd.coefs;
n = size(coefs,2);
ppd.coefs = coefs(:,1:n-1).*(n-1:-1:1);
ppd.order = ppd.order-1;
end

5 Comments
  Bruno Luong
      
      
 on 29 Sep 2022
				I haven't not studied the complexity of BSFK. 
But it seems to me the linear dependency to number of knots is not quite true, I would say it is more like quadratic.
More Answers (0)
See Also
Categories
				Find more on Polynomials in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


