C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■88103 / )  Re[7]: C#でのwaveファイルの波形表示
□投稿者/ 魔界の仮面弁士 (1760回)-(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 ミリ秒程度?)


> なんだか最初のほうの値が負のほうに片寄っていて、おかしなことに…

試しに、ビッグエンディアンとして読み取ってみたら、どうなりますか?

返信 編集キー/


管理者用

- Child Tree -