2011-07-19 10 views
17

Zajmuję się tworzeniem aplikacji do wykrywania wysokości gitary basowej w telefonie iPhone 3GS. Zauważyłem, że nie mogę uzyskać danych dźwiękowych poniżej 150 Hz za pomocą RemoteIO. Jednak gitara basowa może generować dźwięki niższe niż 50 Hz. Zgodnie z raportem "Odpowiedź częstotliwości wejściowej zestawu słuchawkowego iPhone 4", http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/ Występuje gwałtowny spadek poniżej 150 Hz.Jak uniemożliwić iPhone 3GS filtrowanie niskich częstotliwości (<150 Hz)?

Tutaj pokazuje, jak skonfigurować 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)); 

To jest funkcja zwrotna.

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; 
} 

Aby zidentyfikować przyczynę,

  1. zmodyfikowałem mój funkcji zwrotnej po prostu ominąć dane wejściowe do wyjścia.
  2. Używanie komputera Mac do generowania białego szumu
  3. Użyj iRig, aby przekierować sygnał z zestawu słuchawkowego Maca na iPhone3Gs, na którym działa mój program.
  4. Użyj iRig, aby przekierować wyjście iPhone'a z powrotem do Maca.
  5. Zapisuj dane na komputerze Mac. enter image description here Spektrum danych wyjściowych przedstawiono na poniższym rysunku. enter image description here

Widać gwałtowny spadek przy 150 Hz.

Aby zidentyfikować problem po stronie wejścia lub wyjścia, zmieniłem funkcję wywołania zwrotnego, aby ignorować dane wejściowe i generować biały szum. Oto wynik. enter image description here Bardzo jasne, że NIE ma spadku przy 150 Hz. Dlatego problem powinien być po stronie wejściowej.

Myślałem, że to ograniczenie sprzętowe. JEDNAKŻE próbowałem aplikacji "Amplitube" na tym samym urządzeniu, wyłącz wszystkie efekty, wprowadź biały szum i zanalizuj wynik. Ma wartość NO przy 150 Hz. Oto wynik. Amplitube frequency response on iPhone 3gs Oznacza to, że problem z zrzutem NIE jest ograniczeniem sprzętowym. Musi istnieć sposób, w jaki oprogramowanie może zrobić, aby uniknąć problemu.

Czy ktoś zna sekret?

Dzięki.

+0

znalazłeś problem mimo wszystko?Jestem ciekawy, co się stało. –

+0

Niestety, jeszcze nie. Przypuszczam, że jest to spowodowane ograniczeniem iOS 4.x. Wiem, że iOS 5 ma "tryb pomiaru". Jednak nie testowałem tego. – Albert

Odpowiedz

0

Interesujące pytanie. Nie wiem o takim filtrze ... możesz ustawić wejściowe wywołanie zwrotne na zdalnym urządzeniu IO i uzyskać strumień pływaków.

Nie widziałem żadnej dokumentacji, że ten strumień float jest w jakiś sposób przetwarzany.

Pisałem detektor nachylenia, który skutecznie wychwytuje notatki na niskim końcu mojego zakresu śpiewu (~ 80Hz)

Może Kod pocztowy - Co robisz wewnątrz tego zwrotnego?

+0

Wysyłam biały szum do iPhone'a 3GS, a następnie nagrywam wyjście z mojego programu i amplituby. Mój program tworzy tylko jednostkę audio RemoteIO i przekierowuje wejście na wyjście. Oto wynik porównania: [link] (https://picasaweb.google.com/lh/photo/MMXDmA2rpZru9elyoRIg4w?feat=directlink) Wydaje się, że moja produkcja spada z 250 hz ... Amplitube jest bardziej płaski – Albert

+0

"Ups ... jest nic tu nie widać. mówi Picasa –

+0

Przepraszamy, zapomniałyśmy upublicznić. Czy możesz spróbować tego [link] (https://picasaweb.google.com/shiaoal/Misc#5634398557996613666) – Albert

0

Czy mogę polecić ponowne zadać to pytanie, z odpowiednim tytułem (Może coś w stylu "jak zapobiec iPhone'owi filtrowania niskich częstotliwości (< 150Hz)") i zawierające wszystkie niezbędne informacje, również w tym obrazie , to ważna część pytania. bardzo łatwo jest osadzić zdjęcie.

nawet nie powiedziałeś, co chcesz osiągnąć.

Wygląda na to, że jesteś nowy na stronie i wygląda na bardzo interesujące pytanie.

Ale nie jesteś wcale czysty.

Po pierwsze, jest to problem z nagrywaniem lub odtwarzaniem, czy z jednym i drugim?

Co dokładnie robisz w swoim eksperymencie? Zachodnia metoda naukowa ... Wyłóż to.

Generujesz sygnał statyczny w wywołaniu zwrotnym zdalnego renderowania? Nie, wygląda na to, że używasz przekazywania, mówisz, że wprowadzasz biały szum do iPhone'a. jak konfigurujesz swój zespół audio?

, więc biały szum trafia do iPhone'a, prosto, i ... co teraz przedstawia ten wykres? FFT/analiza spektralna wyjścia iPhone'a? jak się masz? Dostarczasz to do oprogramowania graficznego OSX, które może pobierać dane wejściowe z linii?

także, możesz zrobić z zawężeniem go. Jeśli rzeczywiście przekazujesz dźwięk bezpośrednio przez urządzenie, nie masz pojęcia, gdzie jest filtrowanie. dla wszystkich wiesz, że może wystąpić filtrowanie w urządzeniu, które generuje biały szum, a także urządzenie, które wykreśla wyjście iPhone'a.

Co powiesz na generowanie białego szumu z wewnątrz oddzwaniacza renderowania zdalnego we/wy?

a następnie generowanie go zewnętrznie i analizowanie danych przychodzących z tego wywołania zwrotnego - można wykonać FFT.

tak czy inaczej, czy wejście nie byłoby lepsze, aby podawać fale sinusoidalne o różnych częstotliwościach?

+0

jeśli poprosisz o to osobne pytanie, przekaż do niego link za pomocą komentarza –

2

Cóż, jest to telefon, urządzenie zoptymalizowane do mowie rzekomo. Urządzenia zoptymalizowane dla mowy mają zazwyczaj filtr cięcia LF, aby uniknąć szumu i zniekształceń.

Ten filtr jest prawdopodobnie po stronie wejściowej telefonu, dlatego możesz generować i wysyłać szerszy zakres częstotliwości, jest to prawdopodobnie filtr elementów sprzętowych/dyskretnych, ponieważ są one proste do utworzenia przy użyciu tylko kilku komponenty i będą działać w czasie rzeczywistym bez żadnego wysiłku związanego z przetwarzaniem.

Nie wydaje mi się, żeby sensowne było cięcie niskich tonów w oprogramowaniu, wiem, że nie zrobiłbym tego, no cóż, dla aplikacji DAW można to zrobić, ale dla urządzenia zoptymalizowanego do filtrowania niskich tonów ...

Uważa się, że twórcy Amplituby mogli być świadomi tego problemu i dodali dodatkowe bodźce, aby spróbować zrekompensować ograniczenia sprzętowe?

Z drugiej strony bardzo możliwe, że możliwe będzie wybranie różnych "ścieżek sygnałowych" zgodnie ze scenariuszem użycia, być może niektóre aplikacje obsługi os można dotknąć i powiedzieć "hej, nie jestem głosem, nie cię moje minima "- jeśli tak, ta funkcja powinna znajdować się gdzieś w opisie api.

Powiązane problemy