Как запретить iPhone 3GS фильтровать низкие частоты (<150 Гц)

Я разрабатываю приложение для определения высоты звука бас-гитары на iphone 3GS. Я обнаружил, что не могу получить звуковые данные ниже 150 Гц с помощью RemoteIO. Однако бас-гитара может воспроизводить тоны ниже 50 Гц. Согласно отчету «Амплитудно-частотная характеристика гарнитуры 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

Вы можете увидеть резкий спад на частоте 150 Гц.

Чтобы определить, является ли проблема на стороне ввода или стороны вывода, я изменил функцию обратного вызова, чтобы игнорировать входные данные и выводить белый шум. Вот результат. enter image description here Совершенно ясно, что на 150 Гц перепада нет. Следовательно, проблема должна быть на стороне ввода.

Я думал, что это аппаратное ограничение. ОДНАКО я попробовал приложение "Amplitube" на том же устройстве, отключил все эффекты, ввел белый шум и проанализировал вывод. У него нет падения на 150 Гц. Вот результат. Amplitube frequency response on iPhone 3gs Это означает, что проблема сброса НЕ связана с аппаратным ограничением. Должен быть какой-то способ, которым программа может помочь избежать этой проблемы.

Кто-нибудь знает секрет?

Спасибо.

18
задан Albert 2 August 2011 в 23:36
поделиться