我有一个带有PCM原始音频数据的int16_t[]
缓冲区,我想在其中应用一些效果(如回声,混响,增益......)。
我认为SoX或者类似的东西对我来说可以解决这个问题,但SoX只适用于文件和支持添加声音效果的其他类似库似乎只在播放声音时添加效果。所以我的问题是我想将样本应用到我的缓冲区而不播放它们。
我从未使用音频,但是阅读PCM数据我已经了解到我可以应用增益乘以每个样本值,例如。但我正在寻找任何库或相对简单的算法,我可以直接在缓冲区中使用它来获得应用的声音效果。
如果你知道要找什么,我确信我的问题有很多解决方案,但这是我第一次使用音频“处理”而且我迷路了,你可以看到。
答案 0 :(得分:1)
您的int16_t[]
缓冲区包含一系列样本。它们代表瞬时振幅水平。将它们视为在相应时刻应用于扬声器的电压。它们是带符号范围内的数字(-32767,32767)。常量零流意味着静音。常量-32000(例如)的流也意味着静音,但它最终会烧毁你的扬声器线圈。在数组中表示时间,每个样本的值代表电压。
如果你想将两个样本流混合在一起,例如应用一个啁啾声,你会得到一个带有啁啾声的样本流(记录一只鸟或什么的)。然后,您可以按样本添加两个声音。
你可以通过获取原始声音缓冲区,降低音量(可能将所有样本除以常数),并将其添加回原始流,但将样本移动到十分之一来进行超级俗气的混响效果第二个阵列位置。
这些是音频处理的基础知识。事情变得非常复杂。这个领域被称为“数字信号处理”,有很多关于这个主题的书籍。
答案 1 :(得分:1)
对于像我这样的人,有兴趣学习与C ++音频处理相关的DSP,我想分享我的小研究成果和意见,也许可以节省你一些时间:)
在尝试了几个DSP库之后,我终于找到了Synthesis ToolKit in C++ (STK),这是一个开源库,提供简单明了的界面和易于理解的代码,您可以深入了解各种基本的DSP算法。< / p>
所以,我推荐给那些刚开始没有经验的人来看看这个图书馆。
答案 2 :(得分:0)
您可以通过黑客攻击音频缓冲区并尝试使用简单的数学运算来执行增益和阈值等效果,或使用正确的DSP算法进行正确操作。如果您希望这样做,我建议您使用Speex库。它是开源的,经过充分测试。 www(点)speex(点)组织。代码应该在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包括这些。