Java FFT变换速度与MATLAB的比较

Java FFT变换速度与MATLAB的比较,java,matlab,fft,Java,Matlab,Fft,我在jTranscrom中有大约{1850000,1}个元素的向量。。 但是日志: exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000 它可以工作…但仍然需要大约1分钟!!对我来说太多了…用线。。 在matlab中,大约需要2秒。在Jtrans的官方网站上 :限制:两种尺寸的非幂的1D变换是连续的 (使用混合基数时)。用于两种尺寸的功率的1D变换 只能使用2或4个线程 线程数必须是两个数

我在jTranscrom中有大约{1850000,1}个元素的向量。。 但是日志:

exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000
它可以工作…但仍然需要大约1分钟!!对我来说太多了…用线。。 在matlab中,大约需要2秒。在Jtrans的官方网站上

:限制:两种尺寸的非幂的1D变换是连续的 (使用混合基数时)。用于两种尺寸的功率的1D变换 只能使用2或4个线程

线程数必须是两个数的幂

有人能解释一下两种尺寸的幂是什么吗?

二的幂是(在计算机如此普及的情况下)只有因子2的数字。这是2,4,8,16,…,1024,2048等等。所以如果你用一个正好有1024个数字的向量作为输入,它应该会更快


我真的不知道你说的“大约{1850 000,1}个元素”是什么意思,尽管你的数字可能要高得多?该库显然不会使用超过4个线程(在许多系统上也不会有太多功能),因此您不应该获得太多的速度增益。可能还涉及到另一个问题。

我将发布一些FFT的背景知识来解释基数2的限制

首先要注意的是,大多数FFT实现都使用这种方法,它通过将FFT拆分为越来越小的FFT来工作,就像合并排序首先将排序限制在基本情况下一样

C-T算法最常用的方法是将问题分成一半(
N=N0/2
)。这并不是说混合基数的情况是不可能的,但出于以下原因,“二次幂”的情况是最有效的,因此使用最多

现在大多数FFT实现的主要瓶颈不是算法的实现,而是硬件处理器管道等等。显然,这些都是建立在二进制逻辑基础之上的,导致带宽几乎完全为2N

因此,由于寄存器中的精确拟合和原始问题的精确细分,在内存中使用2N字节的FFT计算速度将更快

TL;DR:用不相关的数据(0)填充FFT向量,直到它达到最接近的2次方。然后只使用有效的结果数据


但是,您的异常看起来好像内存不足。您使用的是32位操作系统吗?如果是这样的话,由于您的大型操作,您可能正在运行分配的2GB进程内存或其他一些限制。

谢谢ok j让这个数字1843200 a,它的二次幂:)当我使用相同的函数调用方法时,它是myabye问题object@LukasTheBoss:1843200不是二的幂(因为你可以将它除以5(最后一位是零))。如果可以的话,你应该使用FFT(在任何库中)和一些元素,这些元素是两的纯幂:它简化了计算,因此加快了计算速度。@LukasTheBoss如果是这样的话,你更容易出错。我不是安卓专家,但我确信通常的2GB寻址限制已经大大降低,内存管理也更加严格。然而,我不认为Java分配的1.3MB在这里是一个问题。我想我的新问题是你的问题到底是什么?它清楚地说明了选择2或4个线程来运行,我们已经解释了为什么FFT应该是2的幂。您遇到了什么错误/问题?当我有大小为1 843 200的输入向量时,这很有趣,itt工作得非常快,但当我尝试这个并且需要这个:1 843 200+2时,它抛出了相同的错误:线程“main”中的异常java.lang.OutOfMemoryError:edu.emory.mathcs.jtransforms.fft.DoubleFFT\u 1D.bluestein\u real\u forward中的java堆空间(未知源)位于edu.emory.mathcs.jtransforms.fft.DoubleFFT\u 1D.realfroward(未知源)当我尝试1843200+1错误时当我尝试1843120错误时same@LukasTheBoss这很奇怪。我怀疑某种类型的内存分配错误源于试图自动将数组填充到一个方便的数字的算法。如果你是为android开发的,这是否在android测试环境之外工作是吗,有了放松的记忆指导原则?我只需要真正的元素和拳头0.05%的最高百分比。