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

如何防止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

我正在iphone 3GS上开发一个低音吉他音高检测应用程序。 我发现使用RemoteIO无法获得低于150Hz的声音数据。 然而,低音吉他可能产生低于50hz的音调。 根据“iPhone 4耳机输入频率响应”报告, 在150赫兹以下有一个急剧下降

这里显示了如何设置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;
}
要找出根本原因

  • 我修改了回调函数,将输入数据绕过输出
  • 使用Mac生成白噪声
  • 使用iRig将信号从Mac的耳机重定向到运行我的程序的iPhone3Gs
  • 使用iRig将iPhone的输出重定向回Mac
  • 在Mac上记录数据。 输出数据频谱如下图所示。
  • 你可以看到150Hz时的急剧下降

    为了确定问题是在输入端还是输出端,我将回调函数更改为忽略输入数据并输出白噪声。结果如下。 很明显,在150 Hz时没有下降。因此,问题应该在输入端解决

    我认为这是一个硬件限制。 然而,我在同一台设备上尝试了应用程序“Amplicate”,关闭所有效果,输入白噪声并分析输出。它在150Hz时没有下降。结果如下。 这意味着下降问题不是硬件限制。软件一定有办法避免这个问题

    有人知道这个秘密吗


    谢谢。

    有意思的问题。我不知道有任何这样的过滤器。。。您可以在远程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有一个“测量模式”。但是我还没有测试过。