您将如何优化此矢量化的谐波和?

马克兹

我正在使用向量化(仅SSE2 max作为SIMD)将一束谐波加在一起,每个谐波具有不同的相位/幅度。

这是我的实际尝试:

float output = 0.0f;
simd::float_4 freqFundamentalNormalized = freq * (1.0f / sampleRate);
simd::float_4 harmonicIndex{1.0f, 2.0f, 3.0f, 4.0f};
simd::float_4 harmonicIncrement{4.0f, 4.0f, 4.0f, 4.0f};

// harmonics
const int numHarmonicsV4 = numHarmonics / 4;
const int numHarmonicsRemainder = numHarmonics - (numHarmonicsV4 * 4);

// v4
for (int i = 0; i < numHarmonicsV4; i++) {
    // signal
    simd::float_4 sineOutput4 = simd::sin(mPhases4[i] * g2PIf) * mMagnitudes4[i];

    for (int v = 0; v < 4; v++) {
        output += sineOutput4[v];
    }

    // increments
    mPhases4[i] += harmonicIndex * freqFundamentalNormalized;
    mPhases4[i] -= simd::floor(mPhases4[i]);

    harmonicIndex += harmonicIncrement;
}

// remainder
if (numHarmonicsRemainder > 0) {
    // signal
    simd::float_4 sineOutput4 = simd::sin(mPhases4[numHarmonicsV4] * g2PIf) * mMagnitudes4[numHarmonicsV4];

    for (int v = 0; v < numHarmonicsRemainder; v++) {
        output += sineOutput4[v];
    }

    // increments
    mPhases4[numHarmonicsV4] += harmonicIndex * freqFundamentalNormalized;
    mPhases4[numHarmonicsV4] -= simd::floor(mPhases4[numHarmonicsV4]);
}

但:

  1. 我想我可以进一步优化它,也许有一些数学技巧,或者以一些增量保存
  2. 我不想重复一次“相同代码” V4,一次重复remainder(如果谐波的数量不是%4):有没有办法在最后的V4放置某种“遮罩”(例如)幅度在0?(因此,它在同一块中执行相同的操作,但不会求和为最终输出)。
杂项

问题的第二部分是最简单的。幅度为0的任何谐波都不会影响正弦输出,因此只需将其填充mMagnitude为4的倍数即可。

正如Damien指出的那样,sin(x)价格昂贵。但由Euler exp(x)=cos(x) + i sin(x),和exp(x+dx)==exp(x)*exp(dx)每个步骤只是一个复杂的乘法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何矢量化此替换操作?

来自分类Dev

加速符号化和矢量化功能

来自分类Dev

sklearn:如何加快矢量化器(例如Tfidfvectorizer)的速度

来自分类Dev

如何使我的网站徽标矢量化?

来自分类Dev

Julia:矢量化与反矢量化代码

来自分类Dev

此操作可以在Octave中矢量化吗?

来自分类Dev

当元素依赖于数据帧中的其他元素时,如何矢量化此R函数

来自分类Dev

熊猫列的矢量化“和”

来自分类Dev

如何矢量化此二维矩阵运算?

来自分类Dev

numpy矢量化

来自分类Dev

Python:沿轴的矢量化条件和

来自分类Dev

您将如何优化这个短而慢的Python循环?

来自分类Dev

NumPy-我将如何矢量化此操作?

来自分类Dev

在矢量化函数中调用矢量化函数

来自分类Dev

您如何才能让gcc完全矢量化此sqrt循环?

来自分类Dev

带有tfidf和计数矢量化器的gridsearchcv

来自分类Dev

如何对熊猫行动进行矢量化

来自分类Dev

熊猫矢量化

来自分类Dev

在熊猫数据框的某些列上对和进行矢量化

来自分类Dev

Lambda和python中的矢量化

来自分类Dev

您将如何阅读此php行?

来自分类Dev

如何从pandas数据框中的bool和float列计算新的矢量化列?

来自分类Dev

如何在MATLAB中实现此代码段的矢量化版本?

来自分类Dev

如何在numpy中矢量化傅立叶级数部分和

来自分类Dev

矢量化和循环版本返回不同的答案

来自分类Dev

矢量化算法

来自分类Dev

矢量化列表

来自分类Dev

选择性累积和的矢量化

来自分类Dev

在计算距离和 np.sum 上优化 numpy 矢量化