6

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

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

44100 から 8000 Hz にダウンサンプリングしているため、128 000 000 バイトなどを含むバイト配列を補間するにはどうすればよいですか? 現在、i%2 == 0、i%2 == 1、および i%80 == 0 に応じて 5、6、または 7 バイトをポップし、これらの 5、6、または 7 バイトの平均を新しいファイルにプッシュしています。 .

結果は確かにオリジナルよりも小さいオーディオ ファイルですが、Windows Media Player で再生できず (ファイルの読み取り中にエラーが発生したと表示されます)、多くのノイズが含まれていますが、ノイズの背後に正しいトラックが聞こえます。

要約すると、線形補間部分に関する助けが必要です。前もって感謝します。

4

1 に答える 1

7

これらのサンプルの平均を使用するべきではないと思います。これは、正確なダウンサンプリングではなく、メディアン フィルターになるためです。5番目/6番目/7番目のサンプルをすべて使用して、それを新しいファイルに書き込むだけです。

おそらくいくつかのエイリアシング アーティファクトがありますが、全体的に認識できる可能性があります。

もう1つのより複雑な解決策ですが、おそらく品質面でより良い結果が得られる解決策は、最初にFFTまたはDFTを使用してサンプルを周波数分布に変換し、次に適切なサンプルレートで変換することです。私がそのようなことをしてからしばらく経ちましたが、それは間違いなく実行可能です. ただし、適切に機能させるには、少しいじる必要があるかもしれません。

また、完全な配列の FT を取得するのではなく、セグメントではセグメント境界が 0 になるという問題があります。アーティファクトも生成します)が、適切な本を読めばおそらく1つあるでしょう:-)

ファイルについて不平を言っている WMP については、それに応じて、記述したヘッダーを変更しましたよね?

于 2009-10-16T18:55:44.157 に答える