使用MATLAB中的系数在C ++中进行FIR滤波器设计,滤波器未给出正确的结果

时间:2016-04-06 19:07:59

标签: c++ opencv signal-processing digital-filter

我正在OpenCV开展一个项目,因为我是这个领域的新手,我遇到了一些问题。我必须设计一个128阶FIR带通滤波器,我已经使用了MATLAB计算的系数。我在网上找到了以下代码。

// Calling FIR filter function filter
// filtering all 266 values across 1000 frames.

const int numFrames = 1000;

//featuresPrevious.size() = 266 (predefined fixed value)

vector<vector<double>> filteredTrajectory;
filteredTrajectory.resize(numFrames-1);

   for (int i = 0; i<numFrames-1; i++)

    {

       filteredTrajectory[i].resize(featuresPrevious.size());

       for (int j = 0; j<featuresPrevious.size(); j++)

        {

            filteredTrajectory[i][j] = filter (Ycoordinates[i][j]); 

     }

    }

我尝试使用下面的代码段中描述的过滤器。 filteredTrajectory是向量的向量,我想存储过滤的值。 YCoordinates是包含要过滤的数据的向量向量。 YCoordinates的维度是[1000x266]

// Filtering value at index Ycoordinates[i][0] across all frames 

filteredTrajectory.resize(numFrames-1);

   for (int i = 0; i<numFrames-1; i++)

    {

     filteredTrajectory[i].resize(1);

     filteredTrajectory[i][0] = filter (Ycoordinates[i][0]);

} 

当我运行此代码时,过滤的值与MATLAB的值不匹配。但是,如果我在所有1000帧中只过滤一个值,我会得到与MATLAB匹配的结果(参见下面的代码)。

[x for x in a if set(x.split() + b) and set(c).isdisjoint(x.split())]

在过滤循环内的所有轨迹但在单独过滤时匹配结果时,代码中可能存在的错误结果可能存在错误。

1 个答案:

答案 0 :(得分:2)

Matlab&#39; s filter是一维过滤器。当提供的输入是二维矩阵时,它会独立过滤每个列(默认情况下,如果未设置dim参数,或设置为1;将dim设置为2将执行相同的操作但是打开每一行),基本上在每个处理过的列(或行)之间重置FIR状态。

因此,为了获得正确的结果,您还必须通过将缓冲区重置为零来重置您在buffer中存储的每个要过滤的值集之间的过滤器状态:

void reset_buffer()
{
  for(int i=0; i<taps ; i++ )
  {
    buffer[i] = 0.0;
  }
}

此外,过滤器必须顺序地看到属于同一组的每个值(即,不将值交织到过滤函数),因此循环的顺序很重要。根据您是要沿数据的列或行维度进行过滤,可以使用以下任一功能:

// Filter along columns, similar to Matlab's filter(coefficients, 1, data, [], 1)
void filterDim1()
{
  for (int i = 0; i<numFrames-1; i++)
  {
    filteredTrajectory[i].resize(featuresPrevious.size());
  }
  for (int j = 0; j<featuresPrevious.size(); j++)
  {
    for (int i = 0; i<numFrames-1; i++)
    {
      filteredTrajectory[i][j] = filter (Ycoordinates[i][j]); 
    }
    reset_buffer();
  }
}
// Filter along rows, similar to Matlab's filter(coefficients, 1, data, [], 2)
void filterDim2()
{
  for (int i = 0; i<numFrames-1; i++)
  {
    filteredTrajectory[i].resize(featuresPrevious.size());
    for (int j = 0; j<featuresPrevious.size(); j++)
    {
      filteredTrajectory[i][j] = filter (Ycoordinates[i][j]); 
    }
    reset_buffer();
  }
}