multithreading - 多线程波表合成器点击。这是由撕裂的读取引起的吗?
问题描述
我目前正在开发一个非常基本的波表合成器。我会尽力给出一个可以理解的概述。
我有一个4096点的查找波形,由音频线程采样。然而,一般来说,单个振荡器具有多个波形,可以通过position
参数进行变形。例如,让我们采用两个正弦波,其中第二个的周期是第一个的一半。frequency = 440Hz
当我们在和播放这些声音时position = 0.5
,我们会在 440Hz 和 880Hz 听到两个同样响亮的音调。这是音频的链接(见旁注 2)。
由于性能原因,每当位置参数更改时,我都会在另一个线程上生成查找表。这就是我的问题。即使我不更改表格位置并且只是定期生成我的查找表,我也会遇到奇怪的、不可预测的故障。由于在这种情况下表中的音频数据没有变化,我只能通过撕裂读取来解释这一点。那是对的吗?如果是这样,我该如何解决?完成生成数据后,是否使用带有原子指针交换的双缓冲区?
同样,这里是这段录音的音频(见旁注 2)。另外,一些示波器数据:
旁注 1:填充我的查找表需要~50,000ns
没有优化和~10,000ns
优化。但故障似乎以相同的概率发生。
旁注2:我上传音频的网站似乎引入了一些奇怪的谐波,在我的视频中听不到。只是让你知道。
解决方案
找到了!生成查找表后,我不小心设置了旧的扫描仪位置。如果后者花费的时间太长,我的位置基本上会提前几微秒重置,这解释了示波器中的视觉挫折。
推荐阅读
- javascript - d3.js + GEOJSon 地图不显示
- angular - 带有身份验证令牌的 Angular bypassSecurityTrustResourceUrl
- node.js - 无法使用 npx 创建一个 Strapi 应用程序(尖锐模块问题,然后是 sqlite3 模块问题)
- html - CSS:样式表不反映更改
- flutter - 如何设置列表视图尾随填充
- java - Getdown 启动单实例 java GUI
- c# - 使用多个渠道,我做错了什么?
- html - json file missing Brackets
- ruby - Ruby 命令使用 AWS CLI 从 S3 下载多个文件夹
- amazon-web-services - Set Public IP information using remote-exec for a set of instances