gpt4 book ai didi

iphone - 计算音频功率峰值 iOS

转载 作者:行者123 更新时间:2023-12-03 00:01:27 27 4
gpt4 key购买 nike

由于渐进的见解而编辑了问题:-)

我正在创建一个正在收听音频输入的应用程序。
我希望它计算峰值。 (峰值将在大约 10 Hz 的最大频率处。)

经过大量搜索,我最终使用了 AudioQueue 服务,因为它可以为我提供原始输入数据。
我正在使用 SpeakHere 示例的精简版本(不播放),但不是简单地将缓冲区写入文件系统,我想查看单个样本数据。

认为我现在走在正确的轨道上,但我不明白如何使用缓冲区。
我正在尝试隔离一个样本的数据。因此,以下函数中的 for 循环是否有意义,并且
我应该在那里放什么来获得一个 sample ?

void AQRecorder::MyInputBufferHandler( void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription* inPacketDesc)
{
// AudioQueue callback function, called when an input buffers has been filled.

AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {
/* // write packets to file
XThrowIfError(AudioFileWritePackets(aqr->mRecordFile,FALSE,inBuffer->mAudioDataByteSize,inPacketDesc,aqr->mRecordPacket,&inNumPackets,inBuffer->mAudioData),
"AudioFileWritePackets failed");*/

SInt16 sample;
for (UInt32 sampleIndex=0; sampleIndex < inNumPackets; ++sampleIndex) {


// What do I put here to look at one sample at index sampleIndex ??


}
aqr->mRecordPacket += inNumPackets;
}

// if we're not stopping, re-enqueue the buffe so that it gets filled again
if (aqr->IsRunning())
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL),
"AudioQueueEnqueueBuffer failed");
} catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}

(也许我不应该删除这么多原来的问题......政策是什么?)

最初我正在考虑使用 AurioTouch 示例,但正如评论中指出的那样,它使用吞吐量,我只需要输入。这也是一个比 SpeakHere 复杂得多的例子。

最佳答案

您可能希望对峰值功率水平应用某种平滑,也许是 IIR 滤波器,例如:

x_out = 0.9 * x_old + 0.1 * x_in;
:
x_old = x_out;

我没有使用过这个功能,所以我不知道它是否能满足你的所有需求。如果没有,您可以降低一个级别并使用 RemoteIO 音频单元,并使用“输入回调”捕捉声音(与扬声器渴望数据时发生的渲染回调相反)

请注意,在输入回调中,您必须创建自己的缓冲区,不要仅仅因为您将缓冲区指针作为最后一个参数而认为它指向有效的东西。它没有。

无论如何,您可以使用一些 vDSP 函数来获得整个缓冲区的向量的幅度平方(1024 个浮点数或任何您的缓冲区大小/流格式)

然后你可以自己平滑

关于iphone - 计算音频功率峰值 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6212880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com