【发布时间】:2016-09-29 23:01:44
【问题描述】:
我有兴趣在 Windows 和 Linux 上用 C 或 C++ 实现音频编辑器。我不知道如何在完全缩小的视图中足够快地显示波形。我不是在寻找有关快速帧缓冲技术的信息。这是一个关于算法和数据结构的问题,以有效地确定要显示的内容。
假设我希望能够编辑 2 小时长的 5 通道、48 KHz、24 位声音。那是 5 GB 的样本数据。我希望能够从每个样本一个像素一直缩小,直到所有样本数据一次可见。我希望应用程序即使在慢速机器上也能感觉响应,例如,为了争论,1 GHz Atom。当我说响应时,我希望 GUI 更新通常发生在用户输入的 1/30 秒内。
在决定为完全缩小的视图渲染什么时,一个简单的实现会扫描整个波形中的每个样本 - 它需要找到显示的每个像素宽度“覆盖”的所有样本的最大和最小样本值.我编写了一个简单的应用程序来测试这种方法的速度。我在我的 2015 3.5 GHz Xeon 上使用 1 小时长的单声道 16 位 44.1 KHz 样本进行了测试。它需要 0.12 秒。这太慢了数百倍。
您可以想象维护一个缩小数据的缓存,但我不知道如何避免在大多数插入或删除后重新计算整个缓存。感觉一定有更好的办法。
这是一个图表,显示了我想要实现的目标:
这是目前大多数可用音频编辑器中的显示方式。用户可能会期待这种行为。我用 Audacity 进行了测试,它以这种方式工作(尽管它也以较浅的颜色显示样本的平均值)。它可以处理任意插入到大声音中,看似即时。我不会阅读 75 兆字节的源代码来了解它是如何做到的。
编辑:
许多人提出了在显示缩小视图时只考虑样本子集的方案。我得出的结论是我不想这样做,因为它丢失了太多有用的信息。例如,如果您正在寻找声音中的故障(例如乙烯基转换中的咔嗒声),则包括所有样本很重要。在最坏的情况下,如果故障只有一个样本长,我仍然希望保证它显示在完全缩小的视图中。
【问题讨论】:
-
下采样!下采样! 1/30 秒在旧机器上是一个梦想,但你可以通过更好的硬件获得好的结果。还要记住,除非您非常小心,否则图形和 IO 将是缓慢的部分。未压缩的波可以寻求读取每个 n 的 1 个样本(不准确但反应灵敏),然后在后台读取和下采样。在其他所有事情完成后缓存并接受你不会有你想要的性能。这不是一个算法或一个数据结构,而是一堆技术来给出印象。
-
下采样是什么意思?根据我对术语的理解,如果我对 20 KHz 方波进行下采样,我会得到一个直流信号。而显示器仍应显示全幅信号。我可以看到,每 n 个样本中读取 1 个以获得不准确但响应式的显示是对我最初问题的可能答案。顺便说一句,我已经可以将数据快速绘制到屏幕上。我只是将所有的线条画到 RAM 中的位图中,然后将整个东西 blit 到屏幕上。
-
反对票有什么解释吗?
-
如何更新 GUI?您使用的是什么 GUI 框架?
-
你的程序是多线程的吗?例如,一个线程处理输入而另一个线程正在绘制?
标签: c++ algorithm performance data-structures