質問編集履歴

1

修正:矩形波送信と正弦波送信について、全てではありませんがプログラムを詳細に掲載しました。

2018/09/06 04:18

投稿

tcb78
tcb78

スコア5

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,201 @@
32
32
 
33
33
  ```lang-java
34
34
 
35
+ package com.example.xxx.rectanglesender;
36
+
37
+
38
+
39
+ import java.util.ArrayList;
40
+
41
+ import java.util.List;
42
+
43
+ import android.app.Activity;
44
+
45
+ import android.content.Context;
46
+
47
+ import android.media.AudioFormat;
48
+
49
+ import android.media.AudioManager;
50
+
51
+ import android.media.AudioTrack;
52
+
53
+ import android.os.Bundle;
54
+
55
+ import android.util.Log;
56
+
57
+ import android.widget.CompoundButton;
58
+
59
+ import android.widget.CompoundButton.OnCheckedChangeListener;
60
+
61
+ import android.widget.Switch;
62
+
63
+ import android.widget.EditText;
64
+
65
+ import android.widget.TextView;
66
+
67
+
68
+
69
+ public class MainActivity extends Activity implements OnCheckedChangeListener {
70
+
71
+
72
+
73
+ int SENDFREQ;
74
+
75
+ int VOLUME;
76
+
77
+ int SendSR;
78
+
79
+ int SendBufSize;
80
+
81
+ int musicVolume = 0;
82
+
83
+
84
+
85
+ AudioManager audioManager;
86
+
87
+ AudioTrack audioTrack = null;
88
+
89
+ private List<SoundDto> soundList = new ArrayList<SoundDto>();
90
+
91
+ Thread send;
92
+
93
+ boolean bIsPlaying = false;
94
+
95
+
96
+
97
+ @Override
98
+
99
+ public void onCreate(Bundle savedInstanceState) {
100
+
101
+ super.onCreate(savedInstanceState);
102
+
103
+ setContentView(R.layout.activity_main);
104
+
105
+
106
+
107
+ TextView SendfreqText = findViewById(R.id.SendfreqText);
108
+
109
+ SendfreqText.setText(R.string.SendfreqText);
110
+
111
+ TextView volumeText = findViewById(R.id.volumeText);
112
+
113
+ volumeText.setText(R.string.volumeText);
114
+
115
+ Switch switch1 = findViewById(R.id.Switch);
116
+
117
+ switch1.setOnCheckedChangeListener(this);
118
+
119
+ }
120
+
121
+
122
+
123
+ @Override
124
+
125
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
126
+
127
+
128
+
129
+ if(isChecked) {
130
+
131
+ EditText SendfreqEdit = findViewById(R.id.SendfreqEdit);
132
+
133
+ EditText volumeEdit = findViewById(R.id.volumeEdit);
134
+
135
+
136
+
137
+ SENDFREQ = Integer.parseInt(SendfreqEdit.getText().toString());
138
+
139
+ VOLUME = Integer.parseInt(volumeEdit.getText().toString());
140
+
141
+
142
+
143
+ SendSR = 4 * SENDFREQ;
144
+
145
+ SendBufSize = 4 * SENDFREQ;
146
+
147
+
148
+
149
+ audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
150
+
151
+
152
+
153
+ audioTrack = new AudioTrack(
154
+
155
+ AudioManager.STREAM_MUSIC,
156
+
157
+ SendSR,
158
+
159
+ AudioFormat.CHANNEL_OUT_MONO,
160
+
161
+ AudioFormat.ENCODING_PCM_16BIT,
162
+
163
+ SendBufSize,
164
+
165
+ AudioTrack.MODE_STREAM);
166
+
167
+
168
+
169
+ soundList.add(new SoundDto(createWaves(SendSR)));
170
+
171
+
172
+
173
+ musicVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
174
+
175
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, VOLUME, 0);
176
+
177
+
178
+
179
+ audioTrack.play();
180
+
181
+ bIsPlaying = true;
182
+
183
+ send = new Thread(new Runnable() {
184
+
185
+ @Override
186
+
187
+ public void run() {
188
+
189
+ while(bIsPlaying) {
190
+
191
+ for(SoundDto sound : soundList) {
192
+
193
+ audioTrack.write(sound.getSound(), 0, sound.getSound().length);
194
+
195
+ }
196
+
197
+ }
198
+
199
+ audioTrack.stop();
200
+
201
+ audioTrack.release();
202
+
203
+ }
204
+
205
+ });
206
+
207
+ send.start();
208
+
209
+ } else {
210
+
211
+
212
+
213
+ if(audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
214
+
215
+ audioTrack.stop();
216
+
217
+ bIsPlaying = false;
218
+
219
+ }
220
+
221
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0);
222
+
223
+ }
224
+
225
+ }
226
+
227
+
228
+
35
- //波形データ生成
229
+ //波形データ生成
36
230
 
37
231
  public byte[] createWaves(int sampleRate) {
38
232
 
@@ -68,15 +262,325 @@
68
262
 
69
263
  }
70
264
 
265
+
266
+
267
+ }
268
+
71
269
  ```
72
270
 
73
271
 
74
272
 
75
273
  #### 正弦波送信
76
274
 
275
+ main
276
+
77
277
  ```lang-java
78
278
 
279
+ package com.example.xxx.sinusoidsender;
280
+
281
+
282
+
283
+ import java.util.ArrayList;
284
+
285
+ import java.util.List;
286
+
287
+
288
+
289
+ import android.app.Activity;
290
+
291
+ import android.content.Context;
292
+
293
+ import android.media.AudioFormat;
294
+
295
+ import android.media.AudioManager;
296
+
297
+ import android.media.AudioTrack;
298
+
299
+ import android.os.Bundle;
300
+
301
+ import android.util.Log;
302
+
303
+ import android.widget.CompoundButton;
304
+
305
+ import android.widget.CompoundButton.OnCheckedChangeListener;
306
+
307
+ import android.widget.EditText;
308
+
309
+ import android.widget.Switch;
310
+
311
+ import android.widget.TextView;
312
+
313
+
314
+
315
+ public class MainActivity extends Activity implements OnCheckedChangeListener {
316
+
317
+
318
+
319
+ //音を何秒鳴らすか
320
+
321
+ public static final double WHOLE_NOTE = 1.0;
322
+
323
+
324
+
325
+ //信号音の周波数
326
+
327
+ public static final double SIGNAL = 20000;
328
+
329
+ public static final double START = 1000;
330
+
331
+
332
+
333
+ int SENDFREQ;
334
+
335
+ int VOLUME;
336
+
337
+ int SendSR = 44100;
338
+
339
+ int SendBufSize = 44100;
340
+
341
+ int musicVolume = 0;
342
+
343
+
344
+
345
+ AudioManager audioManager;
346
+
347
+ AudioTrack audioTrack = null;
348
+
349
+ private List<SoundDto> soundList = new ArrayList<SoundDto>();
350
+
351
+ Thread send;
352
+
353
+ boolean bIsPlaying = false;
354
+
355
+
356
+
357
+ // Sound生成クラス
358
+
359
+ DigitalSoundGenerator soundGenerator;
360
+
361
+
362
+
363
+ @Override
364
+
365
+ protected void onCreate(Bundle savedInstanceState) {
366
+
367
+ super.onCreate(savedInstanceState);
368
+
369
+ setContentView(R.layout.activity_main);
370
+
371
+
372
+
373
+ TextView SendfreqText = findViewById(R.id.SendfreqText);
374
+
375
+ SendfreqText.setText(R.string.SendfreqText);
376
+
377
+ TextView volumeText = findViewById(R.id.volumeText);
378
+
379
+ volumeText.setText(R.string.volumeText);
380
+
381
+ Switch switch1 = findViewById(R.id.Switch);
382
+
383
+ switch1.setOnCheckedChangeListener(this);
384
+
385
+
386
+
387
+ }
388
+
389
+
390
+
391
+ @Override
392
+
393
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
394
+
395
+
396
+
397
+ if(isChecked) {
398
+
399
+
400
+
401
+ EditText SendfreqEdit = findViewById(R.id.SendfreqEdit);
402
+
403
+ EditText volumeEdit = findViewById(R.id.volumeEdit);
404
+
405
+
406
+
407
+ SENDFREQ = Integer.parseInt(SendfreqEdit.getText().toString());
408
+
409
+ VOLUME = Integer.parseInt(volumeEdit.getText().toString());
410
+
411
+
412
+
413
+ audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
414
+
415
+
416
+
417
+ // SoundGeneratorクラスをサンプルレート44100で作成
418
+
419
+ soundGenerator = new DigitalSoundGenerator(44100, 44100);
420
+
421
+
422
+
423
+ // 再生用AudioTrackは、同じサンプルレートで初期化したものを利用する
424
+
425
+ audioTrack = soundGenerator.getAudioTrack();
426
+
427
+
428
+
429
+ soundList.add(new SoundDto(generateSound(soundGenerator,SIGNAL), WHOLE_NOTE));
430
+
431
+
432
+
433
+ musicVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
434
+
435
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, VOLUME, 0);
436
+
437
+
438
+
439
+ audioTrack.play();
440
+
441
+ bIsPlaying = true;
442
+
443
+ send = new Thread(new Runnable() {
444
+
445
+ @Override
446
+
447
+ public void run() {
448
+
449
+ while(bIsPlaying) {
450
+
451
+ for(SoundDto sound : soundList) {
452
+
453
+ audioTrack.write(sound.getSound(), 0, sound.getSound().length);
454
+
455
+ }
456
+
457
+ }
458
+
459
+ audioTrack.stop();
460
+
461
+ audioTrack.release();
462
+
463
+ }
464
+
465
+ });
466
+
467
+ send.start();
468
+
469
+
470
+
471
+ } else {
472
+
473
+
474
+
475
+ if(audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
476
+
477
+ audioTrack.stop();
478
+
479
+ bIsPlaying = false;
480
+
481
+ }
482
+
483
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0);
484
+
485
+
486
+
487
+ }
488
+
489
+
490
+
491
+ }
492
+
493
+
494
+
79
- /**
495
+ /**
496
+
497
+ * 8ビットのピコピコ音を生成する
498
+
499
+ * @param gen Generator
500
+
501
+ * @param freq 周波数(音階)
502
+
503
+ * @return 音データ
504
+
505
+ */
506
+
507
+ public byte[] generateSound(DigitalSoundGenerator gen, double freq) {
508
+
509
+ return gen.getSound(freq);
510
+
511
+ }
512
+
513
+ }
514
+
515
+ ```
516
+
517
+
518
+
519
+ sound生成
520
+
521
+ ```lang-java
522
+
523
+ package com.example.xxx.sinusoidsender;
524
+
525
+
526
+
527
+ import android.media.AudioFormat;
528
+
529
+ import android.media.AudioManager;
530
+
531
+ import android.media.AudioTrack;
532
+
533
+
534
+
535
+ public class DigitalSoundGenerator {
536
+
537
+
538
+
539
+ private AudioTrack audioTrack;
540
+
541
+
542
+
543
+ private int sampleRate;
544
+
545
+ private int bufferSize;
546
+
547
+
548
+
549
+ /**
550
+
551
+ * コンストラクタ
552
+
553
+ */
554
+
555
+ public DigitalSoundGenerator(int sampleRate, int bufferSize) {
556
+
557
+ this.sampleRate = sampleRate;
558
+
559
+ this.bufferSize = bufferSize;
560
+
561
+
562
+
563
+ // AudioTrackを作成
564
+
565
+ this.audioTrack = new AudioTrack(
566
+
567
+ AudioManager.STREAM_MUSIC,
568
+
569
+ sampleRate,
570
+
571
+ AudioFormat.CHANNEL_OUT_MONO,
572
+
573
+ AudioFormat.ENCODING_PCM_16BIT,
574
+
575
+ bufferSize,
576
+
577
+ AudioTrack.MODE_STREAM);
578
+
579
+ }
580
+
581
+
582
+
583
+ /**
80
584
 
81
585
  * サウンド生成
82
586
 
@@ -134,4 +638,14 @@
134
638
 
135
639
  }
136
640
 
641
+
642
+
643
+ public AudioTrack getAudioTrack() {
644
+
645
+ return this.audioTrack;
646
+
647
+ }
648
+
649
+ }
650
+
137
651
  ```