control loop library IIR filter

2025-07-29
2025-08-01
  • davemansell - 2025-07-29

    Hi there i am experimenting with the IIR filter from the control loop library but have been unable to get it to function no matter what inputs I set I get errorID of wrong_configuration (3). Does someone have a working example that they can share.
    Best regards
    Dave

     

    Last edit: davemansell 2025-07-29
  • TimvH

    TimvH - 2025-08-01

    In the Control Loop Library package are multiple example projects, including one for the filters.

    Program containing:

    GVL.filterIIR(
        xEnable:= GVL.xEnableFilter, 
        lrValue:= GVL.lrYOriginal,  
        lrFilteredValue=> GVL.lrOutputIIR);
    
    GVL.filterFIR(
        xEnable:= GVL.xEnableFilter, 
        lrValue:= GVL.lrYOriginal,   
        lrFilteredValue=> GVL.lrOutputFIR);
    
    GVL.filterSOS(
        xEnable:= GVL.xEnableFilter, 
        lrValue:= GVL.lrYOriginal,  
        lrFilteredValue=> GVL.lrOutputSOS);
    

    GVL containing

        aCoefficientsA_IIR : ARRAY[0.. 4] OF LREAL := [1,-2.3695130071820376,2.31398841441588,-1.0546654058785676,0.18737949236818494];
        aCoefficientsB_IIR : ARRAY[0.. 4] OF LREAL := [0.0048243433577162282,0.019297373430864913,0.028946060146297369,0.019297373430864913,0.0048243433577162282];
        filterIIR : Ctrl.Filter_IIR := (palrCoefficientsA:= ADR(GVL.aCoefficientsA_IIR), udiSizeCoefficientsA:= SIZEOF(GVL.aCoefficientsA_IIR), palrCoefficientsB:= ADR(GVL.aCoefficientsB_IIR), udiSizeCoefficientsB:= SIZEOF(GVL.aCoefficientsB_IIR));
    
        aCoefficientsB_FIR : ARRAY[0.. 5] OF LREAL := [0.01982722552692669,0.1325131219866022,0.34765965248647102,0.34765965248647107,0.13251312198660226,0.019827225526926694];
        filterFIR : Ctrl.Filter_FIR := (palrCoefficientsB:= ADR(GVL.aCoefficientsB_FIR), udiSizeCoefficientsB:= SIZEOF(GVL.aCoefficientsB_FIR));
    
        aCoefficientMatrix_SOS : ARRAY[0.. 1] OF Ctrl.FilterCoefficients_SOS := 
                               [(b0:= 1, b1:= 2, b2:= 1, a0:= 1, a1:= -1.048599576362609, a2:= 0.2961403575616683), 
                                (b0:= 1, b1:= 2, b2:= 1, a0:= 1, a1:= -1.320913430819428, a2:= 0.6327387928852787)];    
        lrG : LREAL := 0.004824343357716228;
        filterSOS : Ctrl.Filter_SOS := (paCoefficientMatrix:= ADR(GVL.aCoefficientMatrix_SOS), udiSizeCoefficientMatrix:= SIZEOF(GVL.aCoefficientMatrix_SOS), lrGain:= GVL.lrG);
    
        lrX : LREAL;
        lrYOriginal : LREAL;
        lrOutputFIR : LREAL;
        lrOutputIIR : LREAL;
        lrOutputSOS : LREAL;
    
        xEnableFilter : BOOL := TRUE;
    
     

Log in to post a comment.