我正在寻找一个快速傅立叶变换引擎,可以处理8位实数到复数的转换(大小为65K)。这样做的需要是为了加速实时信号处理引擎。它目前受到8位-> FP32和FP32 -> 8位转换的限制,以及实际的快速傅立叶变换受到内存带宽的限制(我们目前使用快速傅立叶变换)。
我认为螺旋项目可能能够做这个http://spiral.net,但在他们的网页上唯一可用的代码似乎是用于单或双转换。
有人知道有什么C或C++库可以做到这一点吗?
发布于 2013-04-18 11:46:18
有时候我也遇到了同样的问题。我的数据帧的FFTW在14毫秒(向前、一些计算和向后)内执行,而直接的字节(或短)到浮点数组的转换需要12-19毫秒。所以我做了SSE函数来将字节转换成浮点数(每个周期4个元素),并获得了显着的速度增益-现在转换在2.2-5ms内完成。
如果您的编译器可以使用自动矢量化,请先尝试一下。
如果不是,则使用内部函数编写简单的转换函数。
我用过内联汇编程序(MOVD,PUNPCKLBW,PUNPCKLWD,CVTDQ2PS,MOVAPS命令序列)。
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在评论中所写的那样。
发布于 2013-04-18 21:32:47
您不希望所有的处理都在定点进行。在这种大小的FFT中,你的数据将会变得混乱。从技术上讲,你可以使用32位定点并保持你所有的动态,但你仍然必须转换数据,而且它将比使用浮点数慢(你标记了SSE,所以我假设你是在一台有FPU的英特尔机器上)。我的观点基于我创建kissfft的工作
相反,专注于加速类型转换。我还没有运行MBo的汇编代码,但它看起来是正确的方法。我认为展开可能会让它更快。
如果您不习惯使用汇编,请改用SSE2编译器内嵌式。它会同样快(假设编译器不错),并且会让你的代码更具可读性和可维护性。This answer将为您提供所需的大部分内容。
https://stackoverflow.com/questions/16066107
复制相似问题