Фильтрация данных из разных каналов в режиме реального времени - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь фильтровать данные в режиме реального времени с 3 каналов. Я использую библиотеку Mat hnet. Учитывая, что я фильтрую в реальном времени, а фильтры являются причинно-следственными, нужно ли создавать один фильтр для каждого канала? Я не уверен, нужно ли мне реализовать опцию A или опцию B.

Опция A: 1 фильтр для всех каналов

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;
}

Опция B: 1 фильтр для каждого канала

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 Ответ

0 голосов
/ 08 марта 2020

Для IIR-фильтров, содержащих рекурсивное состояние, вам нужна опция B, в противном случае любое сохраненное состояние от фильтрации одного канала может загрязнить обработку других каналов, если вы повторно используете 1 фильтр. То же самое для FIR-фильтров с полным состоянием (с наложением / добавлением).

Для FIR-фильтров без состояния (с наложением-добавлением / сохранением) каждый выход операции фильтра зависит только от входа, поэтому вы можете обработать его в качестве функционального программирования используйте параметр A.

...