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

わんくま同盟

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

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

■88103 / 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 ミリ秒程度?)


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

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

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[6]: C#でのwaveファイルの波形表示 /akaveco →Re[8]: C#でのwaveファイルの波形表示 /akaveco
 
上記関連ツリー

C#でのwaveファイルの波形表示 / akaveco (18/07/30(Mon) 05:12) #88011
Re[1]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/07/30(Mon) 11:33) #88020
  └ Re[2]: C#でのwaveファイルの波形表示 / akaveco (18/07/30(Mon) 12:41) #88027
    └ Re[3]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/07/30(Mon) 17:24) #88041
      └ Re[4]: C#でのwaveファイルの波形表示 / akaveco (18/07/31(Tue) 11:34) #88055
        └ Re[5]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/01(Wed) 17:38) #88083
          └ Re[6]: C#でのwaveファイルの波形表示 / akaveco (18/08/02(Thu) 12:00) #88093
            └ C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/02(Thu) 17:34) #88103 ←Now
              └ Re[8]: C#でのwaveファイルの波形表示 / akaveco (18/08/02(Thu) 21:19) #88104
                └ Re[9]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/04(Sat) 00:54) #88138
                  └ Re[10]: C#でのwaveファイルの波形表示 / akaveco (18/08/04(Sat) 16:38) #88141
                    └ Re[11]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/05(Sun) 05:08) #88147
                      └ Re[12]: C#でのwaveファイルの波形表示 / akaveco (18/08/08(Wed) 09:50) #88179
                        └ Re[13]: C#でのwaveファイルの波形表示 / akaveco (18/08/08(Wed) 09:51) #88180 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信