2

基本的なサウンド編集プログラムをJavaで作成しようとしていますが、16ビットのWAVEファイル形式で大きな問題が発生しています。

サウンドファイルにあると思われるサンプルの数をJavaに尋ねたところ、予想の2倍の数が得られました。Javaに80000バイトのサンプルの正弦波を生成するように指示すると、2秒ではなく1秒間再生されました(サンプルレートは1秒あたり約40000でしたが)。

さらに検索したところ、ファイルの「フレームサイズ」が2であり、「サンプル」が実際には1バイトではなく2バイトであり、これが16ビットオーディオファイルと呼ばれていることがわかりました。実験として、サウンドファイルをバイトの配列に書き込み、1バイトおきに0に設定して、結果を再生しました。奇数のサンプルだけを保持した場合、サウンドファイルはわずかな静的ノイズで再生されました。偶数のみを保持すると、その静的ノイズはサウンドファイルなしで自然に再生されました。これにより、偶数バイトには、実際に再生されるサウンドが含まれている奇数バイトの静的バイトの正確な逆が含まれていると思います。一緒に再生すると、偶数バイトは奇数バイトのスタティックを無音にし、サウンドの忠実度を高めます。

このWebサイトには、16ビットサウンドエンコーディングの基本についてのかなり良い説明があります。ただし、先に進んでファイルの編集を1バイトずつ開始するだけでは十分ではありません。より高い忠実度を維持しながら、16ビット(またはそれ以上)のサウンドファイルをバイト単位で編集するにはどうすればよいですか?サンプルあたり8ビットではなく16ビットでサウンドをエンコードするための式は何ですか?

4

1 に答える 1

0

16 ビット (またはそれ以上) のサウンド ファイルをバイト単位で編集するにはどうすればよいですか?

その質問は意味がありません。「バイトごとの編集」と言うとき、本当は「サンプルごと」と言うべきです。この場合、すべてのサンプルは 16 ビット (または 2 バイト) であり、サンプルを分割しても意味がありません。これは、テキスト エディターで各文字の上半分だけを編集しようとするようなものです。

デジタル オーディオ ストリームの 1 つのチャネルは、一連の数値 (別名、サンプル) です。各サンプルは、ある瞬間に音波によってマイクロフォンのダイヤフラムにかかる圧力を表しています。8 ビットのサウンド ファイルでは、可能な値は 256 しかありませんが、16 ビットのサウンド ファイルでは、可能な値は 65536 です。16 ビット ファイルの解像度ははるかに高くなります。

これは、偶数バイトには、実際に再生されるサウンドを含む奇数バイトの静的の正確な逆が含まれていると私に思わせます。

それには真実の核があります。信号処理における「ノイズ」の定義は、聞こえるものと聞きたいものの違いです。奇数番号のバイトをすべてゼロにすると、各サンプルの下位半分が踏みつぶされます。サンプルを変更することで、聞きたくないもの (ノイズなど) を導入していました。偶数バイトをゼロにすると、すべての上位ビットが削除され、したがってほとんどの信号が削除されます。下位バイトに残ったのは、最初の実験で導入したノイズの正確な逆です。(あなたの耳は、与えられた音波と同じ音波の逆波との違いを見分けることができません。)

サンプル値と圧力の間に絶対的なマッピングはありませんが、知っておくべきことがいくつかあります。

1) サンプルは署名されていますか、それとも署名されていませんか? すべてのサンプルには、最小値と最大値の間にある値があります。(16 ビット) サンプルが署名されている場合、最小値は -32768 (0x8000)、最大値は 32767 (0x7FFF) で、0 はその中間です。サンプルが符号なしの場合、最小値は 0、最大値は 65535 (0xFFFF) です。聞き間違えるとすぐにわかります。聞こえるのは巨大なノイズだけだからです。

2) サンプルは線形ですか? サンプル値は常に何かに比例します。それらが音圧レベルに正比例する場合、それは「リニア エンコーディング」と呼ばれます。しかし、それらは音圧の対数または音圧の他の関数に比例する場合があります。非線形エンコーディングはほとんどの場合 8 ビットであり、通常はテレフォニーなどの特殊なアプリケーションでのみ使用されます。16 ビット以上のサンプルを扱っている場合、それらはほぼ確実に線形です。

于 2014-01-03T15:04:49.293 に答える