multithreading - 多线程波表合成器单击。这是由于阅读中断造成的吗?

标签 multithreading audio signal-processing waveform synthesizer

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

我有一个具有4096点的查找波形,该波形由音频线程采样。但是,通常,单个振荡器具有多个波形,可以通过position参数进行变形。例如,让我们采取两个正弦波,其中第二个正弦波的周期是第一个正弦波的一半。当我们以frequency = 440Hzposition = 0.5播放这些声音时,我们会听到440Hz和880Hz处两个同样响亮的音调。这是a link to the audio(请参阅旁注2)。

Frequency spectrum of the 440Hz and 880Hz sine waves

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

Same frequency spectrum, but with glitches

再次,这是the audio for this recording(请参阅旁注2)。
另外,一些示波器数据:

Oscilloscope Image where such a glitch is visible

旁注1 :填充我的查找表时需要使用未经优化的~50,000ns和经过优化的~10,000ns。但是故障似乎以相同的概率发生。

旁注2 :我上载音频的网站似乎引入了一些奇怪的谐波,这些谐波在我的视频中听不到。请注意。

最佳答案

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

关于multithreading - 多线程波表合成器单击。这是由于阅读中断造成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743123/

相关文章:

java - 线程内的代码比线程外的慢..?

java - Java Web 应用程序中的并发

java.io.IOException : mark/reset not supported

android - 是否通过采样率记录音频循环?

python - Scipy:Hermite 函数与正交权重的集成

java - 通过扬声器播放麦克风中的音频

java - 配置线程池用于调度任务及其取消

objective-c - 线程嵌套 for 循环

javascript - 获取网络音频的音量速度

matlab - 扫描/线性调频信号以不正确的频率结束