• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WAVフォーマットについて)

WAVフォーマットについて

このQ&Aのポイント
  • WAVフォーマットとは、Windowsで使用される音声ファイルの形式です。
  • PCM波形データの解釈について、16bitステレオの場合はリトルエンディアンで書き込まれています。
  • しかし、正弦波を解析してもホワイトノイズ的な波形が描画されてしまいます。PCMの解釈が誤っているのか検討しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

>10行目Lチャンネルが、私の計算結果では-95で、ご回答いただいた673と違ってました。 16進数で見ると「下位バイトが負数(0x80~0xFF)のデータがすべて狂っている」のが判ります。 >変換後データ_short = new Integer(波形データ_byte[i]|波形データ_byte[i+1]<<8).shortValue() この式の部分式「波形データ_byte[i]」が「charで負数」になった場合、上位バイトをORしても結果に上位バイトが反映されません。 例: データバイトが 0xA1 0x02 正しい結果:673(0x02A1) 間違った結果:-95(0xFFFFFFA1) 波形データ_byte[i]=0xA1=-95=0xFFFFFFA1 波形データ_byte[i+1]=0x02=2=0x00000002 質問者さんの式 変換後データ_short = new Integer(波形データ_byte[i]|波形データ_byte[i+1]<<8).shortValue() =0xFFFFFFA1|0x00000002<<8=0xFFFFFFA1|0x00000200=0xFFFFFFA1=-95 正しい式(と思われる。動作未確認なので要検証) 変換後データ_short = new Integer((波形データ_byte[i]&255)|波形データ_byte[i+1]<<8).shortValue() =(0xFFFFFFA1&255)|0x00000002<<8=0x000000A1|0x00000002<<8=0x000000A1|0x00000200=0x000002A1=673 なお「上位バイトが負数の場合は、結果も負数になって欲しい」ので「&255でマスクする必要は無い」ので注意。

_fukky_
質問者

お礼

ありがとうございます。 だんだんWAVの話からそれてきたので、 別の質問で演算方式についてきいていたのですが、 危うく上位バイトも0xFFでマスクするところでした。

その他の回答 (5)

回答No.5

正しくテキスト化出来た場合、以下のようなテキストが生成されるでしょう(以下テキストは、左チャンネル+「,」+右チャンネル+「改行」の形式) L-ch,R-ch 0,0 2,-3 -12,3 25,-9 -53,14 96,-26 -171,39 280,-62 -443,86 673,-127 -1022,183 1524,-278 -2344,454 3979,-922 -9427,3233 -24933,23668 8663,8495 -5009,-3124 1067,-1039 -2511,-1887 -27,-1248 -1568,-1529 -414,-1195 -1005,-1289 -479,-1070 -617,-1056 -369,-913 -357,-850 -216,-731 -131,-653 -17,-541 67,-447 194,-338 302,-247 407,-136 494,-44 604,57 706,153 802,237 893,337 1007,416 1089,513 1182,603 1260,675 1351,741 1428,810 1500,897 1580,948 1627,1010 1692,1070 1737,1130 1786,1161 1833,1201 1870,1239 1900,1269 1921,1293 1948,1312 1969,1335 1952,1318 1972,1340 1961,1326 1952,1324 1940,1304 1923,1294 1887,1262 1867,1216 1816,1190 1764,1144 1715,1097 1669,1046 1595,973 1543,932 1469,852 1386,797 1306,707 1236,643 1130,550 1057,474 949,379 868,282 753,194 665,103 569,0 477,-87 365,-186 256,-285 147,-403 52,-479 -58,-588 -161,-681 -271,-789 -367,-878 -489,-985 -575,-1077 -669,-1168 -758,-1261 -846,-1345 -935,-1420 -1020,-1499 -1111,-1577 -1199,-1652 -1271,-1724 -1321,-1781 -1386,-1846 -1450,-1897 -1505,-1956 -1550,-2001 -1594,-2034 -1640,-2076 -1679,-2095 -1694,-2130 -1711,-2147 -1716,-2160 -1734,-2164 -1742,-2173 -1747,-2175 -1732,-2160 -1723,-2152 -1678,-2111 -1668,-2112 -1615,-2071 -1577,-2034 -1536,-1990 -1497,-1951 -1441,-1878 -1384,-1828 -1317,-1774 -1253,-1711 -1173,-1634 -1100,-1569 -1009,-1481 -936,-1396 -837,-1304 -749,-1231 -648,-1136 -566,-1053 -454,-935 -351,-851 -250,-748 -158,-663 -37,-560 69,-458 174,-365 270,-266 394,-167 491,-61 591,38 677,115 781,224 885,315 982,394 1079,486 1158,572 1249,658 1346,732 1414,795 1486,875 1556,940 1608,1009 1681,1045 1745,1103 1792,1162 1838,1202 1867,1224 1908,1259 1938,1294 1954,1312 (以下略) これをエクセルでグラフ化すると、以下のようになります。 http://imagepot.net/image/125394505997.jpg 生成テキストの先頭の30行くらいが上記とまったく同じであれば「成功と考えて良い」と思います。

_fukky_
質問者

お礼

Lチャンネルについて私の計算結果と先頭から照合していったところ、 10行目Lチャンネルが、私の計算結果では-95で、ご回答いただいた 673と違ってました。 これを手がかりにデバッグしていきたいと思います。 ありがとうございました。

回答No.4

>先頭部分にある「プチノイズ」については、添付画像参照。 このサイトのサーバーの不調で画像の添付が出来ないようなので、画像アップローダーにアップした以下の画像を参照してください(3ヶ月ほどで自動的に削除されます) 先頭部分にある「プチノイズ」 http://imagepot.net/image/125394224411.jpg 定期的に、波形が正しく繋がっていない部分 http://imagepot.net/image/125394271631.jpg >正弦波データを10進数で表現したものが >http://fukkiijava.web.fc2.com/result.txt >になってしまいます。 >グラフ化するとホワイトノイズのようにしか見えないのですが、 >これで正しいのでしょうか? 以下のグラフ化した画像をみる限り、部分的にデータが化けているようで「正弦波っぽい波形に、化けたデータが混じってるグラフ」になっています。 http://imagepot.net/image/125394271731.jpg どうも「データをテキスト化する部分にバグがあって、正しい10進数のテキストが出力されてない」ようです。

_fukky_
質問者

お礼

ご指摘ありがとうございます。 グラフ化する範囲が広すぎたようで、 狭くとると、いちおう正弦波になっているように見えなくもないのですね。 演算方式のバグかとおもいますので、そっちの方からあたっていきたいと思います。 プログラムはJavaで書いてまして、 波形データの byte→short変換は 変換後データ_short = new Integer(波形データ_byte[i]|波形データ_byte[i+1]<<8).shortValue() のような感じで実装してまして、 Javaの仕様でbyteの演算結果はint型に変換される(直接short型に変換できない)というところが いちばんくさいかなと思ってます。

回答No.3

>元の正弦波データは >http://fukkiijava.web.fc2.com/seigen.wav >でして、 このデータは ・先頭部分に「プチノイズ」がある ・定期的に、波形が正しく繋がっていない部分がある ので、テスト用に用いるには問題があります。 先頭部分にある「プチノイズ」については、添付画像参照。

_fukky_
質問者

お礼

ご指摘ありがとうございます。 確かに先頭部分の大きなプチノイズ、及び 定期的なプチノイズが混入していることは認識しております。 ただ、Audacityというソフトを使って、波形をみると それなりの正弦波っぽい波形は観測できるのですが、 私が解釈して数値化した波形データは、ホワイトノイズとしか 捕らえようのない状態でして。。。 どこで間違っているのでしょうか?

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

懐かしい。 全く同じサイトを参考に、WAV <-> xlsの相互変換するシートを作った事あります。 > Short値 符号ありの整数値ですが、2の補数表現されているので、負数の扱いが正しいか、確認してみて下さい。 0000→ 0 0001→ 1 0001→ 2 … 7FFE→ 32765 7FFE→ 32766 7FFF→ 32767 8000→ -32768 8001→ -32767 … FFFD→ -3 FFFE→ -2 FFFF→ -1 になります。 -- > WAVファイルは再生すると、きれいな正弦波的な音が再生されるので、 きれいな正弦波のグラフが描けるデータをセットしても、ホワイトノイズみたいな音しかしなかったような? 手元にExcelビュアーしかなく、マクロ実行できないので確認できず。

_fukky_
質問者

お礼

ありがとうございます。 確認してみたのですが、負数の扱いについては間違っていないようにおもいます。 元データ(正弦波データ)は http://fukkiijava.web.fc2.com/seigen.wav で、 正弦波データを10進数で表現したものが http://fukkiijava.web.fc2.com/result.txt になってしまいます。 グラフ化するとホワイトノイズのようにしか見えないのですが、 これで正しいのでしょうか?

回答No.1

16bitステレオの場合 L R 0 0 0 0 1 0 0 0 0 1 -1 0 0 -1 0 0 と言うデータがあったなら、バイト列は 00_00 00_00 00_00 00_00 01_00 00_00 00_00 00_00 00_00 01_00 FF_FF 00_00 00_00 FF_FF 00_00 00_00 になります。 つまり「左の下位バイト、左の上位バイト、右の下位バイト、右の上位バイト」の繰り返しです。 上位バイトと下位バイトを取り違えたか、ベッダの解釈を1バイト間違ってデータのスタート位置が1バイトずれた場合、上位バイトと下位バイトが逆になりますから「まるでホワイトノイズみたいな波形」になるでしょう。

_fukky_
質問者

お礼

ありがとうございます。 元の正弦波データは ​http://fukkiijava.web.fc2.com/seigen.wav​ でして、 正弦波データの最初から12バイトは 00 00 00 00 02 00 FD FF F4 FF 03 00 だと思うんですが、この場合、 Lチャンネルを16進数表記すると、 0 2 FFF4 であってますでしょうか?