gpt4 book ai didi

arm - 用于在矩形和极坐标之间转换的 NEON 代码

转载 作者:行者123 更新时间:2023-12-04 20:01:59 25 4
gpt4 key购买 nike

我正在尝试做 FFT -> signal manipulation -> Inverse FFT使用 Project NE10在我的 CPP 项目中,将复数输出转换为 FFT 的幅度和相位,反之亦然 IFFT。但是根据基准测试,我的 C++ 代码的性能不如启用 SIMD 的 NE10 代码。由于我没有 ARM 组装经验,我正在寻找一些帮助来为未优化的 C 模块编写 NEON 代码。例如,在 IFFT 之前,我这样做:

for (int bin = 0; bin < NUM_FREQUENCY_BINS; bin++) {
input[bin].real = amplitudes[bin] * cosf(phases[bin]);
input[bin].imag = amplitudes[bin] * sinf(phases[bin]);
}

在哪里 input是一个 C 结构数组(用于复数值), amplitudes & phasesfloat数组。

以上区 block (O(n) complexity) 8192 个 bin 大约需要 0.6ms,而 NE10 FFT (O(n*log(n)) complexity)由于 SIMD 操作,仅需 0.1ms。从我目前在 StackOverflow 和其他地方读到的内容来看,内在函数不值得付出努力,所以我只尝试使用 arm neon。

最佳答案

如果您接受近似值,则可以将 NEON 用于三角函数。我不隶属,但有一个实现here使用内在函数创建精确到许多小数位的矢量化 sin/cos 函数,其性能明显优于简单调用 sinf等(基准由作者提供)。
该代码特别适合您的极坐标到笛卡尔计算,因为它同时生成 sin 和 cos 结果。它可能不适合绝对精度至关重要的事情,但对于与频域音频处理有关的事情,通常情况并非如此。

关于arm - 用于在矩形和极坐标之间转换的 NEON 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42291106/

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