我有一个大学任务,需要使用C++/Qt显示音频文件的波形。我们应该能够修改用于显示它的比例(以屏幕像素每个音频样本表示)。
到目前为止,我已经能够:
- 打开音频文件 - 读取样本 - 在给定的比例下绘制样本
为了在给定的比例下绘制样本,我尝试了两种策略。假设N是比例的值:
- 对于从0到窗口宽度的i,将第i * N个音频样本绘制在屏幕像素i上。这非常快,并且时间恒定,因为我们总是访问相同数量的音频数据点。然而,它不正确地表示波形,因为我们使用一个点的值来表示N个点。 - 对于从0到N *宽度的i,将第i个音频样本绘制在屏幕位置i /(N *宽度)处,并让Qt找出如何在物理屏幕像素上正确表示它。这会绘制非常漂亮的波形,但访问数据需要很长时间。例如,如果我想要每个像素显示500个样本,并且我的窗口宽度为100像素,则必须访问50,000个点,然后由Qt作为100个物理点(像素)绘制。
那么,如何获得正确的音频数据绘图,而且还能快速计算?我应该为每个物理像素计算N个样本的平均值吗?我应该进行一些曲线拟合吗?
换句话说,在Qt / Matplotlib / Matlab等将数千个数据点绘制到非常有限的物理像素上时涉及哪种操作?
到目前为止,我已经能够:
- 打开音频文件 - 读取样本 - 在给定的比例下绘制样本
为了在给定的比例下绘制样本,我尝试了两种策略。假设N是比例的值:
- 对于从0到窗口宽度的i,将第i * N个音频样本绘制在屏幕像素i上。这非常快,并且时间恒定,因为我们总是访问相同数量的音频数据点。然而,它不正确地表示波形,因为我们使用一个点的值来表示N个点。 - 对于从0到N *宽度的i,将第i个音频样本绘制在屏幕位置i /(N *宽度)处,并让Qt找出如何在物理屏幕像素上正确表示它。这会绘制非常漂亮的波形,但访问数据需要很长时间。例如,如果我想要每个像素显示500个样本,并且我的窗口宽度为100像素,则必须访问50,000个点,然后由Qt作为100个物理点(像素)绘制。
那么,如何获得正确的音频数据绘图,而且还能快速计算?我应该为每个物理像素计算N个样本的平均值吗?我应该进行一些曲线拟合吗?
换句话说,在Qt / Matplotlib / Matlab等将数千个数据点绘制到非常有限的物理像素上时涉及哪种操作?