首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPU架构的8位FFT?

CPU架构的8位FFT?
EN

Stack Overflow用户
提问于 2013-04-18 01:12:58
回答 2查看 945关注 0票数 3

我正在寻找一个快速傅立叶变换引擎,可以处理8位实数到复数的转换(大小为65K)。这样做的需要是为了加速实时信号处理引擎。它目前受到8位-> FP32和FP32 -> 8位转换的限制,以及实际的快速傅立叶变换受到内存带宽的限制(我们目前使用快速傅立叶变换)。

我认为螺旋项目可能能够做这个http://spiral.net,但在他们的网页上唯一可用的代码似乎是用于单或双转换。

有人知道有什么C或C++库可以做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2013-04-18 11:46:18

有时候我也遇到了同样的问题。我的数据帧的FFTW在14毫秒(向前、一些计算和向后)内执行,而直接的字节(或短)到浮点数组的转换需要12-19毫秒。所以我做了SSE函数来将字节转换成浮点数(每个周期4个元素),并获得了显着的速度增益-现在转换在2.2-5ms内完成。

如果您的编译器可以使用自动矢量化,请先尝试一下。

如果不是,则使用内部函数编写简单的转换函数。

我用过内联汇编程序(MOVD,PUNPCKLBW,PUNPCKLWD,CVTDQ2PS,MOVAPS命令序列)。

代码语言:javascript
复制
procedure BytesToSingles(Src, Dst: Pointer; Count: Integer);
asm
  //EAX = Src pointer to byte array
  //EDX = Dst pointer to float array !!! 16 byte-aligned !!!
  //ECX = Count (multiple of four)
  SHR ECX, 2           // 4 elements per cycle
  JZ @@Exit
  PXOR XMM7, XMM7      // zeros
@@Cycle:
  MOVD XMM1, [EAX]     // load 4 bytes
  PUNPCKLBW XMM1, XMM7 // unpack to words
  PUNPCKLWD XMM1, XMM7 // words to int32
  CVTDQ2PS XMM0, XMM1  // convert integers to 4 floats
  MOVAPS [EDX], XMM0   // store 4 floats to destination array
  ADD EAX, 4           // move array pointers
  ADD EDX, 16
  LOOP @@Cycle
@@Exit:
end;

请注意,8位数据上的FFT实现将受到数值错误问题的影响,正如Paul R在评论中所写的那样。

票数 3
EN

Stack Overflow用户

发布于 2013-04-18 21:32:47

您不希望所有的处理都在定点进行。在这种大小的FFT中,你的数据将会变得混乱。从技术上讲,你可以使用32位定点并保持你所有的动态,但你仍然必须转换数据,而且它将比使用浮点数慢(你标记了SSE,所以我假设你是在一台有FPU的英特尔机器上)。我的观点基于我创建kissfft的工作

相反,专注于加速类型转换。我还没有运行MBo的汇编代码,但它看起来是正确的方法。我认为展开可能会让它更快。

如果您不习惯使用汇编,请改用SSE2编译器内嵌式。它会同样快(假设编译器不错),并且会让你的代码更具可读性和可维护性。This answer将为您提供所需的大部分内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16066107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档