18

iPhone 3GSでベースギターのピッチ検出アプリを開発しています。RemoteIO で 150Hz より低いサウンド データを取得できないことがわかりました。ただし、ベースギターは 50hz よりも低いトーンを生成する場合があります。レポート「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でデータを記録します。 ここに画像の説明を入力 出力データのスペクトルを下図に示します。 ここに画像の説明を入力

150Hzで急激な落ち込みが見られます。

問題が入力側か出力側かを特定するために、コールバック関数を変更して入力データを無視し、ホワイト ノイズを出力しました。これが結果です。 ここに画像の説明を入力 150 Hz でドロップがないことは非常に明確です。したがって、問題は入力側にあるはずです。

これはハードウェアの制限だと思いました。ただし、同じデバイスでアプリ「Amplitube」を試し、すべてのエフェクトをオフにし、ホワイトノイズを入力して出力を分析しました。150Hzでのドロップはありません。これが結果です。iPhone 3gs での Amplitube 周波数応答 これは、ドロップオフの問題がハードウェアの制限ではないことを意味します。問題を回避するためにソフトウェアができる何らかの方法があるはずです。

その秘密を知っている人はいますか?

ありがとう。

4

3 に答える 3

2

ええと、それはおそらく音声用に最適化されたデバイスである電話です。また、音声用に最適化されたデバイスには、通常、うなりや歪みを避けるために、ある種の LF カット フィルターが搭載されています。

このフィルターはおそらく電話の入力側にあります。そのため、より広い範囲の周波数を生成して出力できます。おそらくハードウェア/ディスクリート エレメント フィルターです。これは、少数のコンポーネントのみを使用して簡単に作成でき、機能するためです。処理に負担をかけずにリアルタイムで。

ソフトウェアで低域をカットするのは理にかなっていないと思います.DAWアプリケーションではそれを行うことができますが、低域をフィルタリングするように最適化されたデバイスでは...

amplitube の開発者がこの問題を認識しており、ハードウェアの制限を補うために特別に低いブーストを追加した可能性があるという事実を考慮しましたか?

一方、使用シナリオに応じて異なる「信号経路」を選択することは十分に可能かもしれません。おそらく、いくつかの OS ハンドル アプリが触れて、「ねえ、私は声ではないので、低音を切らないでください」と言うことができます -もしそうなら、この機能は API の説明のどこかにあるはずです。

于 2011-11-30T14:44:14.153 に答える
0

興味深い質問です。私はそのようなフィルタを認識していません... リモート IO ユニットに入力コールバックを設定し、フロートのストリームを取得できます。

このフロート ストリームがなんらかの方法で既に処理されているというドキュメントは見たことがありません。

歌唱範囲の下限 (~80Hz) で音符を正常に拾うピッチ検出器を作成しました。

コードを投稿するかもしれません -- このコールバック内で何をしていますか?

于 2011-07-26T23:57:31.493 に答える
0

適切なタイトル (「iPhone が低周波 (< 150Hz) をフィルタリングするのを防ぐ方法」のようなもの) を付けて、必要なすべての情報を含めて、この質問を再質問することをお勧めします。質問の重要な部分。画像を埋め込むのはとても簡単です。

あなたは何を達成しようとしているのかさえ述べていません。

このサイトを初めてご利用になるようで、非常に興味深い質問のようです。

しかし、あなたはまったく明確ではありません。

まず、これは録音または再生、またはその両方の問題ですか?

さて、あなたは実験で正確に何をしていますか? 西洋の科学的方法... レイアウトします。

remoteIO レンダー コールバックで静的を生成していますか? いいえ、パススルーを使用しているように聞こえます。iPhone にホワイト ノイズを入れているとのことです。オーディオユニットをどのようにセットアップしていますか?

ホワイト ノイズは iPhone に入り、そのまま出ていきます。では、そのグラフは何を表しているのでしょうか。iPhoneの出力をFFT/スペクトル解析?どうやってそれをやっていますか?これを、ラインから入力を受け取ることができるOSXグラフ作成ソフトウェアに供給していますか?

また、絞り込むこともできます。実際にデバイスを介してサウンドを通過させている場合、フィルタリングがどこで発生しているのかわかりません。iPhone の出力をグラフ化するデバイスだけでなく、ホワイト ノイズを生成するデバイスでもフィルタリングが発生している可能性があります。

リモート I/O レンダリング コールバック内からホワイト ノイズを生成するのはどうですか?

次に、それを外部で生成し、このコールバック内から到着するデータを分析します。FFT を実行できます。

とにかく、入力には異なる周波数の正弦波を入れたほうがいいのではないでしょうか?

于 2011-07-30T08:32:23.543 に答える