Подтвердить что ты не робот

Как предотвратить 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;
}

Чтобы определить основную причину,

  • Я изменил функцию обратного вызова, чтобы просто обходить входные данные для вывода.
  • Использование Mac для генерации белого шума
  • Используйте iRig для перенаправления сигнала с гарнитуры Mac на iPhone3G, в которой запущена моя программа.
  • Используйте iRig для перенаправления вывода iPhone обратно на Mac.
  • Запись данных на Mac. enter image description here Спектр выходных данных показан ниже. enter image description here

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Считается, что разработчики amplitube, возможно, знали об этой проблеме и добавили слишком низкий уровень, чтобы попытаться сделать это для ограничения оборудования?

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

Ответ 2

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

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

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

Может быть, почтовый код - что вы делаете внутри этого обратного вызова?

Ответ 3

Могу ли я рекомендовать вам повторить этот вопрос с соответствующим заголовком (возможно, что-то вроде "как предотвратить фильтрацию фильтров на низких частотах (< 150Hz)" ) и содержащий всю необходимую информацию, также придерживаться этого изображения, что является важной частью вопроса. это очень просто вставить изображение.

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

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

Но вы не совсем поняли.

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

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

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

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

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

как генерировать белый шум из удаленного обратного вызова рендеринга ввода-вывода?

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

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