Как запретить iPhone 3GS фильтровать низкие частоты (<150 Гц) - PullRequest
18 голосов
/ 19 июля 2011

Я разрабатываю приложение для определения высоты звука бас-гитары на 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 Это означает, что проблема выпадения НЕ является аппаратным ограничением.Должен быть какой-то способ, которым программное обеспечение может помочь избежать этой проблемы.

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Ну, это телефон, устройство, оптимизированное для речи якобы.А устройства, оптимизированные для речи, обычно имеют какой-то НЧ-фильтр, чтобы избежать шума и искажений.

Этот фильтр, вероятно, находится на входной стороне телефона, поэтому вы можете генерировать и выводить более широкий диапазон частот., это, вероятно, аппаратный / дискретный элементный фильтр, поскольку его легко создать, используя всего несколько компонентов, и он будет работать в режиме реального времени без какой-либо нагрузки на обработку.

Я не думаю, что имеет смысл сокращатьминимумы в программном обеспечении, я знаю, я бы этого не делал, ну, для приложения DAW вы можете это сделать, но для устройства, оптимизированного для фильтрации минимумов ...

Учитывая тот факт, что разработчики ampitube могли знатьэтой проблемы и добавил дополнительный низкий прирост, чтобы попытаться восполнить ограничения на оборудование?

С другой стороны, вполне возможно выбрать разные «пути прохождения сигнала» в соответствии со сценарием использования, может быть, есть некоторые приложения для работы с os, которые могут коснуться и сказать «эй, я не голос, неt сократить мои минимумы "- если так, эта функция должна быть где-то в описании API.

0 голосов
/ 30 июля 2011

Могу ли я порекомендовать вам повторно задать этот вопрос с соответствующим заголовком (может быть, что-то вроде «как запретить iPhone фильтровать низкие частоты (<150 Гц)») и содержащим всю необходимую информацию, также вставьте в это изображение, это важная часть вопроса. вставить картинку очень просто. </p>

вы даже не заявили, что вы пытаетесь достичь.

Похоже, вы новичок на сайте, и это выглядит как очень интересный вопрос.

Но вам совсем не ясно.

Во-первых, это проблема записи или воспроизведения или обоих?

Теперь, что именно вы делаете в своем эксперименте? Западный научный метод ... выложи.

Вы генерируете статический сигнал в обратном вызове рендеринга remoteIO? Нет, похоже, что вы используете сквозную передачу, вы говорите, что добавляете белый шум в iPhone. как вы настраиваете аудиоустройство?

так что белый шум идет в iPhone прямо сейчас, и ... что теперь представляет этот график? БПФ / Спектральный анализ выхода iPhone? как дела это? Вы вводите это в какое-то графическое программное обеспечение OSX, которое может принимать данные из строки?

Кроме того, вы могли бы сделать сужение. Если вы действительно передаете звук прямо через устройство, вы не знаете, где происходит фильтрация. все, что вы знаете, может быть фильтрация в устройстве, которое генерирует белый шум, а также устройство, которое отображает графики iPhone.

как насчет генерации белого шума внутри обратного вызова рендеринга удаленного ввода / вывода?

, а затем генерировать его извне и анализировать данные, поступающие из этого обратного вызова - вы можете выполнить БПФ.

В любом случае, для входа не лучше ли подавать синусоидальные волны разных частот?

0 голосов
/ 27 июля 2011

Интересный вопрос.Я не знаю ни одного такого фильтра ... вы можете установить обратный вызов ввода на удаленном устройстве ввода-вывода и получить поток с плавающей точкой.

Я не видел никакой документации, что этот поток с плавающей точкой в ​​некотором родеуже обработано.

Я написал детектор высоты тона, который успешно выбирает ноты в нижней части моего диапазона пения (~ 80 Гц)

Возможно, почтовый индекс - что вы делаете внутри этого обратного вызова

...