如何防止iPhone 3GS过滤低频(<;150Hz)
我正在iphone 3GS上开发一个低音吉他音高检测应用程序。 我发现使用RemoteIO无法获得低于150Hz的声音数据。 然而,低音吉他可能产生低于50hz的音调。 根据“iPhone 4耳机输入频率响应”报告, 在150赫兹以下有一个急剧下降 这里显示了如何设置AudioUnit如何防止iPhone 3GS过滤低频(<;150Hz),iphone,core-audio,audiounit,Iphone,Core Audio,Audiounit,我正在iphone 3GS上开发一个低音吉他音高检测应用程序。 我发现使用RemoteIO无法获得低于150Hz的声音数据。 然而,低音吉他可能产生低于50hz的音调。 根据“iPhone 4耳机输入频率响应”报告, 在150赫兹以下有一个急剧下降 这里显示了如何设置AudioUnit // set audio unit { // create AudioUnit { AudioComponentDescription desc; desc.com
// 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;
}
要找出根本原因
谢谢。有意思的问题。我不知道有任何这样的过滤器。。。您可以在远程IO单元上设置一个输入回调,并获得一个浮点流 我还没有看到任何文档表明这个float流在某种程度上已经被处理过 我已经写了一个音调检测器,它成功地在我的歌唱范围的低端(~80Hz)拾取音符
可能是post code——你在这个回调中做什么?我可以建议你重新问这个问题,用一个合适的标题(可能像“如何防止iPhone过滤低频(<150Hz)”,并包含所有必要的信息,也请贴在图片上,这是问题的一个重要部分。嵌入图片非常容易 你甚至还没有说你想完成什么 看起来你是这个网站的新手,这是一个非常有趣的问题 但你一点也不清楚 首先,这是记录或回放的问题,还是两者都有问题 现在,你的实验到底在做什么?西方科学方法。。。把它摆出来 是否在remoteIO渲染回调中生成静态?不,这听起来像是你在使用passthrough,你说你在iPhone中加入了白噪声。您如何设置音频单元 所以白噪音直接进入iPhone,然后。。。现在这个图代表什么?iPhone输出的FFT/频谱分析?你是怎么做到的?你把它输入到一些OSX绘图软件中,可以从输入行中获取输入 另外,你可以缩小范围。如果你确实是通过设备传递声音,你不知道过滤发生在哪里。据你所知,在产生白噪声的设备以及绘制iPhone输出图形的设备中可能会出现过滤 如何从远程I/O渲染回调内部生成白噪声 然后从外部生成它并分析从这个回调中得到的数据--您可以执行FFT
不管怎样,对于输入来说,输入不同频率的正弦波不是更好吗?嗯,这是一款手机,一款据说是为语音而优化的设备。为语音优化的设备通常有某种LF截止滤波器,以避免隆隆声和失真 该滤波器可能位于手机的输入端,这就是为什么您可以生成和输出更大范围的频率,它可能是一个硬件/离散元件滤波器,因为这些滤波器很容易创建,只需使用几个组件,并且可以实时工作,而不会对处理造成任何压力 我不认为削减软件的低成本是有意义的,我知道我不会这么做,好吧,对于DAW应用程序,你可以这么做,但对于一个优化为过滤低成本的设备 考虑到amplitube开发人员可能已经意识到这个问题,并添加了额外的低增压,以尝试弥补硬件限制
另一方面,很有可能根据使用场景选择不同的“信号路径”,也许有一些操作系统手柄应用程序可以触摸并说“嘿,我不是语音,不要降低我的音量”——如果是这样,这个功能应该在api描述中的某个地方 我将白噪声发送到iPhone3GS,然后记录程序和放大器的输出。我的程序只创建一个RemoteIO音频单元,并将输入重定向到输出。这里是比较图:我的输出似乎从250赫兹下降。。。放大管是扁平的。。。“这里没什么可看的。”皮卡萨索里说,忘了把它公之于众。如果你问这是一个单独的问题,你能试试这个吗?从这里通过评论链接到它。你到底发现问题了吗?我很好奇发生了什么事。对不起,还没有。我想这是由iOS 4.x的限制造成的。我知道iOS 5有一个“测量模式”。但是我还没有测试过。