无法在C++visual studio 2010中应用Kaiser窗口的系数

Unable to apply coefficient of Kaiser window in C++ visual studio 2010

本文关键字:窗口 Kaiser 应用 C++visual studio 2010      更新时间:2023-10-16

我正试图让我的数据通过C++中截止频率为1 Hz的低通滤波器。为此,我通过Matlab设计了一个kaiser窗口,得到了20个系数。这是我的Matlab代码:-

fc = 1; % cutoff frequency 1 Hz
Wn = (2/Fs)*fc;
b = fir1(20,Wn,'low',kaiser(21,3));

为了了解如何使用C++应用此筛选器,我使用此链接作为应用低通筛选器的示例。这是链接中给出的代码。

/* C function implementing the simplest lowpass:
 * 
 *      y(n) = x(n) + x(n-1)
 *
 */
double simplp (double *x, double *y, 
               int M, double xm1)
{
  int n;
  y[0] = x[0] + xm1;
  for (n=1; n < M ; n++) {
    y[n] =  x[n]  + x[n-1];
  }
  return x[M-1];
}

但我仍然不知道如何应用matlab滤波器的系数。所以,请告诉我怎么做。

示例C++代码显示了如何应用具有两个系数(均等于1.0)的滤波器。但是你有20个系数,每个系数都有不同的值。您需要采取的步骤:

创建系数数组

创建一个系数数组,其中包含从matlab中获得的系数。这个代码看起来像:

static const std::size_t coefCount = 20;
static const double coefs[coefCount] =
{
    0.123, 0.234, 0.345, 0.456, 0.567,
    0.678, 0.789, 0.890, 0.901, 0.012,
    0.123, 0.234, 0.345, 0.456, 0.567,
    0.678, 0.789, 0.890, 0.901, 0.012
};

当然,你可以使用matlab产生的系数。

应用系数

在函数中,将这些系数应用于输入数据,生成输出数据。应用这些系数意味着将它们与输入数据进行卷积。主循环看起来像:

std::size_t outputIndex = 0;
for (std::size_t inputIndex = coefCount - 1; inputIndex < inputCount; inputIndex++)
{
    output[outputIndex] = 0.0;
    for (std::size_t coefIndex = 0; coefIndex < coefCount; coefIndex++)
        output[outputIndex] += input[inputIndex - coefIndex] * coefficient[coefIndex];
    outputIndex++;
}

处理数据的开始和结束

决定如何处理输入数据的开始(和结束)。您会注意到,我给出的主循环示例只生成inputCount - coefCount + 1输出样本。这可能对你正在做的事情来说已经足够了,也可能不够。

如果假设输入数据是较大输入数据流的单个块,并且希望处理多个连续的输入数据块以生成多个连续输出数据块,则需要将以前的一些输入块传递到函数中。当计算第一coefCount - 1输出样本时,使用该先前输入数据。您的示例simplp函数通过传递单个xm1值来实现这一点。但是您需要传入一个coefCount - 1值的数组。

应用初始数据的代码稍微复杂一些,所以我将把它留给读者练习。:)

simplp函数还将最后一个输入值作为返回值返回。如果您真的想模拟simplp,您可以传回最后一个coefCount - 1输入值的数组。您不想实际传回一个单独的数组(效率低且不必要),但可能想要传回一个指向最后这些coefCount - 1值的指针。