我正在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())]
在过滤循环内的所有轨迹但在单独过滤时匹配结果时,代码中可能存在的错误结果可能存在错误。
答案 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();
}
}