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

わんくま同盟

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

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


(過去ログ 151 を表示中)
■88147 / )  Re[11]: C#でのwaveファイルの波形表示
□投稿者/ 魔界の仮面弁士 (1768回)-(2018/08/05(Sun) 05:08:12)
No88141 (akaveco さん) に返信
> 0x7Fにしたら、できました!
誤記でお手数をおかけしました…!
掲示板投稿時にうっかり一文字消してしまっていたらしく、
そのまま気が付きませんで。orz


> いろいろ確認作業もしていただいて、お手間を取らせて申し訳ありません。
実データを提供してもらえたので、検証しやすかったです。


> ついでで申し訳ありませんが、32bitについてはどのようにすればいいのでしょうか?
元データが DC,FB,6E,BA だった場合、PCM なら符号付き整数型のはずなので、
 ビッグエンディアンなら 0xDCFB6EBA すなわち -587,501,894
 リトルエンディアンなら 0xBA6EFBDC すなわち -1,167,131,684
になるということです。通常はリトルエンディアンの並びになるはず。


> 32bitでも同様に符号の処理が必要なのでしょうか?
リトルエンディアンであれば、そのまま BitConverter.ToInt32 だけで良いはずです。
 Int32 int32_LE = BitConverter.ToInt32(data4, n);

仮にビッグエンディアンなら、[0][1][2][3] を [3][2][1][0] の順で渡すことになるので、
 Int32 int32_BE = BitConverter.ToInt32(data4.Skip(n).Take(4).Reverse().ToArray(), 0);
といった感じになります。あるいは下記のようにも書けます。
 Int32 int32_BE = System.Net.IPAddress.NetworkToHostOrder(int32_LE);


> 32bitモノラルのこの音声ファイルを描画すると
> https://drive.google.com/file/d/1Ce0fbeHXJo5SWllIjMCg1u7QeHAOIVkn/view?usp=sharing
うっ…。Sazanami では対応していないフォーマットでした。
他に波形を拡大表示できるソフトは無いですかね。

ひとまず手動解析してみましたが、
これは WAVE_FORMAT_PCM フォーマットではなく、
WAVE_FORMAT_IEEE_FLOAT フォーマットですよね?

 [00000-00003] RIFF.ID       : 52,49,46,46 "RIFF"
 [00004-00007] RIFF.Size     : 0006BACC (441,036 Bytes)
 [00008-0000B] RIFF.FileType : 57,41,56,45 ("WAVE")

 [0000C-0000F] Chunk.ID      : 66,6D,74,20 ("fmt ")
 [00010-00013] Chunk.Size    : 00000010 (16 Bytes)
 [00014-00015] フォーマットID: 0003 (WAVE_FORMAT_IEEE_FLOAT)
 [00016-00017] チャンネル数  : 0001 (モノラル)
 [00018-0001B] 標本化周波数  : 0000AC44 (44100 Hz = 44.1 kHz)
 [0001C-0001F] 秒間バイト数  : 0002B110 (176,400)
 [00020-00021] ブロックサイズ: 0004 (4 Bytes = 32bit)
 [00022-00023] 量子化ビット数: 0020 (32bit)

 [00024-00027] Chunk.ID      : 64,61,74,61 ("data")
 [00028-0002B] Chunk.Size    : 0006BAA8 (441,000 Bytes)
 [0002C-6BAD3] 波形データ    : ★★


なのでこの場合は、整数として処理してはマズイと思います。
4 バイト単位で BitConverter.ToInt32 するのではなく、
4 バイト単位で BitConverter.ToSingle すると良いのかも。
(手持ちのソフトでは正しい波形が分からないので、確認はできませんが)


ひとまず、提供いただいた 32bit.txt ファイルの内容から
かきおこしてみると、こんな感じになりますね。

【ファイル全体(2.50秒)】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_2500.png

【0.00 秒~0.50秒区間】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_500.png

【0.00 秒~0.01秒区間】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_10.png

※ StepLine チャートで描画させています。
※ ChartAreas[0] は、BitConverter.ToInt32 による変換結果です。
※ ChartAreas[1] は、BitConverter.ToSingle による変換結果です。
※ AxisY.ScaleBreakStyle.Enabled = true; を指定してあります。

返信 編集キー/


管理者用

- Child Tree -