Как запретить iPhone 3GS фильтровать низкие частоты ( < 150 Гц)
Я разрабатываю приложение для определения высоты звука бас-гитары на iPhone3GS. Я обнаружил, что не могу получить звуковые данные ниже 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.Спектр выходных данных показан на рисунке ниже.
Вы можете увидеть резкое падение на 150 Гц.
Чтобы определить, является ли проблема на входной или выходной стороне, я изменил функцию обратного вызова, чтобы игнорировать входные данные и выводить белый шум. Вот результат. Очень ясно, что при 150 Гц НЕТ падения. Поэтому проблема должна быть на стороне ввода.
Я думал, что это аппаратное ограничение. ОДНАКО я попробовал приложение "Amplitube" на одном устройстве, отключил все эффекты, ввел белый шум и проанализировал вывод. Он не имеет падения на 150 Гц. Вот результат.Это означает, что проблема выпадения НЕ является аппаратным ограничением. Должен быть какой-то способ, которым программное обеспечение может сделать, чтобы избежать проблемы.
Кто-нибудь знает секрет?
Благодарю.
3 ответа
Ну, это телефон, устройство, оптимизированное для речи якобы. А устройства, оптимизированные для речи, обычно имеют какой-то фильтр низких частот, чтобы избежать грохота и искажений.
Этот фильтр, вероятно, находится на входной стороне телефона, поэтому вы можете генерировать и выводить более широкий диапазон частот, это, вероятно, аппаратный / дискретный элементный фильтр, поскольку его легко создать, используя всего несколько компонентов, и он будет работать в режиме реального времени без какой-либо нагрузки на обработку.
Я не думаю, что имеет смысл сокращать минимумы в программном обеспечении, я знаю, что я бы этого не делал, ну, для приложения DAW вы можете это сделать, но для устройства, оптимизированного для фильтрации минимумов...
Учитывая тот факт, что разработчики ampitube могли знать об этой проблеме и добавили слишком низкое усиление, чтобы попытаться компенсировать аппаратные ограничения?
С другой стороны, вполне возможно выбрать разные "пути прохождения сигнала" в соответствии со сценарием использования, может быть, есть некоторые приложения для работы с дескрипторами, к которым можно прикоснуться и сказать "эй, я не голос, не снижай свои минимумы" - Если это так, эта функция должна быть где-то в описании API.
Интересный вопрос. Я не знаю ни одного такого фильтра... вы можете установить обратный вызов ввода на удаленном устройстве ввода-вывода и получить поток с плавающей точкой.
Я не видел никакой документации, что этот поток в некотором роде уже обработан.
Я написал детектор высоты тона, который успешно собирает ноты в нижней части моего диапазона пения (~80 Гц)
Может быть, почтовый индекс - что вы делаете внутри этого обратного вызова?
Могу ли я порекомендовать вам повторно задать этот вопрос с соответствующим заголовком (может быть, что-то вроде "как запретить iPhone фильтровать низкие частоты ( < 150 Гц)") и содержащим всю необходимую информацию, также приклейте к этой картинке, то есть важная часть вопроса. встроить картинку очень легко.
Вы даже не заявили, что вы пытаетесь достичь.
Похоже, вы новичок на сайте, и это выглядит как очень интересный вопрос.
Но вам не совсем ясно.
Во-первых, это проблема записи или воспроизведения или обоих?
Теперь, что именно вы делаете в своем эксперименте? Западный научный метод... выложи.
Вы генерируете статический сигнал в вашем удаленном обратном вызове? Нет, похоже, что вы используете сквозную передачу, вы говорите, что добавляете белый шум в iPhone. как вы настраиваете аудиоустройство?
так что белый шум идет прямо в iPhone, и... что теперь представляет этот график? БПФ / Спектральный анализ выхода iPhone? как дела это? Вы вводите это в какое-то графическое программное обеспечение OSX, которое может принимать данные из строки?
Кроме того, вы могли бы сделать сужение. Если вы действительно передаете звук прямо через устройство, вы не знаете, где происходит фильтрация. все, что вы знаете, может быть фильтрация в устройстве, которое генерирует белый шум, а также устройство, которое отображает графики iPhone.
как насчет генерации белого шума внутри обратного вызова рендеринга удаленного ввода / вывода?
а затем генерировать его извне и анализировать данные, поступающие из этого обратного вызова - вы можете выполнить БПФ.
Во всяком случае, для входа не лучше ли подавать синусоидальные волны разных частот?