【问题标题】:Mac OS X: Audio frequency shift by change of sample rate?Mac OS X:通过改变采样率来改变音频频率?
【发布时间】:2015-07-06 10:13:12
【问题描述】:

我想通过更改 Mac OS X 上的采样率来更改录音的频率。

这是一个针对口吃者的研究项目。延迟非常低很重要——例如,这就是我不考虑快速傅立叶变换的原因。相反,我想以 44kHz 的速率收集样本,然后做以下两件事之一:

1) 以两倍的速度播放样本(即 22kHz)。这将导致与源的异步性增加。如果我可以每隔 1 秒左右重新开始采样以防止异步变得过于明显,那将很有用。

2) 以两倍的速度播放样本。显然,不可能连续执行此操作(即无法播放尚未收集的样本)。为了解决这个问题,我打算用方波来控制回放。采样的播放速度将是方波峰值期间记录的两倍。在方波波谷期间不会听到任何声音(但仍会收集样本)。

我准备了一份 PDF 文件,在这里更详细地描述了该项目:

https://www.dropbox.com/s/8u3tz7d9hhxd3t9/Frequency%20shift%20techniques.pdf?dl=0

一位朋友帮助我使用 PortAudio 进行了一些编程。不幸的是,我们的延迟很长。我认为这可能是因为 PortAudio 的工作水平太高了。从代码来看,在我看来,PortAudio 似乎正在缓冲传入的音频流,然后进行与我上面描述的类似的修改,但实际上是对缓冲流的操作。

这根本不是我想要的。处理单元尽可能少地执行是至关重要的。参照上述条件(1)和(2),计算机要做的就是(1)不做任何操作,以两倍的速度播放样本;或 (2) 存储传入的样本,然后以两倍的速度播放它们。不应该有任何其他处理。我认为这是获得我正在寻找的极低延迟的唯一方法。

我想知道直接在 OS X 的 Core Audio 中尝试这样做会比使用 PortAudio 更好吗?这将限制平台兼容性。但低延迟比兼容性更重要。

我是否能够使用音频单元等中级服务来做我想做的事?或者我是否需要直接为 I/O Kit 等低级服务编写代码?我该怎么办?

【问题讨论】:

  • 如果您无论如何都要每秒关闭半秒,为什么延迟很重要?如果您以不同的音高合成语音并近乎实时地进行,那会好得多。这是一种常见的效果。请记住,尽管您正在与物理作斗争。在捕捉到一些完整的波形之前,您无法知道某物的音高,因此您无法毫无延迟地移动。此外,还有很多 50 到 100 美元的效果器可以为您做到这一点,而无需编写软件。
  • 我对脑干神经元的实时响应时间很感兴趣。这大约是 1ms。通过操纵波形引入 10 毫秒或更长的延迟是不好的。我可以无延迟地进行频移,类似于电唱机的工作方式。当您放慢唱片的旋转速度时,频率会下降。没有任何延迟。 Delta-sigma 声卡在 0.25ms 内完成模数转换,往返时间为 0.5ms。我想要的是让输入的样本播放得更慢。没有其他操作。以一种速率记录,然后以较低的速率输出。
  • 您会发现没有计算机音频可以在如此低的延迟下工作。您需要专用硬件。我很遗憾地说,您以如此小的延迟降低频率是错误的。对于 1 kHz 的一个波长,您需要一整毫秒。如果将其降低一个八度至 500 Hz,则仅一个波长就需要 2 毫秒。大脑对声音的反应不会这么快。您无法感知单个波长的音高。再说一次,如果你放慢采样率,那有什么意义呢?你会很快造成延迟。
  • 谢谢布拉德 - 也许我没有很好地解释自己。 PDF 中有更多详细信息:tinyurl.com/lhjguv8 我实际上是在复制 1987 年进行的一项实验。它完全使用了我描述的过程:通过以比记录速度慢两倍的速度输出样本,在接近零延迟的情况下进行频移。在当时最先进的硬件上,采样率非常低(12kHz)。 Delta-sigma 转换器在 0.25 毫秒内将模拟数字化。如果计算机只将模拟转换为数字然后再返回,则这提供了 0.5 毫秒的往返时间。因此,可以实现低于 1 毫秒的延迟。
  • 这是一篇文章的链接,该文章描述了人类以 0.01 毫秒的精度检测声音:tinyurl.com/kt26kwy 虽然您说您需要一整毫秒才能将信息记录在1kHz 的波长(几乎可以肯定感知它的时间更长),大脑可以更快地对声音做出反应。这仅适用于脑干中的神经元,而不适用于皮层中的神经元。我们真的不知道脑干神经元是如何让我们感知音高的,而这是我试图找出的事情之一。

标签: macos audio core-audio audiounit portaudio


【解决方案1】:

看起来对您来说最好的办法是使用 Max/MSP 或 Pure Data 之类的东西。这将使您避免使用基于文本的语言,并且应该有利于您快速开发您想要做的事情。 I/O 套件对于您正在尝试做的事情来说有点太低级了。

由于 max 不是基于文本的语言,因此在堆栈溢出等网站上共享代码本身有点棘手。我已经包括了一个屏幕截图。您可以复制和粘贴最大代码,但这有点难看和不合适。

这里有一个简短的描述。表示 rect~ 1 的框正在生成 Hz 的方波。快照~ 框正在捕获它吐出的值。 if 框检查它何时大于零或小于零(峰值和谷值)。如果它得到一个低谷,record~box 会记录来自麦克风盒的信号并将其存储在缓冲区中。 Groove~ 盒子是一个采样器,它在这个缓冲区中播放音频,当它从 if 盒子中接收到一个 bang 时,它会播放音频。 sig~ 框用于控制播放速率。

此外,您可能不知道这一点,但您尝试共享的 .PDF 不可用。

另一件事,如果延迟很重要,您应该了解一种称为点击火车的东西。这基本上是您在开始时发送带有单个 1 的信号的地方,以及该值通过系统所需的时间。

【讨论】:

  • 谢谢,我去看看 Max 和 Pure Data。您的图表描述了我想要做的事情。我唯一关心的是这是否真的是计算机会做的事情,或者它是否是一个抽象的描述,它会通过某种类型的模拟产生相同的结果,但没有显示出来。如果是后者,我会得到比我想要的更长的延迟。
猜你喜欢
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2021-10-26
  • 2015-08-19
  • 1970-01-01
  • 2012-06-18
  • 2013-09-30
相关资源
最近更新 更多