gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:07:06 26 4
gpt4 key购买 nike

我正在使用向量化(仅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]);
}
但:
  • 我想我可以进一步优化它,也许有一些数学技巧,或者以一些增量保存
  • 我不想为V4重复一次“相同的代码”,对于remainder重复一次(如果谐波的数量不是%4):有没有办法在最后的V4放置某种“ mask ”(例如)幅度为0? (因此,它在同一块中执行相同的操作,但不会求和为最终输出)。
  • 最佳答案

    问题的第二部分是最简单的。任何幅度为0的谐波都不会影响正弦输出,因此您只需将mMagnitude填充为4的倍数即可。
    正如Damien所指出的,sin(x)很昂贵。但是通过Euler,exp(x)=cos(x) + i sin(x)exp(x+dx)==exp(x)*exp(dx)。每个步骤只是一个复杂的乘法。

    关于c++ - 您将如何优化此矢量化的谐波和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64167312/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com