18

我正在 iphone 3GS 上开发一个低音吉他音高检测应用程序。我发现我无法使用 RemoteIO 获得低于 150Hz 的声音数据。然而,低音吉他可能会产生低于 50hz 的音调。根据报告《iPhone 4 Headset Input Frequency Response》,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 的耳机重定向到正在运行我的程序的 iPhone3Gs。
  4. 使用 iRig 将 iPhone 的输出重定向回 Mac。
  5. 在 Mac 上记录数据。 在此处输入图像描述 输出数据频谱如下图所示。 在此处输入图像描述

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

为了确定问题是在输入端还是输出端,我将回调函数更改为忽略输入数据并输出白噪声。这是结果。 在此处输入图像描述 非常清楚,在 150 Hz 时没有下降。因此问题应该在输入端。

我认为这是硬件限制。但是我在同一台设备上尝试了应用程序“Amplitube”,关闭所有效果,输入白噪声并分析输出。它在 150Hz 时没有下降。这是结果。iPhone 3gs 上的放大管频率响应 这意味着脱落问题不是硬件限制。软件必须有某种方法可以避免这个问题。

有谁知道其中的秘密?

谢谢。

4

3 回答 3

2

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

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

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

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

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

于 2011-11-30T14:44:14.153 回答
0

我可以建议您用适当的标题重新提出这个问题(可能类似于“如何防止 iPhone 过滤低频(< 150Hz)”)并包含所有必要的信息,并贴上那张图片,那是问题的重要部分。嵌入图片非常容易。

您甚至没有说明您要完成的工作。

看起来您是该网站的新手,而且看起来是一个非常有趣的问题。

但你一点都不清楚。

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

现在,您在实验中到底在做什么?西方的科学方法……把它摆出来。

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

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

另外,您可以缩小范围。如果您确实将声音直接通过设备,则您不知道过滤发生在哪里。据您所知,产生白噪声的设备以及绘制 iPhone 输出图形的设备中可能会发生过滤。

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

然后在外部生成它并分析从这个回调中到达的数据——你可以执行 FFT。

无论如何,对于输入,您最好输入不同频率的正弦波吗?

于 2011-07-30T08:32:23.543 回答
0

有趣的问题。我不知道有任何此类过滤器...您可以在远程 IO 单元上设置输入回调并获取浮点流。

我还没有看到任何文件表明这个浮动流已经以某种方式处理过。

我写了一个音高检测器,它成功地在我的歌唱范围(~80Hz)的低端拾取音符

也许邮政编码 - 你在这个回调中做什么?

于 2011-07-26T23:57:31.493 回答