10

我是 CoreAudio 的新手,我想通过使用 CA 的扬声器输出具有给定频率和幅度的简单正弦波和方波。我不想使用声音文件,因为我想合成声音。

我需要做什么?你能给我一个例子或教程吗?谢谢。

4

5 回答 5

15

上一个答案有很多错误。我,传奇人物:-) James McCartney,而不是 James Harkins 编写了 sinewavedemo,我还编写了 SuperCollider,这就是 audiosynth.com 网站的内容。我现在也在 Apple 工作,负责 CoreAudio。sinewavedemo 使用 CoreAudio,因为它使用 CoreAudio.framework 中的 AudioHardware.h 作为播放声音的方式。

您不应该使用 sinewavedemo。这是非常古老的代码,它对音频硬件的缓冲区布局做出了危险的假设。现在播放您正在生成的声音的最简单方法是使用 AudioQueue,或者使用带有渲染回调集的输出音频单元。

于 2011-03-21T15:35:37.107 回答
2

没有文件的最好和最简单的方法是准备一个单周期缓冲区,其中包含一个波的周期(这在技术上称为波表)

在 CoreAudio 线程调用的播放函数中,用从波形缓冲区读取的样本填充输出缓冲区。

但是请注意,您将很快面临两个问题: - 对于正弦波,如果播放频率不是所需正弦频率的整数倍,如果您想要获得良好的质量,您可能需要实现插值器。仅使用整数指针将产生显着水平的谐波噪声。

  • 对于方波,请避免仅对具有 +1 / -1 值的数组进行编程。这样的信号没有带宽限制,并且会混叠很多。不要忘记方波的频谱实际上是无限的!

要获得良好的信号生成算法,请查看 musicdsp.org,这可能是最好的资源之一

于 2015-01-01T09:24:53.437 回答
1

一般来说,您是音频编程的新手吗?作为一个起点,我会检查

http://www.audiosynth.com/sinewavedemo.html

这是传奇人物James Harkins 的最小 osx 正弦波实现。请注意,它根本不使用 CoreAudio。

如果您特别想将 CoreAudio 用于您的正弦波,您需要创建一个输出单元(iphone 上的 RemoteIO,osx 上的 AUHAL)并提供一个输入回调,您几乎可以使用上面示例中的代码。查看

http://developer.apple.com/mac/library/technotes/tn2002/tn2091.html

CoreAudio 的好处主要是,用你的正弦波链接其他效果,为 Logic 等主机编写插件并为它们提供接口,为可以链接在一起的插件编写一个主机(如 Logic)。

如果您不打算编写插件或托管插件,那么 CoreAudio 可能实际上并不适合您。但是使用 CoreAudio 最好的事情之一是,一旦你的正弦波回调工作,很容易添加效果,或者将多个正弦波混合在一起

为此,您需要将输出单元放在一个图表中,您可以在该图表中添加效果、混音器等。

这是设置图表的一些帮助http://timbolstad.com/2010/03/16/core-audio-getting-started-pt2/

它并不像看起来那么困难。Apple 为许多事情(/Developer/Examples/CoreAudio/PublicUtility)提供了 C++ 帮助程序类,即使您不想使用 C++(您不必!)它们也可以成为 CoreAudio API 的有用指南。

于 2010-06-10T23:17:00.627 回答
1

如果您不是实时执行此操作,则使用sin()函数 frommath.h不是一个坏主意。只需在播放时预先使用 sin() 填充所需的任意数量的样本,只需将其发送到音频缓冲区即可。如果您实时执行此操作,每次采样调用一次 sin() 可能会非常慢,使用插值波表查找方法要快得多,但生成的声音不会像频谱那样纯净。

于 2012-12-27T19:09:02.970 回答
0

Addison-Wesley Professional (ISBN-10: 0-321-63684-8) 出版的 Adamson/Avila “Learning Core Audio” 一书的第 7 章中有一个很好且有据可查的正弦波播放器代码示例:

http://www.informit.com/store/learning-core-audio-a-hands-on-guide-to-audio-programming-9780321636843

这是一个相当新的出版物(2012 年),准确地解决了这个问题。这只是一个起点,但却是一个有价值的起点。

顺便提一句。在完成这个基本课程(涉及一些数学)之前,不要跳到图表上。

关于示例代码,我经常使用一种快速有效的方法来处理预填充的正弦波查找表,该表的成员数与采样率一样多,对于 44100 Hz,该表的大小为 44100。换句话说,周期长度等于采样率。在许多情况下,这在速度和质量之间提供了可接受的折衷。您可以使用程序对其进行初始化。
如果您生成浮点样本(在 OSX 中是默认设置)并使用数学函数,请使用sinf()而不是(float)sin()。渲染回调的内部循环周期中的提升总是资源昂贵的。常量的重复乘法也是如此,例如2.0*M_PI,这在代码示例中很常见。

于 2015-01-08T14:47:45.990 回答