2009-10-16 24 views
6

こんにちは、44.1kHzから8kHzまでのwavオーディオファイルのサンプルレートをダウンサンプリングする必要があります。バイト配列ですべての作業を手動で行う必要があります...これは学術的な目的のためです。Javaダウンサンプリングのwavオーディオファイル

現在、2つのクラスSinkとSourceを使用して、バイト配列をポップしてプッシュしています。線形補間を使用してデータチャンクをダウンサンプリングする必要がある部分に到達するまでは、すべてうまく行きます。

私は44100から8000 Hzにダウンサンプリングしているので、128 000 000バイトのようなものを含むバイト配列をどのように補間しますか?今、私は5%、6%、7%のバイトをポップしています。%2​​ == 0、%2 == 1、%80 == 0、これらの5,6,7バイトの平均を新しいファイルにプッシュします。 。

結果は実際にはオリジナルのオーディオファイルよりも小さいですが、Windows Media Playerで再生できません(ファイルを読み込んでいる間にエラーが発生しています)、正しいトラックが聞こえるものの、雑音。

これをまとめるには、線形補間の部分について助けが必要です。前もって感謝します。

+0

現在使用しているコードを投稿すると、バグを見つけやすくなります。 –

答えて

7

私は、これらのサンプルの平均を使用してはいけないと考えています。それは、正確にダウンサンプリングするのではなく、中央値のフィルタになるからです。 5/6/7番目ごとにサンプルを使用して、新しいファイルに書き込んでください。

おそらくいくつかのエイリアシングアーティファクトがありますが、全体的には認識可能かもしれません。

もう1つ、より複雑な解決策がありますが、おそらく品質の良い結果が得られる方法は、まずFFTまたはDFTを使用してサンプルを度数分布に変換してから、適切なサンプルレートに戻します。そんなことをしてからしばらくしていますが、間違いなく実行可能です。あなたはそれを正しく動作させるために、少しでも手間をかけなければならないかもしれません。

また、完全な配列のFTを使用せず、セグメントではセグメント境界が0であるという問題があります。数年前、私がそれらのものを使って遊んだとき、私は実行可能な解決策を考え出しませんでした。これは(アーティファクトも生成するので)正しい書物を読んだ場合はおそらく1つです:-)

WMPはファイルについて文句を言います:あなたが書いたヘッダーを修正しますか?

+0

平均化はおそらく悪い考えです。チェリーピッキングのサンプルよりも少ないアーティファクトが必要な場合は、アップサンプリングしてダウンサンプリングすることができます。 –

+2

うわー!ありがとうございました。「5/6/7のサンプルを毎回使用して、新しいファイルに書き込んでください」ということは、私の全面的な問題を修正したものです。 これを書くのに2時間かかりましたが、私はこれを何時間も過ごしたと信じられません!再度、感謝します! –

+1

あなたを歓迎します:-)もしそれについて考えるなら、平均化は*本当に悪い考えです。波形の全体的な形状が失われます。そしてそれは実際に何か感覚的なものを聞くために重要なことです:) – Joey

関連する問題