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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■30521  Re[1]: Logファイルの解析について
□投稿者/ .SHO -(2008/12/25(Thu) 15:54:53)
    No30519 (マサル さん) に返信

    Seek すればいいのでは?
記事No.30519 のレス /過去ログ54より / 関連記事表示
削除チェック/

■88093  Re[6]: C#でのwaveファイルの波形表示
□投稿者/ akaveco -(2018/08/02(Thu) 12:00:03)
    No88083 (魔界の仮面弁士 さん) に返信

    たびたびお付き合いいただきありがとうございます。

    > 上記 3 行のデータ末尾の 4 バイトに「5E,72,01,**」となので、
    > 最初の音は 0x1725E すなわち「+94,814」かと思いますが、正しいでしょうか?

    そうです。1725Eでした。


    > あー。24bit の負数処理忘れて、符号なしになってますね

    符号あり、なしがあるんですね。知りませんでした。


    > // data4[3] = 0;
    > data4[3] = (byte)((data[n + 2] > 0xF) ? 0xff : 0x00);

    この部分は、符号ありに変換しているということでしょうか?


    この部分を変更してやってみたのですが、だいぶ元の波形に近づいたように見えるのですが、なんだか最初のほうの値が負のほうに片寄っていて、おかしなことに…
    何がいけないのかわかりますでしょうか?

    以下のリンクに画像をアップしました。
    https://drive.google.com/file/d/16DXZALxyiD66_AcKWFflTId9U47pzJtK/view?usp=sharing
    1番目が波形描画を行ったもので、
    2番目がそれを最大値を大きく設定して、遠目に見たものです。
    3番目が元の音声を別のプレイヤーで再生したときの波形です。
記事No.88011 のレス /過去ログ151より / 関連記事表示
削除チェック/

■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 ミリ秒程度?)
    
    
    > なんだか最初のほうの値が負のほうに片寄っていて、おかしなことに…
    
    試しに、ビッグエンディアンとして読み取ってみたら、どうなりますか?
記事No.88011 のレス /過去ログ151より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -