回答編集履歴

5

sizeofの中の意味の薄いsignedを削除/日本語が変なところを訂正

2016/11/26 17:23

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- Cの標準ライブラリーを用いてファイルをバイト単位で読みその中身を、まずは上記のバリエーションのどれかを仮定して解析してみたらよいと思います。例えば16bit,signed,little-endian,ステレオなら次のように入っています。(ステレオの場合左右どちらが先か自分は正確に知りません。以下は左が先と仮定しています)
17
+ まずはCの標準ライブラリーを用いてファイルを読みその中身を上記のバリエーションのどれかを仮定して解析してみたらよいと思います。例えば16bit,signed,little-endian,ステレオなら次のように入っています。(ステレオの場合左右どちらが先か自分は正確に知りません。以下は左が先と仮定しています)
18
18
 
19
19
 
20
20
 
@@ -58,7 +58,7 @@
58
58
 
59
59
  ```c
60
60
 
61
- #define BYTES_PER_SAMPLE sizeof(signed short)
61
+ #define BYTES_PER_SAMPLE sizeof(short)
62
62
 
63
63
  #define NATIVE_ENDIAN TRUE // CPUと同じエンディアンか?
64
64
 

4

signedを追記

2016/11/26 17:23

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  追記:
48
48
 
49
- endianは個人PCの世界ではインテル系の石が多い(?)ように思うのでひとまずlittleだと仮定し実際の波形を見たり再生すると見当がつくと思います。再生の際はイヤホンを耳からちょっと離したりvolumeを絞るようにした方が安全かも知れません。
49
+ endianは個人PCの世界ではインテル系の石が多い(?)ように思うのでひとまずlittle-endian, signedだと仮定し実際の波形を見たり再生すると見当がつくと思います。再生の際はイヤホンを耳からちょっと離したりvolumeを絞るようにした方が安全かも知れません。
50
50
 
51
51
  読み込みについてはfreadでもfgetcでもよいと思います。CPUと同じエンディアン、shortの語長が2byteと仮定するならモノラルデータはshortの配列へ直接読み込むと簡単です。
52
52
 

3

追記

2016/11/23 16:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- Cの標準ライブラリーを用いてファイルをバイト単位で読みその中身を、まずは上記のバリエーションのどれかを仮定して解析してみたらよいと思います。例えば16bit,signed,little-endien,ステレオなら次のように入っています。(ステレオの場合左右どちらが先か自分は正確に知りません。以下は左が先と仮定しています)
17
+ Cの標準ライブラリーを用いてファイルをバイト単位で読みその中身を、まずは上記のバリエーションのどれかを仮定して解析してみたらよいと思います。例えば16bit,signed,little-endian,ステレオなら次のように入っています。(ステレオの場合左右どちらが先か自分は正確に知りません。以下は左が先と仮定しています)
18
18
 
19
19
 
20
20
 
@@ -37,3 +37,75 @@
37
37
 
38
38
 
39
39
  描画についてはExcelであれば上記をCSV形式として出力しそれをExcelで読み込んでとりあえず折れ線グラフとして表示すると波形が見えると思います。ただあまりサンプル数が多いとExcelで表示するのは厳しいかもしれません。gnuplotについては経験ないのでわかっていませんが、[こういったサイト](http://graph.pc-physics.com/fromfile.html)を参考にされてはいかがでしょう。
40
+
41
+
42
+
43
+ ---
44
+
45
+
46
+
47
+ 追記:
48
+
49
+ endianは個人PCの世界ではインテル系の石が多い(?)ように思うのでひとまずlittleだと仮定し実際の波形を見たり再生すると見当がつくと思います。再生の際はイヤホンを耳からちょっと離したりvolumeを絞るようにした方が安全かも知れません。
50
+
51
+ 読み込みについてはfreadでもfgetcでもよいと思います。CPUと同じエンディアン、shortの語長が2byteと仮定するならモノラルデータはshortの配列へ直接読み込むと簡単です。
52
+
53
+
54
+
55
+ (手元にCがないので間違いがあったらご容赦)
56
+
57
+
58
+
59
+ ```c
60
+
61
+ #define BYTES_PER_SAMPLE sizeof(signed short)
62
+
63
+ #define NATIVE_ENDIAN TRUE // CPUと同じエンディアンか?
64
+
65
+
66
+
67
+ int main(int argc, const char* argv[]) {
68
+
69
+ FILE fp = fopen("...", "r");
70
+
71
+ size_t sample_length = 1000; // サンプル数:ファイル長から求めた方が柔軟
72
+
73
+ size_t buffer_size = sample_length * BYTES_PER_SAMPLE;
74
+
75
+ short* buffer = (short*)malloc(buffer_size);
76
+
77
+ size_t i;
78
+
79
+ short temp;
80
+
81
+
82
+
83
+ size_t samples = fread(buffer, BYTES_PER_SAMPLE, sample_length, fp);
84
+
85
+ // これでsample_length分のPCMサンプルがbuffferに読み込めるはず
86
+
87
+
88
+
89
+ // もしエンディアンがPCのプロセッサと逆ならバイト順を入れ替える
90
+
91
+ if (!NATIVE_ENDIAN) {
92
+
93
+ for (i = 0; i < samples; i++) {
94
+
95
+ temp = buffer[i];
96
+
97
+ buffer[i] = (short)(((temp >> 8) & 0xff) | (temp << 8));
98
+
99
+ }
100
+
101
+ }
102
+
103
+
104
+
105
+ ...
106
+
107
+ }
108
+
109
+ ```
110
+
111
+

2

誤記訂正・補足

2016/11/23 16:24

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -4,13 +4,13 @@
4
4
 
5
5
  - サンプルのbit幅(8/16)
6
6
 
7
- - 負号有無(singed/unsigned)
7
+ - 負号有無(singed/unsigned)=C言語のsigned/unsignedと同じ意味
8
8
 
9
- - エンディアン(big/little)
9
+ - エンディアン(big/little)=16bitの場合下位バイトが先(little)か後(big)か
10
10
 
11
- - チャンネル数(モノラル、ステレオ)
11
+ - チャンネル数(モノラル、ステレオ)=ステレオならL,Rが交互に並ぶ
12
12
 
13
- - 周波数(CD品質なら44.1KHz)
13
+ - 周波数(CD品質なら44.1KHz)=波形には直接関係しませんが再生の際に関係しますね。
14
14
 
15
15
 
16
16
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  0xFF - 右スピーカー用: 上位8bit(負号付き)
30
30
 
31
- ==> 最初のサンプルデータは 左: 1 右:-256
31
+ ==> 最初のサンプルデータは 左: 256 右:-256
32
32
 
33
33
  以下同様
34
34
 

1

追記

2016/11/23 11:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -33,3 +33,7 @@
33
33
  以下同様
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ 描画についてはExcelであれば上記をCSV形式として出力しそれをExcelで読み込んでとりあえず折れ線グラフとして表示すると波形が見えると思います。ただあまりサンプル数が多いとExcelで表示するのは厳しいかもしれません。gnuplotについては経験ないのでわかっていませんが、[こういったサイト](http://graph.pc-physics.com/fromfile.html)を参考にされてはいかがでしょう。