在绘制发散的二维函数时,有什么优雅的方法可以避免“跳跃”量化误差?

问题描述 投票:0回答:1

我有一些基于 Qt 的软件,可以以 2D 形式绘制音频转换函数(以 Hz 为单位的频率作为 X 轴,以分贝增益作为 Y 轴)。

它通过选择一组 X 位置来计算点,然后计算与每个 X 位置对应的 Hz 值,然后计算与每个 Hz 值对应的 dB 值,然后计算对应的 Y 值来实现此目的到每个 dB 值,然后最后绘制一系列线段来表示计算出的 EQ 曲线。

这一切基本上都运作良好。当我正在绘制的变换不是一个表现良好的函数时,就会出现例外;例如,在此链接的视频中,我正在绘制一个“陷波函数”,该函数在特定值处发散到负无穷大,因此数学函数变得无限陡峭地接近该值。

实际上以像素为单位绘制的线,OTOH,并不总是准确地代表底层函数,因为由于数量有限,朝向负无穷大的“尖峰”通常会在图形底部上方的远上方“被切断”我的采样集中的点。在视频中,当我更改陷波滤波器的频率控制时,这会导致白线底部出现某种“跳跃”效果。理想的行为是,无论频率设置如何,白线始终延伸到图表的底部,因为这将更准确地反映基础数学函数。

显然,我可以通过增加计算值的 X 位置数量(每个水平像素最多计算一次)来减少问题的严重性;但这需要额外的 CPU 周期,更糟糕的是,它只能减少视觉错误,而不会完全删除它。

我的问题是,是否有任何明显或广泛使用的技术可以用来更优雅地解决这个问题?我认为每个数学函数绘图程序迟早都会遇到这个问题;因此,我认为我应该首先看看是否有我可以采用的标准实践,而不是尝试回避自己的黑客解决方案。

c++ qt sampling graphing quantization
1个回答
0
投票

这里没有一个完全通用的答案:一个函数实际上可以以复杂的方式在绘图区域(任意)底部附近但上方跳舞,并且没有采样方案可以发现它实际上发散的每个地方。当然,如果你知道分歧点,你可以将它们添加为绘图点(具有一些大的有限值),但一般情况下也不能假设该分析。

也就是说,有一种相当有效的方法来处理大多数表现良好且其分歧类型已知的函数。这个想法是让图表适应函数。通常,这涉及以数值方式估计函数的二阶导数,并在较大的地方添加更多绘图点,但这里提出了一个更简单的策略:从统一的点网格开始(可能比您单独使用的网格要粗糙一些),然后在不离开图形的“最低”点与其下邻居之间重复添加点。 (您可以使用优先级队列来有效地找到最低点。) 当一个点与其邻居之间的分离达到一定的容差(也许大约是一个像素)时,取消其资格,以防较少探索的区域中的较高点接近发散;当最低点剩余点高于另一个容差(或总点数超过另一个)时,停止。 请注意,这里有几个容差,这是尝试启发式捕获未知函数的行为时不可避免的。

© www.soinside.com 2019 - 2024. All rights reserved.