我正在iPhone3GS上开发一个低音吉他音调检测应用程序。我发现我无法用RemoteIO获得低于150‘t的声音数据。然而,低音吉他可能会产生低于50 may的音调。根据报告"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;
}
为了找出根本原因,
输出数据谱如下图所示。
你可以看到150赫兹的急剧下降。
为了确定问题是在输入端还是在输出端,我更改了回调函数以忽略输入数据并输出白噪声。结果如下所示。
很清楚,在150赫兹没有下降。因此,问题应该出现在输入端。
我认为这是一个硬件限制。然而,我在同一设备上尝试了应用程序"Amplitube“,关闭了所有效果,输入白噪声并分析输出。它在150 at时没有降压。结果如下所示。
这意味着丢弃问题不是硬件限制。软件必须有一些方法来避免这个问题。
有人知道这个秘密吗?
谢谢。
发布于 2011-11-30 22:44:14
嗯,它是一部电话,一种理应为语音而优化的设备。为语音优化的设备通常有某种类型的低频截止滤波器,以避免隆隆和失真。
这个滤波器可能在电话的输入端,这就是为什么你可以产生和输出更大范围的频率,它可能是一个硬件/离散元素滤波器,因为这些滤波器很容易创建,只需使用几个组件,并且将实时工作,不会对处理造成任何影响。
我不认为在软件中降低低电平是有意义的,我知道我不会这么做,嗯,对于DAW应用程序,你可以这么做,但对于一个优化了过滤低电平的设备来说……
考虑到amplitube开发人员可能已经意识到了这个问题,并添加了额外的低boost来尝试弥补硬件限制?
另一方面,根据使用场景选择不同的“信号路径”是很有可能的,也许有一些操作系统处理应用程序可以触摸和说“嘿,我不是语音,不要降低我的低谷”-如果是这样的话,这个功能应该在api描述中的某个地方。
发布于 2011-07-27 07:57:31
这个问题很有趣。我不知道有这样的过滤器..。您可以在远程IO单元上设置输入回调,并获取浮点数流。
我还没有看到任何文档表明这个浮点流已经以某种方式被处理过了。
我已经写了一个音调检测器,它能在我的歌唱范围的低端(~80 my )成功地拾取音符。
也许post代码--你在这个回调里面做什么?
发布于 2011-07-30 16:32:24
我可以建议你重新问这个问题,用一个合适的标题(也许是“如何防止iPhone过滤低频(<150 is )”),并包含所有必要的信息,也坚持在图片中,这是问题的重要部分。嵌入一张图片非常容易。
你甚至还没有说明你想要实现的是什么。
看起来你是第一次访问这个网站,这看起来是一个非常有趣的问题。
但是你一点也不清楚。
首先,这是录音或回放的问题,还是两者都有?
现在,你在你的实验中到底在做什么?西方的科学方法。把它铺开。
你在你的remoteIO渲染回调中生成静态?不,听起来像是你在使用passthrough,你说你在iPhone中放入白噪声。您是如何设置音频单元的?
所以白噪声直接进入iPhone,然后...那么这张图代表了什么呢?iPhone输出的快速傅立叶变换/频谱分析?你是怎么做到的?你把它输入到一些OSX绘图软件中,它可以从行中接受输入?
另外,你也可以缩小范围。如果你真的通过设备传递声音,你不知道过滤发生在哪里。正如您所知道的,在生成白噪声的设备以及绘制iPhone输出的设备中可能会发生过滤。
如何从远程I/O渲染回调中生成白噪声?
然后在外部生成它,并分析从该回调中到达的数据--您可以执行FFT。
不管怎样,输入不同频率的正弦波不是更好吗?
https://stackoverflow.com/questions/6745303
复制相似问题