首页 > 解决方案 > 多线程波表合成器点击。这是由撕裂的读取引起的吗?

问题描述

我目前正在开发一个非常基本的波表合成器。我会尽力给出一个可以理解的概述。

我有一个4096点的查找波形,由音频线程采样。然而,一般来说,单个振荡器具有多个波形,可以通过position参数进行变形。例如,让我们采用两个正弦波,其中第二个的周期是第一个的一半。frequency = 440Hz当我们在和播放这些声音时position = 0.5,我们会在 440Hz 和 880Hz 听到两个同样响亮的音调。这是音频的链接(见旁注 2)。

440Hz 和 880Hz 正弦波的频谱

由于性能原因,每当位置参数更改时,我都会在另一个线程上生成查找表。这就是我的问题。即使我不更改表格位置并且只是定期生成我的查找表,我也会遇到奇怪的、不可预测的故障。由于在这种情况下表中的音频数据没有变化,我只能通过撕裂读取来解释这一点。那是对的吗?如果是这样,我该如何解决?完成生成数据后,是否使用带有原子指针交换的双缓冲区?

相同的频谱,但有毛刺

同样,这里是这段录音的音频(见旁注 2)。另外,一些示波器数据:

可见这种毛刺的示波器图像

旁注 1:填充我的查找表需要~50,000ns没有优化和~10,000ns优化。但故障似乎以相同的概率发生。

旁注2:我上传音频的网站似乎引入了一些奇怪的谐波,在我的视频中听不到。只是让你知道。

标签: multithreadingaudiosignal-processingwaveformsynthesizer

解决方案


找到了!生成查找表后,我不小心设置了旧的扫描仪位置。如果后者花费的时间太长,我的位置基本上会提前几微秒重置,这解释了示波器中的视觉挫折。


推荐阅读