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

时间:2011-07-19 09:52:44

标签: iphone core-audio audiounit

我正在开发iphone 3GS上的低音吉他音高检测应用程序。 我发现使用RemoteIO无法获得低于150Hz的声音数据。 然而,低音吉他可能会产生低于50hz的音调。 根据报告“iPhone 4耳机输入频率响应”,http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/ 在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;
}

确定根本原因

  1. 我修改了我的回调函数,只是绕过输入数据输出。
  2. 使用Mac产生白噪声
  3. 使用iRig将信号从Mac的耳机重定向到运行我程序的iPhone3G。
  4. 使用iRig将iPhone的输出重定向回Mac。
  5. 在Mac上记录数据。 enter image description here 输出数据频谱如下图所示。 enter image description here
  6. 你可以看到150Hz的急剧下降。

    为了确定问题是在输入侧还是输出侧,我改变了回调函数以忽略输入数据并输出白噪声。这是结果。 enter image description here 很清楚,150赫兹没有下降。因此问题应该在输入端。

    我认为这是硬件限制。 但是,我在同一设备上尝试了“Amplitube”应用程序,关闭所有效果,输入白噪声并分析输出。它在150Hz时没有下降。结果如下。Amplitube frequency response on iPhone 3gs 这意味着掉线问题不是硬件限制。软件可以通过某种方式来避免这个问题。

    有谁知道这个秘密?

    感谢。

3 个答案:

答案 0 :(得分:2)

嗯,这是一部手机,据说可以为语音优化的设备。针对语音优化的设备通常具有某种LF截止滤波器,以避免隆隆声和失真。

这个滤波器可能位于手机的输入端,这就是为什么你可以生成和输出更广泛的频率,它可能是一个硬件/离散元素滤波器,因为这些只使用少量组件很容易创建并且会在没有任何处理压力的情况下实时工作。

我认为在软件中削减低点是不合理的,我知道我不会这样做,嗯,对于DAW应用程序,你可以做到这一点,但对于一个优化过滤低点的设备...

考虑到事实上,Amplitube开发人员可能已经意识到这个问题,并且增加了额外的低升压以尝试弥补硬件限制?

另一方面,很可能根据使用场景选择不同的“信号路径”,也许有一些操作系统可以触摸并说“嘿,我不是声音,不要削减我的“如果是这样,这个特征应该在api描述的某个地方。

答案 1 :(得分:0)

有趣的问题。我不知道有任何这样的过滤器...你可以在远程IO单元上设置一个输入回调并获得一个浮动流。

我还没有看到任何关于此浮动流已经以某种方式处理过的文档。

我写了一个音高探测器,可以在我的演唱范围(~80Hz)的低端成功拾取音符

也许邮寄代码 - 你在回调中做了什么?

答案 2 :(得分:0)

我是否可以建议您重新提出这个问题,并提供相应的标题(可能类似于&#39;如何防止iPhone过滤低频(<150Hz)&#39;)并包含所有必要的信息,也坚持在那张照片中,这是问题的一个重要部分。它很容易嵌入图片。

你甚至没有说明你想要完成的是什么。

看起来你是这个网站的新手,它看起来像一个非常有趣的问题。

但你一点也不清楚。

首先,这是录制或播放的问题,还是两者兼而有之?

现在,你在实验中究竟做了什么?西方的科学方法......把它解决。

您是否在remoteIO渲染回调中生成静态?不,听起来你正在使用passthrough,你说你正在把白噪声放入iPhone。你是如何设置你的音频单元的?

所以白噪声直接进入iPhone,然后......现在该图表代表什么?对iPhone输出进行FFT /频谱分析?你是怎么做到的?您可以将其输入某些OSX图形软件,该软件可以从线路输入输入?

另外,你可以缩小范围。如果您确实通过设备传递声音,则无法知道过滤的位置。尽管如此,可能会在产生白噪声的设备中进行过滤,以及绘制iPhone输出的设备。

如何从远程I / O渲染回调中生成白噪声?

然后在外部生成它并分析从此回调中到达的数据 - 您可以执行FFT。

无论如何,输入不会更好地用不同频率的正弦波进行输入吗?