为 DSP 目的在 C++ 中处理音频数据
Posted
技术标签:
【中文标题】为 DSP 目的在 C++ 中处理音频数据【英文标题】:Manipulating audio data in C++ for DSP purposes 【发布时间】:2010-12-09 15:21:32 【问题描述】:我希望这个问题不要太含糊。我正在尝试从这个 Xcode 项目中的音频缓冲区获取信息并使用它来执行一些 DSP。
framebuffer 指向我想传递给函数的值数组,循环遍历并最终插入原始缓冲区。该方法将起到声音过滤器或效果器的作用。
也许为了让我的问题尽可能清晰,我们能否获得一个子例程示例,该示例将向缓冲区中的每个样本添加 0.25?
到目前为止的代码如下:
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
EAGLView *remoteIOplayer = (EAGLView *)inRefCon;
for (int i = 0 ; i < ioData->mNumberBuffers; i++)
//get the buffer to be filled
AudioBuffer buffer = ioData->mBuffers[i];
short *frameBuffer = (short*)buffer.mData;
for (int j = 0; j < inNumberFrames; j++)
// get NextPacket returns a 32 bit value, one frame.
frameBuffer[j] = [[remoteIOplayer inMemoryAudioFile] getNextPacket];
EAGLView* thisView = [[EAGLView alloc] init];
[thisView DoStuffWithTheRecordedAudio:ioData];
[thisView release];
return noErr;
【问题讨论】:
看起来像 Objective-C,而不是 C++? 是的,里面有一点 Objective-C,但音频是 C++。 【参考方案1】:在 ios 设备上尝试在音频回调中执行 UI 或 Open GL 是一个坏主意。您需要使用队列或 fifo 等将回调和 UI 执行解耦。
尝试在实时音频的内部循环中进行 Objective C 消息传递在设备性能方面也可能是一个非常糟糕的主意。坚持使用纯 C/C++ 在性能关键的内部循环中效果更好。
此外,向音频数据添加一个常数可能只会导致听不见的直流偏移。
【讨论】:
以上是关于为 DSP 目的在 C++ 中处理音频数据的主要内容,如果未能解决你的问题,请参考以下文章