■88103 |
Re[7]: C#でのwaveファイルの波形表示 |
□投稿者/ 魔界の仮面弁士 -(2018/08/02(Thu) 17:34:53)
| ■No88093 (akaveco さん) に返信
>> 上記 3 行のデータ末尾の 4 バイトに「5E,72,01,**」となので、
>> 最初の音は 0x1725E すなわち「+94,814」かと思いますが、正しいでしょうか?
> そうです。1725Eでした。
ここが重要なところなので、再度確認。
他のソフトで「正しい」波形を見た場合も、最初のデータは
94,814 (0x1725E) 付近としてレンダリングされたということでしょうか?
6,189,569 (0x5E7201) ではなく。
> 符号あり、なしがあるんですね。
変換元のデータが
var data = new byte[] { 0x9A, 0xBC, 0xDE, };
の順で記録されていた場合、24bit整数型としては、
リトルエンディアン(符号付き) = 0xDEBC9A = -2,179,942 (Int32 なら 0xFFDEBC9A 相当)
リトルエンディアン(符号なし) = 0xDEBC9A = 14,597,274 (UInt32 なら 0x00DEBC9A 相当)
ビッグエンディアン(符号付き) = 0x9ABCDE = -6,636,322 (Int32 なら 0xFF9ABCDE 相当)
ビッグエンディアン(符号なし) = 0x9ABCDE = 10,140,894 (UInt32 なら 0x009ABCDE 相当)
の 4 通りの意味がありえるかと思います。
なお上記では、符号付の場合の負数表現を、2 の補数としています。(下記参照)
https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE
そして Windows では、バイト順をリトルエンディアンで扱いますが、
16bit の PCM フォーマットもまた、リトルエンディアンらしいです。
https://www.wdic.org/w/TECH/WAV
そのため、24bit でも同じであろうと予想して、上記のケースでは
9A,BC,DE = 0xDEBC9A = -2,179,942 と解釈してみました。
しかし、ビデオDVD の 24bit リニア PCM では、ビッグエンディアンらしいです。
(44.1kHz ではなく、48kHz と 96kHz らしいですが)
https://wiki.multimedia.cx/index.php/PCM#24-Bit_PCM
この場合には、9A,BC,DE = 0x9ABCDE = -6,636,322 と変換することになりそうです。
>> data4[3] = (byte)((data[n + 2] > 0xF) ? 0xff : 0x00);
> この部分は、符号ありに変換しているということでしょうか?
そのつもりで書きました。ただしリトルエンディアンの場合ですけれども。
24bit 値を Int32 に収めるために、不足する 1 バイト分を補っています。
> だいぶ元の波形に近づいたように見えるのですが、
グラフに描くサンプル数(データの個数)は 8054 個でしょうか。
(再生時間としては 182.6 ミリ秒程度?)
> なんだか最初のほうの値が負のほうに片寄っていて、おかしなことに…
試しに、ビッグエンディアンとして読み取ってみたら、どうなりますか? |
|