Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
#1

Непрерывная генерация сигнала - Android

18.04.2016, 11:47. Просмотров 537. Ответов 2
Метки нет (Все метки)

Нужно сделать генератор сигналов, нашел код рабочий:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// originally from [url]http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html[/url]
    // and modified by Steve Pomeroy <steve@staticfree.info>
    private final int duration = 3; // seconds
    private final int sampleRate = 8000;
    private final int numSamples = duration * sampleRate;
    private final double sample[] = new double[numSamples];
    private final double freqOfTone = 440; // hz
 
    private final byte generatedSnd[] = new byte[2 * numSamples];
 
    Handler handler = new Handler();
 
 
 
    @Override
    protected void onResume() {
        super.onResume();
 
        // Use a new tread as this can take a while
        final Thread thread = new Thread(new Runnable() {
            public void run() {
                genTone();
                handler.post(new Runnable() {
 
                    public void run() {
                        playSound();
                    }
                });
            }
        });
        thread.start();
    }
 
    void genTone(){
 
            // fill out the array
            for (int i = 0; i < numSamples; ++i) {
                sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
            }
 
            // convert to 16 bit pcm sound array
            // assumes the sample buffer is normalised.
            int idx = 0;
            for (final double dVal : sample) {
                // scale to maximum amplitude
                final short val = (short) ((dVal * 32767));
                // in 16 bit wav PCM, first byte is the low order byte
                generatedSnd[idx++] = (byte) (val & 0x00ff);
                generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
 
            }
 
    }
 
    void playSound(){
        final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
                AudioTrack.MODE_STATIC);
            audioTrack.write(generatedSnd, 0, generatedSnd.length);
            audioTrack.play();
 
    }
Вопрос - как сделать звук непрерывно звучащим? Я сам баловался с бесконечным циклом,но не помогает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2016, 11:47     Непрерывная генерация сигнала
Посмотрите здесь:

Генерация приложения-визитки Android
Android Генерация rtf/doc файла из имеющейся информации, хранящейся в БД
Android Запись сигнала с антенны телефона
Matlab Генерация сигнала в матлабе
Android Генерация Color Palette
Android Генерация случайных чисел
AVR Генерация треугольного сигнала
Генерация цветовых экранов Android
Генерация R.java в андроид приложениях Android
Генератор звукового сигнала Android
Android Запустить приложение при поступлении сигнала
Android Сбросить координаты GPS при потере сигнала

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
22.04.2016, 10:12  [ТС]     Непрерывная генерация сигнала #2
Решил свою проблему сам, нашел функцию в стерео формате, которая с заданной частотой и временем в миллисекундах воспроизводит синусоиду
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Usage:
//    AudioTrack tone = generateTone(440, 250);
//    tone.play();
//
private AudioTrack generateTone(double freqHz, int durationMs)
{
    int count = (int)(44100.0 * 2.0 * (durationMs / 1000.0)) & ~1;
    short[] samples = new short[count];
    for(int i = 0; i < count; i += 2){
        short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
        samples[i + 0] = sample;
        samples[i + 1] = sample;
    }
    AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
        AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
        count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
    track.write(samples, 0, count);
    return track;
}
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
29.05.2016, 21:54     Непрерывная генерация сигнала #3
А как сделать,чтобы звук играл с частотой дискретизации 48000 hz. Замена с 44100 на 48000 не помогает,т.е звук начинает играть на более высокой частоте,хоть так быть не должно,поскольку частота моего сигнала не меняется. Я понимаю,что 44100 и 48000 не сильно отличаются по качеству,но всё-таки хотелось бы понять,как генерировать звуковой сигнал,используя частоту дискретизации 48000 hz. Также подскажите пожалуйста,как заставить играть звук столько миллисекунд,сколько я захочу. Просто я ввожу в параметры 200 и 1 sound(200,1);,но звуковой сигнал начинает играть бесконечно долго. Ниже будет код метода,который я реализовал на основе Вашего метода. объект Audiotrack я объявил в начале класса. Заранее благодарю Вас за помощь.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[JAVA]public void sound(double frequency,double durationMs) {
int count = (int)(48000.0 * 2.0 * (durationMs / 1000.0)) & ~1;
short[] samples = new short[count];
for(int i = 0; i < count; i += 2){
short sample = (short)(Math.sin(2 * Math.PI * i / (48000.0 / frequency)) * 0x7FFF);
samples[i] = sample;
samples[i + 1] = sample;
}
if (audioTrack == null) {
audioTrack= new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
audioTrack.write(samples, 0, count);
audioTrack.setLoopPoints(0, samples.length/2, -1);
audioTrack.play();
audioTrack=null;
}
}
[/JAVA]
Yandex
Объявления
29.05.2016, 21:54     Непрерывная генерация сигнала
Ответ Создать тему
Опции темы

Текущее время: 12:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru