【发布时间】:2014-08-16 11:31:45
【问题描述】:
我正在实现短时傅里叶变换,每帧之间有 70% 的重叠(每帧 256 个样本)。因为每次迭代之间只有前 75 个样本发生变化,我正在伤害在 JAVA 中实现这一点的最佳方法是什么。意思是在java中删除前70个样本并附加新的70个样本的最快方法是什么?
【问题讨论】:
标签: java performance signal-processing
我正在实现短时傅里叶变换,每帧之间有 70% 的重叠(每帧 256 个样本)。因为每次迭代之间只有前 75 个样本发生变化,我正在伤害在 JAVA 中实现这一点的最佳方法是什么。意思是在java中删除前70个样本并附加新的70个样本的最快方法是什么?
【问题讨论】:
标签: java performance signal-processing
这听起来像是循环缓冲区的工作。
这是一个复制/粘贴的简单实现:Circular Array List for Java
【讨论】:
您需要某种Queue 集合,它允许您删除最旧的元素(位于队列顶部)并将新元素添加到末尾。
LinkedList 是Queue 的可能实现,它可以工作。使用add 或addAll 将元素添加到末尾,使用remove 从列表中删除第一个元素。
如果您想创建自己的自定义数据结构,长度有限的循环队列(在您的情况下为 256)将是理想的。每次添加新样本时,这样的队列都会覆盖旧样本。我没有在 Java API 中找到现有的此类数据结构。
编辑:您没有指定每个样本包含什么类型的数据。如果它是 maaartinus 评论中所建议的原语 - 双倍,那么您可能最好不要使用 Java 的标准集合,因为它们在用于存储原语时涉及装箱开销。相反,您可以按照上一段中的建议创建自己的循环队列。正如 maaartinus 所建议的,它可以由数组支持,double[256],这将非常有效。
【讨论】:
LinkedList 是有史以来最糟糕的数据结构之一。虽然理论上很好,但真正有意义的情况很少见。特别是在这里,当 OP 需要处理原语时,与new double[256] 循环缓冲区相比,any collection 的开销太高(很容易实现)。