【发布时间】:2019-07-23 10:43:34
【问题描述】:
我需要实现一个实时同步正交检测器。检测器接收输入数据流(来自 PCI ADC)并返回谐波幅度w。有简化的 C++ 代码:
double LowFreqFilter::process(double in)
{
avg = avg * a + in * (1 - a);
return avg;
}
class QuadroDetect
{
double wt;
const double wdt;
LowFreqFilter lf1;
LowFreqFilter lf2;
QuadroDetect(const double w, const double dt) : wt(0), wdt(w * dt)
{}
inline double process(const double in)
{
double f1 = lf1.process(in * sin(wt));
double f2 = lf2.process(in * cos(wt));
double out = sqrt(f1 * f1 + f2 * f2);
wt += wdt;
return out;
}
};
我的问题是 sin 和 cos 计算需要太多时间。有人建议我使用预先计算的sin 和cos 表,但可用的ADC 采样频率不是w 的倍数,因此存在片段拼接问题。 sin 和 cos 计算是否有任何快速的替代方案?如有任何关于如何提高此代码性能的建议,我将不胜感激。
UPD 不幸的是,我写错了代码,去掉了过滤调用,代码就失去了意义。谢谢 Eric Postpischil。
【问题讨论】:
-
什么平台?您是否尝试过 MKL 的矢量化函数?
-
如果表格的采样率足够小,您可以对表格中的值之间的值进行简单的线性插值。
-
根据您有多少信噪比容差,您可以简单地创建一个相当大的表并在值之间执行线性插值。不需要“片段拼接”,不管你是什么意思。我从第一手经验中知道,这种技术非常适用于一个非常知名的 DJ 应用程序中的实时音频重采样;)
-
它应该适用于 Linux 和 Windows,目前我们适用于 Windows。你能澄清一下MKL吗?
-
还要注意这个类只处理一个样本。这本质上对矢量化技术没有帮助。理想情况下,您应该拆分这些操作,以便可以并行完成多个计算。
标签: c++ optimization signal-processing trigonometry