質問編集履歴

2

プログラムの修正

2021/02/24 16:27

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,6 @@
1
1
  waveファイルの音声データだけをC言語で配列に格納したいです。
2
2
 
3
- fopenでバイナリファイル?を開けば良いというところまでわかっているのですが
3
+
4
-
5
- どのサイトを見ても配列に格納する方法が分かりません。
6
-
7
- 一応自分で作ってみたのが下記のプログラムですが、取り出してテキストファイルに
8
-
9
- 出力してみても上手く取り出せていないようです。
10
4
 
11
5
  (sinwave.wavは2000Hzの音波を1秒間出力するファイルです。)
12
6
 
@@ -16,11 +10,15 @@
16
10
 
17
11
  ##追記:
18
12
 
13
+ 一から作るのはまだ早いというご指摘を頂いたので
14
+
19
- プログラムを変更してみました。
15
+ 下記サイトを参考にプログラムを更に変更してみました。
16
+
20
-
17
+ https://hwswsgps.hatenablog.com/entry/2018/08/19/172401
18
+
21
- プ内永遠にループしてしまってるようで……
19
+ しかしコド-1073741819終了してしまい
22
-
20
+
23
- 解決策が全く分かません
21
+ 実際のプログラムは下記の通です
24
22
 
25
23
 
26
24
 
@@ -34,43 +32,263 @@
34
32
 
35
33
  #include <malloc.h>
36
34
 
37
- #define noad 100000
38
-
39
35
  #pragma warning(disable:4996);
40
36
 
41
37
 
42
38
 
39
+ typedef struct
40
+
41
+
42
+
43
+ {
44
+
45
+
46
+
47
+ int fs; //サンプリング周波数
48
+
49
+
50
+
51
+ int bits; //量子化bit数
52
+
53
+
54
+
55
+ int L; //データ長
56
+
57
+
58
+
59
+ } WAV_PRM;
60
+
61
+
62
+
63
+ double* audiodatasize;
64
+
65
+
66
+
67
+ double* audio_read(WAV_PRM* prm, char* filename);
68
+
69
+
70
+
43
71
  int main()
44
72
 
45
73
  {
46
74
 
75
+ WAV_PRM prm_in;
76
+
47
77
  double* data;
48
78
 
49
- data = (double*)malloc(sizeof(double) * noad);
50
-
51
79
  FILE* fp = fopen("sinwave.wav", "rb");
52
80
 
53
81
  FILE* txt = fopen("data.txt", "w");
54
82
 
55
83
  char fn[] = "sinwave.wav";
56
84
 
85
+ data = audio_read(&prm_in, fn);
86
+
87
+ printf("%d", (int)audiodatasize); //ループ回数
88
+
89
+ for (int i = 0; i < (int)audiodatasize; i++) {
90
+
91
+ fprintf(txt, "%f\n", data[i]);
92
+
93
+ }
94
+
95
+ fclose(fp);
96
+
97
+ fclose(txt);
98
+
99
+ return 0;
100
+
101
+ }
102
+
103
+
104
+
105
+ double* audio_read(WAV_PRM* prm, char* filename)
106
+
107
+
108
+
109
+ {
110
+
111
+
112
+
113
+ //変数宣言
114
+
115
+
116
+
117
+ FILE* fp;
118
+
57
119
 
58
120
 
59
121
  int n;
60
122
 
61
123
 
62
124
 
125
+ double* data;
126
+
127
+
128
+
129
+ char header_ID[4];
130
+
131
+
132
+
133
+ long header_size;
134
+
135
+
136
+
137
+ char header_type[4];
138
+
139
+
140
+
141
+ char fmt_ID[4];
142
+
143
+
144
+
145
+ long fmt_size;
146
+
147
+
148
+
149
+ short fmt_format;
150
+
151
+
152
+
153
+ short fmt_channel;
154
+
155
+
156
+
157
+ long fmt_samples_per_sec;
158
+
159
+
160
+
161
+ long fmt_bytes_per_sec;
162
+
163
+
164
+
165
+ short fmt_block_size;
166
+
167
+
168
+
169
+ short fmt_bits_per_sample;
170
+
171
+
172
+
173
+ char data_ID[4];
174
+
175
+
176
+
63
177
  long data_size;
64
178
 
179
+
180
+
65
181
  short data_data;
66
182
 
183
+
184
+
185
+
186
+
187
+
188
+
189
+ //wavファイルオープン
190
+
191
+
192
+
193
+ fp = fopen(filename, "rb");
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+ //wavデータ読み込み
202
+
203
+
204
+
205
+ fread(header_ID, 1, 4, fp);
206
+
207
+
208
+
209
+ fread(&header_size, 4, 1, fp);
210
+
211
+
212
+
213
+ fread(header_type, 1, 4, fp);
214
+
215
+
216
+
217
+ fread(fmt_ID, 1, 4, fp);
218
+
219
+
220
+
221
+ fread(&fmt_size, 4, 1, fp);
222
+
223
+
224
+
225
+ fread(&fmt_format, 2, 1, fp);
226
+
227
+
228
+
229
+ fread(&fmt_channel, 2, 1, fp);
230
+
231
+
232
+
233
+ fread(&fmt_samples_per_sec, 4, 1, fp);
234
+
235
+
236
+
237
+ fread(&fmt_bytes_per_sec, 4, 1, fp);
238
+
239
+
240
+
241
+ fread(&fmt_block_size, 2, 1, fp);
242
+
243
+
244
+
245
+ fread(&fmt_bits_per_sample, 2, 1, fp);
246
+
247
+
248
+
249
+ fread(data_ID, 1, 4, fp);
250
+
251
+
252
+
67
253
  fread(&data_size, 4, 1, fp);
68
254
 
255
+
256
+
257
+
258
+
259
+
260
+
261
+ //パラメータ代入
262
+
263
+
264
+
265
+ prm->fs = fmt_samples_per_sec;
266
+
267
+
268
+
269
+ prm->bits = fmt_bits_per_sample;
270
+
271
+
272
+
273
+ prm->L = data_size / 2;
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+ //音声データ代入
282
+
283
+
284
+
69
- data = (double*)calloc(data_size / 2, sizeof(double));
285
+ data = (double*)calloc(prm->L, sizeof(double));
70
-
286
+
71
- printf("ループ前\n");
287
+ audiodatasize = (double*)malloc(sizeof(double) * prm->L);
72
-
288
+
289
+
290
+
73
- for (n = 0; n < (data_size / 2); n++) {
291
+ for (n = 0; n < prm->L; n++) {
74
292
 
75
293
 
76
294
 
@@ -78,32 +296,102 @@
78
296
 
79
297
 
80
298
 
81
- if (data != NULL) {
82
-
83
- data[n] = (double)data_data / 32768.0;
299
+ data[n] = (double)data_data / 32768.0;
84
-
85
- }
300
+
301
+
86
302
 
87
303
  }
88
304
 
89
- printf("ループ後\n");
305
+
90
-
91
- for (n = 0; n < (data_size / 2); n++) {
306
+
92
-
93
- if (data != NULL) {
307
+
94
-
95
- fprintf(txt, "%f\n", data[n]);
308
+
96
-
97
- }
309
+
98
-
99
- }
100
310
 
101
311
  fclose(fp);
102
312
 
103
- fclose(txt);
313
+
104
-
314
+
105
- return 0;
315
+ return data;
316
+
317
+
106
318
 
107
319
  }
108
320
 
109
321
  ```
322
+
323
+
324
+
325
+ 出力されたdata.txtの内容は下記のようになりました。
326
+
327
+
328
+
329
+ ```
330
+
331
+ 0.000000
332
+
333
+ 0.281036
334
+
335
+ 0.539398
336
+
337
+ 0.754272
338
+
339
+ 0.908325
340
+
341
+ 0.989105
342
+
343
+ 0.990112
344
+
345
+ 0.911255
346
+
347
+ 0.758942
348
+
349
+ 0.545380
350
+
351
+ 0.287842
352
+
353
+ 0.007111
354
+
355
+ -0.274200
356
+
357
+ -0.533386
358
+
359
+ -0.749573
360
+
361
+ -0.905304
362
+
363
+ -0.988037
364
+
365
+ -0.991058
366
+
367
+ -0.914185
368
+
369
+ -0.763550
370
+
371
+ -0.551331
372
+
373
+ -0.294678
374
+
375
+ -0.014221
376
+
377
+ 0.267334
378
+
379
+ 0.527344
380
+
381
+ 0.744843
382
+
383
+ 0.902283
384
+
385
+ 0.986938
386
+
387
+ 0.991974
388
+
389
+ .
390
+
391
+ .
392
+
393
+ .
394
+
395
+ 以下省略
396
+
397
+ ```

1

プログラムの修正

2021/02/24 16:27

投稿

Anfaenger
Anfaenger

スコア14

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,18 @@
12
12
 
13
13
  どなたかお力添えをお願い致します。
14
14
 
15
+
16
+
17
+ ##追記:
18
+
19
+ プログラムを変更してみました。
20
+
21
+ ループ内で永遠にループしてしまっているようです……
22
+
23
+ 解決策が全く分かりません。
24
+
25
+
26
+
15
27
  ```C++
16
28
 
17
29
  #include <stdio.h>
@@ -20,33 +32,75 @@
20
32
 
21
33
  #include <stdlib.h>
22
34
 
35
+ #include <malloc.h>
36
+
23
37
  #define noad 100000
24
38
 
25
- #pragma warning(disable:4996)
39
+ #pragma warning(disable:4996);
40
+
41
+
26
42
 
27
43
  int main()
28
44
 
29
45
  {
30
46
 
31
- int* data;
47
+ double* data;
32
48
 
33
- data = (int*)malloc(sizeof(int) * noad);
49
+ data = (double*)malloc(sizeof(double) * noad);
34
50
 
35
51
  FILE* fp = fopen("sinwave.wav", "rb");
36
52
 
37
53
  FILE* txt = fopen("data.txt", "w");
38
54
 
39
- if (data != NULL) {
55
+ char fn[] = "sinwave.wav";
40
56
 
41
- for (int n = 0; n < noad; n++) {
42
57
 
43
- data[n] = fgetc(fp);
44
58
 
59
+ int n;
60
+
61
+
62
+
63
+ long data_size;
64
+
65
+ short data_data;
66
+
67
+ fread(&data_size, 4, 1, fp);
68
+
69
+ data = (double*)calloc(data_size / 2, sizeof(double));
70
+
45
- fprintf(txt, "%d\n", data[n]);
71
+ printf("ループ前\n");
72
+
73
+ for (n = 0; n < (data_size / 2); n++) {
74
+
75
+
76
+
77
+ fread(&data_data, 2, 1, fp);
78
+
79
+
80
+
81
+ if (data != NULL) {
82
+
83
+ data[n] = (double)data_data / 32768.0;
46
84
 
47
85
  }
48
86
 
49
87
  }
88
+
89
+ printf("ループ後\n");
90
+
91
+ for (n = 0; n < (data_size / 2); n++) {
92
+
93
+ if (data != NULL) {
94
+
95
+ fprintf(txt, "%f\n", data[n]);
96
+
97
+ }
98
+
99
+ }
100
+
101
+ fclose(fp);
102
+
103
+ fclose(txt);
50
104
 
51
105
  return 0;
52
106