How to resolve the algorithm Apply a digital filter (direct form II transposed) step by step in the Lua programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Apply a digital filter (direct form II transposed) step by step in the Lua programming language

Table of Contents

Problem Statement

Digital filters are used to apply a mathematical operation to a sampled signal. One of the common formulations is the "direct form II transposed" which can represent both infinite impulse response (IIR) and finite impulse response (FIR) filters, as well as being more numerically stable than other forms. [1] Filter a signal using an order 3 low-pass Butterworth filter. The coefficients for the filter are a=[1.00000000, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17] and b = [0.16666667, 0.5, 0.5, 0.16666667] The signal that needs filtering is the following vector: [-0.917843918645, 0.141984778794, 1.20536903482, 0.190286794412, -0.662370894973, -1.00700480494, -0.404707073677 ,0.800482325044, 0.743500089861, 1.01090520172, 0.741527555207, 0.277841675195, 0.400833448236, -0.2085993586, -0.172842103641, -0.134316096293, 0.0259303398477, 0.490105989562, 0.549391221511, 0.9047198589] [Wikipedia on Butterworth filters]

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Apply a digital filter (direct form II transposed) step by step in the Lua programming language

Source code in the lua programming language

function filter(b,a,input)
    local out = {}
    for i=1,table.getn(input) do
        local tmp = 0
        local j = 0
        out[i] = 0

        for j=1,table.getn(b) do
            if i - j < 0 then
                --continue
            else
                tmp = tmp + b[j] * input[i - j + 1]
            end
        end

        for j=2,table.getn(a) do
            if i - j < 0 then
                --continue
            else
                tmp = tmp - a[j] * out[i - j + 1]
            end
        end

        tmp = tmp / a[1]
        out[i] = tmp
    end
    return out
end

function main()
    local sig = {
        -0.917843918645, 0.141984778794, 1.20536903482,  0.190286794412,-0.662370894973,
        -1.00700480494, -0.404707073677, 0.800482325044, 0.743500089861, 1.01090520172,
         0.741527555207, 0.277841675195, 0.400833448236,-0.2085993586,  -0.172842103641,
        -0.134316096293, 0.0259303398477,0.490105989562, 0.549391221511, 0.9047198589
    }

    --Constants for a Butterworth filter (order 3, low pass)
    local a = {1.00000000, -2.77555756e-16, 3.33333333e-01, -1.85037171e-17}
    local b = {0.16666667, 0.5, 0.5, 0.16666667}

    local result = filter(b,a,sig)
    for i=1,table.getn(result) do
        io.write(result[i] .. ", ")
    end
    print()

    return nil
end

main()


  

You may also check:How to resolve the algorithm CUSIP step by step in the Wren programming language
You may also check:How to resolve the algorithm MD5/Implementation step by step in the FreeBASIC programming language
You may also check:How to resolve the algorithm Arithmetic/Integer step by step in the Swift programming language
You may also check:How to resolve the algorithm Variable size/Get step by step in the Kotlin programming language
You may also check:How to resolve the algorithm Four bit adder step by step in the Kotlin programming language