无法在C++visual studio 2010中应用Kaiser窗口的系数
Unable to apply coefficient of Kaiser window in C++ visual studio 2010
我正试图让我的数据通过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
值的指针。
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 如何为窗口截屏
- 无法在C++visual studio 2010中应用Kaiser窗口的系数