【问题标题】:Whats the best data structure/algorithm for compressing a 2D curve?压缩二维曲线的最佳数据结构/算法是什么?
【发布时间】:2014-07-30 18:59:08
【问题描述】:

我正在寻找一个递归函数来减少幅度/时间图上的数据点,同时保留曲线的特征。我最初以为我只是使用循环,这里是粗略的伪代码;

void compress(长度时间,幅度范围){

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

遍历长度时间,得到最小和最大幅度;

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

如果不是,则除以时间长度 / 4 并调用 compress(length time/4, 范围);

但是,我意识到这会非常非常慢。数据来自 matlab,4 秒的音频有 200k 数据对。有没有办法使用二叉堆或类似的东西,但用两个键而不是一个?

【问题讨论】:

  • 如何使用标准压缩方法,例如小波
  • 以前没听说过,我刚看了一下,好像Matlab有一个小波工具箱。我会给它一个流行-谢谢!

标签: c++ algorithm


【解决方案1】:

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

话虽如此,如果您仍然坚持从一开始就使用线条简化方法,Ramer–Douglas–Peucker algorithm 将是一个很好的起点。

【讨论】:

  • 感谢您。这适用于窗口化 FFT 之后。它用于在游戏引擎中驱动视觉效果,因此需要保留几个点都在 + 轴上的形状。这两种方法的结合会给我带来正确的效果......
  • @RobbieCooper 您是否正在尝试实现音频波形可视化器或音频频谱可视化器?两者都与数据压缩无关,前者有更简单的算法(如Envelop Detector),具体取决于您想要做什么。
  • 我需要的是一个 .csv 文件,其中包含两列逗号分隔的数据,一列用于时间,一列用于幅度/频率,无论我想从音频文件中提取什么。该引擎是 Unreal Engine 4,它可以接受 .csv 文件作为曲线来驱动视觉效果...
  • @RobbieCooper 在这种情况下,您可以使用包络检测器来提取波形信息,并使用加窗 FFT/FCT 来提取频率信息。您如何处理这些信息完全取决于您。
  • 是的,这行得通,谢谢。 matlab 中的包络检测器产生相同数量的数据,但它的格式更适合我需要做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多