实时过滤来自不同通道的数据



我正在尝试从3个通道实时过滤数据。我使用数学网图书馆。假设我实时过滤,并且过滤器是因果的,我需要为每个通道创建一个过滤器吗?我不确定我是否需要实施选项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:每个通道一个滤波器

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

对于包含递归状态的IIR过滤器,您需要选项B,否则,如果重用1个过滤器,则过滤一个通道所保留的任何状态都可能污染其他通道的处理。状态满(重叠添加/保存(FIR滤波器也是如此。

对于无状态(非重叠添加/保存(FIR滤波器,每个滤波器操作输出仅取决于输入,因此您可以将其视为功能编程,并使用选项A.

最新更新