为 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++ 中处理音频数据的主要内容,如果未能解决你的问题,请参考以下文章

用于音频信号处理的 DSP 和传感器信号处理之间是不是存在根本区别?

初学者用 Python 扩展 C(特别是 Numpy)

音频编程、声音处理和 DSP

从 Python 中捕获音频

matlab中的实时音频

录制音频数据并将其发送到 c++ 函数