当前位置: 首页 > 知识库问答 >
问题:

压缩2D曲线的最佳数据结构/算法是什么?

萧奇
2023-03-14

我想做一个递归函数,减少振幅/时间图上的数据点,同时保留曲线的特征。我最初认为我应该使用一个循环,这里是粗略的伪代码;

空隙压缩(长度时间,幅度范围){

检查长度时间的分辨率是否高于数据返回的分辨率(如果高于);

循环通过长度时间,得到最小和最大幅度;

如果最小和最大振幅之间的差异在振幅范围内,则存储最小和最大并返回;

如果没有,除以时间长度/4并调用compress(长度时间/4,范围);

然而,我意识到这将是非常非常缓慢的。数据来自matlab,4秒钟的音频有200k个数据对。有没有一种方法可以使用二进制堆或类似的东西,但使用两个键而不是一个键?

共有1个答案

谭昕
2023-03-14

使用线简化方法来压缩像音频波这样的高周期时间序列是一个非常糟糕的想法。在这种情况下,加窗FFT/FCT压缩方法将获得更高的峰值信噪比。基本上,您可以将信号划分(不精确,因为我们使用的是窗口函数)为小块数据,对每个数据块执行FFT/FCT,然后丢弃高频系数。可以使用其他常规数据压缩方法进一步压缩低频系数的时间序列,但如果再次使用有损压缩方法,通常无法保证其保真度。

也就是说,如果您仍然坚持从一开始就使用线简化方法,那么Ramer–Douglas–Peucker算法将是一个很好的起点。

 类似资料:
  • 我想知道我们可以在多大程度上进行无损数据压缩;我无法找到一个无损算法的在线模拟器来执行一些经验测试。我可以自己做一个,但不幸的是,我在这段时间没有足够的时间;我仍然对我的直觉感到好奇,我将解释一下。 让我们只看两种更流行的算法:

  • 立方Béziers为每个点接收两个控制点。 几条Bézier曲线可以串在一起,以创建扩展,平滑的形状。通常,一个点一侧的控制点将是另一侧用来保持斜率恒定的控制点的反映。在这种情况下,可以使用立方Bézier的快捷版本,由命令S(或S)指定。 每个bezier类必须单独实现,还是可以将它们组合成一个泛型类? 如果分开,它们基本上只是一个控制点数组吗? 所以基本上我开始想: 但这似乎不太对。例如,一条

  • 问题内容: 什么是最好的JavaScript压缩器?我正在寻找一种工具: 易于使用 压缩率高 产生可靠的最终结果(不会弄乱代码) 问题答案: 除了去除空格之外,UglifyJS还执行以下操作: 更改局部变量名称(通常更改为单个字符) 加入连续的var声明 避免插入任何不需要的括号,括号和分号 优化IF(在检测到不需要时删除“ else”,并在可能的情况下将IF转换为&&,||或?/:运算符,等等)

  • 问题内容: 因此,我的任务是从本质上读取一个文件(记事本文件),该文件具有许多火车停靠站以及从一个停靠站到另一个停靠站所花费的时间。例如,它看起来像: 现在,我需要返回并访问这些站点及其时间。我当时正在考虑读取文件并将其存储为字典。我的问题是,最好的字典是吗?还是有其他一些Python工具会被证明更有用?任何想法将不胜感激! 问题答案: 我会反驳说-直截了当的命令并不是最好的选择。 假设您有100

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: 多语言数据库的架构 这是一个例子: 问题: 每种新语言都需要修改表结构。 这是另一个例子: 问题是: 每种新语言都需要创建新表,并且每个表中都有“价格”字段重复。 这是另一个例子: 问题: 难吗? 问题答案: 您的第三个示例实际上是通常解决问题的方式。努力,但可行。 从翻译表中删除对产品的引用,然后将翻译的引用放在您需要的地方(

  • 我们从四个简单但重要的概念开始研究数据结构。栈,队列,deques, 列表是一类数据的容器,它们数据项之间的顺序由添加或删除的顺序决定。一旦一个数据项被添加,它相对于前后元素一直保持该位置不变。诸如此类的数据结构被称为线性数据结构。 线性数据结构有两端,有时被称为左右,某些情况被称为前后。你也可以称为顶部和底部,名字都不重要。将两个线性数据结构区分开的方法是添加和移除项的方式,特别是添加和移除项的