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

Copy data from circular buffer.

Pascal
procedure ReadFromCircularBuffer(Buffer: TVec; Dst: TVec; var State: TCircularBufferState; ForwardStep: Integer = -1); overload;

Copies Dst.Length samples from Buffer to Dst. If there is not Dst.Length samples available, the BufferUnderflow flag will be set in the State variable. The routine advances ReadPosition of the buffer to the position where the next data is to be read from. ForwardStep defines the number of samples to advance the read cursor. If the ForwardStep is -1, the read cursor is advanced Dst.Length samples.

Circular buffer test. 

 

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

  procedure TForm1.Button1Click(Sender: TObject);
  var h1,h,c,b: Vector;
      i,n: integer;
      State: TCircularBufferState;
  begin
      h1 := Ramp(30, mvDouble, 0,1);

      c.Size(h1);
      c.SetZero;

      h.Size(h1);
      h.SetZero;

      n := 6;
      InitCircularBuffer(11,2,State);
      for i := 0 to (h1.Length div n) - 1 do
      begin
           h1.SetSubRange(i*n,n);
           h.SetSubRange(i*n,n);
           c.SetSubRange(i*n,n);
           WriteToCircularBuffer(b,h1,State);
           n := PeekCircularBuffer(State);
           MonitorCircularBuffer(b,h,State);
           ReadFromCircularBuffer(b,c,State);
      end;
      h1.SetFullRange;
      h.SetFullRange;
      c.SetFullRange;
      DrawIt([h1,h,c],['Original','Monitored','Read']);
      //must be all equal, if right
  end;

 

  #include "MtxExpr.hpp"
  #include "MtxVecEdit.hpp"
  #include "MtxVecTee.hpp"
  #include "SignalUtils.hpp"

  void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  {
    sVector h1,h,c,b;
    int n,i,k;
    TCircularBufferState State;

    h1 = Ramp(30, mvDouble, 0,1);

    c.Size(h1);
    c.SetZero();

    h.Size(h1);
    h.SetZero();

    n = 6;
    InitCircularBuffer(11,2,State);
    k = h1.Length/n;
    for (i = 0; i < k; i++)  //must use k here, otherwise h1.Length is evaluated for every iteration
    {
       h1.SetSubRange(i*n,n);
       h.SetSubRange(i*n,n);
       c.SetSubRange(i*n,n);
       WriteToCircularBuffer(b,h1,State);
       PeekCircularBuffer(State);
       MonitorCircularBuffer(b,h,State);
       ReadFromCircularBuffer(b,c,State);
    }
    h1.SetFullRange();
    h.SetFullRange();
    c.SetFullRange();
    DrawIt(OPENARRAY(TVec*,(h1,h,c)),OPENARRAY(AnsiString,("Original","Monitored","Read")));
    //must be all equal, if right
  }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
What do you think about this topic? Send feedback!