1

48 kHz の PCM ストリームがあり、それを 44.1 kHz 互換のプレーヤー (Apple の AirPlay) にストリーミングしたいと考えています。

これが「一部のバイトが失われるために機能する」かどうかを誰かが知っていますか、それとも前に変換/ダウンサンプリングを行う必要がありますか?

「うまく機能しない」場合、Javaでこれを行うためのヒントはありますか?

編集:

音が途切れる (「情報オーバーフロー」) ため、機能しません。pcm-stream をリサンプル/ダウンサンプルする必要があります。

これはこの場合 (48 kHz から 44.1 kHz) ではそれほど簡単ではないため、これを行うにはライブラリを使用する必要があります。

libresample を試してみようと思います。私は Android を使用しているため、ネイティブ実装またはJava 実装を使用できます。

Java 実装のパフォーマンスは十分だと思いますか?

4

3 に答える 3

1

わかりました。最も簡単なアプローチは、すべてのサンプルを取得すること48/44.1です(これは、12番目のサンプルごとにキックアウトすることと同じです)。最終的にはこれを行う必要があります。

それに関する問題はエイリアシングです。ダウンサンプリングの場合、実際には、ダウンサンプリングレートの外側のスペクトルをサンプルにミラーリングしています(適切な説明については、このwikiページを参照してください)。これはエイリアシングと呼ばれます。あなたは明らかにそれを望んでいません(あなたはそれを試してみて、あなたのオーディオで何が起こるかを見ることができます)。

では、どうすればそれを防ぐことができますか?最も一般的な方法は、これらのミラーリングされた周波数チャンクのスペクトル振幅を何らかの方法で減らすことです。このように、それらミラーリングされますが、振幅が非常に小さいため、それほど重要ではありません。これは、サンプリング比付近のカットオフ周波数を持つローパスフィルターを使用して実行できます。したがって、手順は次のようになります。

  • サンプルをローパスフィルター処理して、44.1kHzを超える高周波振幅を除去します(その下にあるものを除去しないように注意してください)
  • データをサブサンプリングします(この場合、12番目のサンプルごとにキックアウトします)

では、そのフィルターの要件は何ですか?重要な要件の1つは、カットオフ周波数より低い周波数振幅に触れないようにすることです。そのため、非常に低い通過帯域リップルと1の通過帯域ゲインが適切です。次に、阻止帯域を可能な限り減衰させる必要があります。これは明らかにあなたのデータに依存します。特別なオーディオ処理についてはわかりませんが、通常DSPでは、使用されるローパスフィルターはまたはFIRですIIR。もちろん他にもたくさんありますが、これらは実装が非常に簡単で、ある程度までリアルタイムの制約を処理することさえできます。

したがって、2つのフィルター実装を読むことをお勧めします(または単に焦点を当てますFIR)。私が今書いたものについて本当に混乱している場合は、ある種のローパスフィルタリング機能を備えた特定のライブラリを使用する方がよいかもしれません。しかし、あなたがそのようなものをたくさん扱っているなら、私はその問題を読むことをお勧めします、それは本当に何が起こっているのかを理解するのに役立ちます...;)

于 2012-06-20T07:47:41.957 に答える
1

あなたの場合に必要なプロセスは、「合理的な要因によるダウンサンプリング」と呼ばれます。これは些細な問題ではないので、ライブラリを使用してそれを行うことをお勧めします。これを自分で実装するには、多くの DSP の知識が必要です。代わりに、JNI バインディングを作成する必要がある C ライブラリである libresample を使用できます。

非常に大まかな概算を行うには、古いサンプルのほとんどをコピーする新しいバッファーを作成するだけで済みますが、10 番目のサンプルごとにドロップします。正確に 44.1kHz にはなりませんが、そのまま再生するよりはましです。

于 2012-06-19T22:52:11.140 に答える
0

You need to apply decimation to your input signal. First, you need to pass the input through the low-pass filter (consider this an anti-aliasing).

Then you need to do downsampling by a rational factor. There are many many articles in internet about these two processes. So if you really up to this task, go do some research.

E.g. one simple low-pass filter approach is to use average of two samples as an output sample. That is, y(n)=(x(n)+x(n-1))/2; where y - is output and x - input, n - current sample position.

于 2012-06-20T02:03:55.890 に答える