Filter data from different channels in real time

234 Views Asked by At

I'm trying to filter data in real time from 3 channels. I use the Mathnet library. Given that I filter in real time and filters are causal, do I need to create one filter for each channel? I'm not sure if I need to implement option A or option B.

Option A: 1 filter for all channels

static MathNet.Filtering.OnlineFilter bandpassFilter;
private void CreateFilter()
{
    bandpassFilter = MathNet.Filtering.OnlineFilter.CreateBandpass(MathNet.Filtering.ImpulseResponse.Finite, fs, fc1, fc2, order);
}

private double[,] FilterData(double[,] unfilteredData)
{
    double[] chFilteredData;
    double[,] filteredData = new double[unfilteredData.GetLength(0), unfilteredData.GetLength(1)];
    for (int channel = 0; channel < numChannels; channel++)
    {
        chFilteredData = bandpassFilter.ProcessSamples(unfilteredData.GetRow(channel));
        filteredData.SetRow(channel, chFilteredData);
    }
    return filteredData;
}

Option B: 1 filter for each channel

List<MathNet.Filtering.OnlineFilter> bandpassFilters;
private void CreateFilters()
{
    for (int channel = 0; channel < numChannels; channel++)
        bandpassFilters[channel] = MathNet.Filtering.OnlineFilter.CreateBandpass(MathNet.Filtering.ImpulseResponse.Finite, fs, fc1, fc2, order);
}

private double[,] FilterData(double[,] unfilteredData)
{
    double[] chFilteredData;
    double[,] filteredData = new double[unfilteredData.GetLength(0), unfilteredData.GetLength(1)];
    for (int channel = 0; channel < numChannels; channel++)
    {
        chFilteredData = bandpassFilters[channel].ProcessSamples(unfilteredData.GetRow(channel));
        filteredData.SetRow(channel, chFilteredData);
    }
    return filteredData;
}
1

There are 1 best solutions below

0
On

For IIR filters, containing recursive state, you need option B, otherwise any retained state from filtering one channel can contaminate the processing of other channels if you reuse 1 filter. The same for state-full (overlap add/save) FIR filters.

For stateless (non-overlap-add/save) FIR filters, each filter operation output depends only on the input, so you can treat it as functional programming, and use option A.