gpt4 book ai didi

iphone - 如何防止iPhone 3GS过滤低频(<150Hz)

转载 作者:行者123 更新时间:2023-12-03 18:21:03 35 4
gpt4 key购买 nike

我正在 iPhone 3GS 上开发低音吉他音高检测应用程序。我发现使用 RemoteIO 无法获取低于 150Hz 的声音数据。然而,低音吉他可能会产生低于 50hz 的音调。根据报告《iPhone 4耳机输入频率响应》,http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/低于 150 Hz 时急剧下降。

这里展示了我如何设置 AudioUnit。

// set audio unit
{
// create AudioUnit
{
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

AudioComponent comp = AudioComponentFindNext(NULL, &desc);
OSAssert(AudioComponentInstanceNew(comp, &m_AudioUnit));
}

//enable input on the remote I/O unit (output is default enabled, but input is not)
{
UInt32 one = 1;
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input, 1, &one, sizeof(one)));
}

//set render callback function
{
AURenderCallbackStruct callbackInfo;
callbackInfo.inputProc=staticPerformThru;
callbackInfo.inputProcRefCon=this;

OSAssert(AudioUnitSetProperty(m_AudioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0, &callbackInfo, sizeof(callbackInfo)));

}

//set in/output format
{
CAStreamBasicDescription outFormat;
outFormat.SetAUCanonical(channels, false);
outFormat.mSampleRate = sampleRate;
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, sizeof(outFormat)));
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &outFormat, sizeof(outFormat)));
}

//Initialize remote I/O unit
OSStatus r=AudioUnitInitialize(m_AudioUnit);
OSAssert(r);
}
//start audio output
OSAssert(AudioOutputUnitStart(m_AudioUnit));

这是回调函数。

OSStatus AudioThruWorker::staticPerformThru(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{

AudioUnitRender(((AudioThruWorker*)inRefCon)->m_AudioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

//Detect pitch here...

return 0;
}

要确定根本原因,

  1. 我修改了回调函数以绕过输入数据进行输出。
  2. 使用 Mac 生成白噪声
  3. 使用 iRig 将信号从 Mac 耳机重定向到正在运行我的程序的 iPhone3G。
  4. 使用 iRig 将 iPhone 的输出重定向回 Mac。
  5. 在 Mac 上记录数据。 enter image description here输出数据频谱如下图所示。 enter image description here

您可以看到在 150Hz 处急剧下降。

为了确定问题是在输入端还是输出端,我更改了回调函数以忽略输入数据并输出白噪声。这是结果。 enter image description here非常明显,150 Hz 时没有下降。因此问题应该出在输入端。

我认为这是硬件限制。然而,我在同一设备上尝试了应用程序“Amplitube”,关闭所有效果,输入白噪声并分析输出。 150Hz 时无下降。这是结果。 Amplitube frequency response on iPhone 3gs这意味着丢失问题不是硬件限制。软件必须有某种方法可以避免这个问题。

有人知道这个 secret 吗?

谢谢。

最佳答案

嗯,它是一部电话,据说是一种针对语音进行优化的设备。针对语音进行优化的设备通常具有某种低频截止滤波器,以避免隆隆声和失真。

该滤波器可能位于手机的输入侧,这就是为什么您可以生成和输出更广泛的频率,它可能是一个硬件/离散元件滤波器,因为仅使用几个组件即可轻松创建这些滤波器并且将实时工作,不会对处理产生任何压力。

我认为在软件中降低低音是没有意义的,我知道我不会这样做,好吧,对于 DAW 应用程序来说,你可以这样做,但是对于经过优化以过滤低音的设备......

考虑到 amplitube 开发人员可能已经意识到这个问题并添加了额外的低升压来尝试弥补硬件限制?

另一方面,很可能根据使用场景选择不同的“信号路径”,也许有一些操作系统处理应用程序可以触摸并说“嘿,我不是语音,别剪我的” lows” - 如果是这样,这个功能应该在 api 描述中的某个地方。

关于iphone - 如何防止iPhone 3GS过滤低频(<150Hz),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745303/

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