繁体   English   中英

如何在C ++中为PCM缓冲音频添加声音效果

[英]How to add sound effects to PCM buffered audio in C++

我有一个带有PCM原始音频数据的int16_t[]缓冲区,我想在其中应用一些效果(如回声,混响,增益...)。

我以为SoX或类似的东西可以帮我解决这个问题,但是SoX仅适用于文件和其他支持添加声音效果的类似库,似乎仅在播放声音时才添加效果。 因此,我的问题是我想将这些效果应用于样本到我的缓冲区中而不播放它们。

我从未使用过音频,但是通过阅读有关PCM数据的知识,我了解到可以将增益乘以每个采样值。 但是我正在寻找可以直接在缓冲区中使用的任何库或相对简单的算法,以应用声音效果。

如果您知道要寻找的是什么,我敢肯定有很多解决问题的方法,但这是我第一次使用音频“处理”功能,我迷失了,如您所见。

您的int16_t[]缓冲区包含一系列样本。 它们代表瞬时振幅水平。 可以将它们视为在相应时刻施加到扬声器的电压。 它们是带符号的数字,其值的范围在(-32767,32767)之间。恒定的零流表示静默;例如,恒定的-32000流也表示静默,但最终会烧坏您的扬声器线圈。数组中的代表时间,每个样本的值代表电压。

如果要将两个样本流混合在一起(例如,应用a声),您将获得一个带有the声的样本流(录制鸟或其他东西)。 然后,您可以逐个样本添加两个声音。

您可以通过获取原始声音缓冲区,降低其音量(也许通过将所有采样除以一个常数)并将其添加回原始流中,但将采样移至十分之一秒来实现超级俗气的混响效果。值得的数组位置。

这些是音频处理的基础。 事情确实变得非常复杂。 这个领域被称为“数字信号处理”,关于这一主题有很多书籍。

对于像我这样的人,有兴趣学习与C ++音频处理有关的DSP,我想分享一下我的研究成果和观点,也许可以为您节省一些时间:)

在尝试了几种DSP库之后,我终于找到了C ++(STK)综合工具包 ,这是一个开放源代码库,提供了简单明了的界面和易于理解的代码,您可以深入了解各种基本DSP算法。

因此,我建议所有刚起步并且没有任何经验的人来看看这个库。

您可以通过破解音频缓冲区并尝试通过简单的数学运算来实现诸如增益和阈值之类的效果,或者使用适当的DSP算法对其进行校正来实现。 如果您希望纠正它,我建议您使用Speex库。 它是开源的,并且经过了良好的测试。 www(dot)speex(dot)org。 该代码应以最小的努力在MSVC或Linux上编译。 这是通过适当的DSP技术获得高质量音频代码的最快方法。 您的代码看起来像..请阅读AEC示例。

 st = speex_echo_state_init(NN, TAIL);
 den = speex_preprocess_state_init(NN, sampleRate);
 speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);
 speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st);

您需要设置状态,代码testecho包括这些状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM