You are here: Symbol Reference > SignalUtils Namespace > Functions > SignalUtils.Integrate Function
DSP Master VCL
ContentsIndex
PreviousUpNext
SignalUtils.Integrate Function

Integrate signal.

Pascal
procedure Integrate(const Src: TVec; const Dst: TVec; var State: TIntegrateState; Dt: double); overload;

Use Simpson's formula to integrate the Src and place the result in Dst. Src can be real or complex. dT defines the sampling period (dT = 1/FS). The State variable holds the initial conditions. 

 

                j
Dst[j]  = 1/6* Sum ( Src[i-2] + Src[i-1]*4 + Src[i])*dT)
               i=0

j = 0,1...n-1

 

The integrate routine does not preserve linear phase. An analytical solution for a linear phase integrator does not exists. In general there are two types of applications for integration:

  1. The signal has a more or less fixed mean value. (DC offset).

An example of such a signal is the signal comming from the accelerometer measuring vibrations. The numerical integration will work well on signals whose mean value is exactly zero (otherwise it will rise or fall in infinity). Because this is often not the case, the signal must be passed through a DC filter first. The DC filter can be IIR or FIR type. An alternative to numerical integration and the Integrate routine is a linear phase integration filter designed with the OptimalFir.RemezImpulse routine. Linear phase integrator also removes the DC offset.

  1. The signal does not have a mean value.

An example of such a signal is the signal comming from the accelerometer measuring the acceleration and deceleration of a driving car. In this case the Integrator routine can be used directly to obtain speed and/or distance from the acceleration data.

Single block and streaming application example: 

 

uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit;

procedure TForm1.Button1Click(Sender: TObject);
var b,c,h: Vector;
    n,i: integer;
    FS: double;
    State2: TIntegrateState;
    State: TDiffState;
begin
    h := Ramp(30, mvDouble, 0,1);
    b.Size(h);
    c.Size(h);
    FS := 1; //sampling frequency

//single block

    FillChar(State,sizeOf(State),0); //initial conditions to zero
    FillChar(State2,sizeOf(State2),0);
    Integrate(h, b, State2, 1/FS);
    Differentiate(b, c, State, 1/FS);
    Drawit(c);

//streaming

    FillChar(State,sizeOf(State),0);  //initial conditions to zero
    FillChar(State2,sizeOf(State2),0);
    n := h.Length div 10;
    for i := 0 to 10-1 do
    begin
        h.SetSubRange(i*n,n);
        b.SetSubRange(i*n,n);
        c.SetSubRange(i*n,n);
        Integrate(h,b, State2, 1/FS);

//            Should be:  b = [0 , 1 , 3, 6, 10, 15, 21,... ]
//            But becomes: b = [0, 0.1666, 1.1666, 3.166, 6.166, 10.166, 15.166, 21.166,... ]
//            because of Simpson

        Differentiate(b,c,State,1/FS);

//            Should be: c = [0,1,2,3,4,5,6....]
//            But becomes: c = [0, 0.08333, 0.5833, 1.5, 2.5, 3.5, 4.5....]

    end;
    c.SetFullRange;
    DrawIt(c);
end;

 

    #include "MtxExpr.hpp"
    #include "MtxVecEdit.hpp"
    #include "MtxVecTee.hpp"
    #include "SignalUtils.hpp"
    #include <string.h>

    void __fastcall TForm41::BitBtn1Click(TObject *Sender)
    {
      int n,i;
      double FS;
      TIntegrateState State2;
      TDiffState State;
      sVector b,c,h;

      h = Ramp(30,mvDouble,0,1);
      b.Size(h);
      c.Size(h);
      FS = 1; //sampling frequency

    //single block
      memset(&State,0,sizeof(State)); //initial conditions to zero
      memset(&State2,0,sizeof(State2));

      Integrate(h, b, State2, 1/FS);
      Differentiate(b, c, State, 1/FS);

      DrawIt(c);

    //streaming

      memset(&State,0,sizeof(State)); //initial conditions to zero
      memset(&State2,0,sizeof(State2));

        n = h.Length/10;
      for (i = 0; i < 10; i++)
      {
    //      h.SetSubRange(i*n,n);
    //      b.SetSubRange(i*n,n);
    //      c.SetSubRange(i*n,n);

        Integrate(h(i*n,i*n+n-1),b(i*n,i*n+n-1), State2, 1/FS);

    //            Should be:  b = [0 , 1 , 3, 6, 10, 15, 21,... ]
    //            But becomes: b = [0, 0.1666, 1.1666, 3.166, 6.166, 10.166, 15.166, 21.166,... ]
    //            because of Simpson

        Differentiate(b(i*n,i*n+n-1),c(i*n,i*n+n-1),State,1/FS);

    //            Should be: c = [0,1,2,3,4,5,6....]
    //            But becomes: c = [0, 0.08333, 0.5833, 1.5, 2.5, 3.5, 4.5....]

      }
      c.SetFullRange(); //subranges were passed by reference!!
      DrawIt(c);
    }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!