Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
#1

Генератор звука нужной частоты - Программирование Android

07.09.2016, 01:42. Просмотров 1819. Ответов 27
Метки нет (Все метки)

Всем привет.
Что то не могу найти на просторах Интернета, как можно воспроизвести звук нужной частоты? Вариант с файлом не подходит, ибо пользователь должен подбирать частоту по его личной благозвучности. Для азбуки Морзе.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2016, 01:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Генератор звука нужной частоты (Программирование Android):

Прочитать данные из нужной БД
Здравствуйте, у меня возник вопрос по поводу чтения данных из нужной БД. В моем...

Подскажите библиотеку для генерации аудиосигнала нужной частоты
Надо задавать частоту, дискретизацию, и тп вид сигнала

Помогите плиз с AVR контроллером выход нужной частоты
Вопрос какой контролдре семейтсва AVR лучше использовать , чтобы при появлении...

Генерация звука по нужной частоте
Здравствуйте, как возможно реализовать генерацию звука по нужной частоте для...

генератор звуковой частоты
Здравствуйте! Есть необходимость собрать генератор на 1кГц, опыта в аналоговой...

Регулируемый генератор высокой частоты на МК
Добрый день! Возникла необходимость быстро включать/отключать нагрузку в...

27
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
07.09.2016, 02:03 #2
Лучший ответ Сообщение было отмечено gvsp как решение

Решение

http://www.cyberforum.ru/android-dev/thread1792511.html
2
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 13:35  [ТС] #3
Tester64, Спасибо. Странно, что нет готового метода, типа Beep ( int Hz, int Ms).

Добавлено через 3 часа 36 минут
Странно. Срабатывает 25 раз. На 26 останавливается приложение:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
 
        int count = (int)( sampleRate * 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 / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        return track;
    }
Вызываю по кнопке или из потока. Разницы нет, на 26 раз зависает.
Java
1
2
AudioTrack at = generateTone(1000, 100); // freqHz, durationMs
            at.play();
Добавлено через 46 минут
В эмуляторе виснет на 31-36 вызове, а в телефоне стабильно на 26. Причём даже если выйти из активности, не не выходить из приложения и потом вернуться в активность, то счётчик до вылета не сбрасывается.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
07.09.2016, 13:44 #4
gvsp, ну так наверное надо освободить ресурсы
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:05  [ТС] #5
vxg, А как? track.stop(); не помог. Больше идей нет.
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
07.09.2016, 14:10 #6
gvsp, как вариант можно записать в файл и считать из него

Добавлено через 15 секунд
В той же теме есть как это делается
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:30  [ТС] #7
Цитата Сообщение от REALIST07 Посмотреть сообщение
как вариант можно записать в файл и считать из него
Не хотелось бы. Это будет время и ресурсы занимать. А нужен мгновенный отклик на клавишу.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
07.09.2016, 15:26 #8
Цитата Сообщение от gvsp Посмотреть сообщение
А как?
Java
1
2
3
4
5
6
7
            try {
                track.pause();
            } catch (IllegalStateException e) {
            }
            track.flush();
            track.release();
            track = null;
1
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 15:44  [ТС] #9
vxg, К сожалению так не работает:
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
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
 
        int count = (int)( sampleRate * 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 / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
        return track;
}
При наличии строчек track.release(); или track = null; вылетает сразу при попытке воспроизвести звук.
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
07.09.2016, 16:09 #10
gvsp, не в обиду братан,но ты программировать вообще умеешь?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
AudioTrack at = generateTone(1000, 100); // freqHz, durationMs
            at.play();
clearMemory(at);
 
void clearMemory(Audiotrack track) {
try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
}
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 17:52  [ТС] #11
REALIST07, Да фактически нет, но написал достаточно не маленькое и не простое приложение. А тут вот опять ничего подходящего не нашёл. Думаю опыта немного есть. Из старого проекта тоже всё возьму. А тут такая засада на ровном месте, простой бип на Яве не сделать. Чёй то всё равно не выходит:
Java
1
2
3
4
5
6
// кнопка RF А
    public void onClickRF(View view) {
            AudioTrack at = generateTone(1000, 100); // freqHz, durationMs freq, durationDot
            at.play();
            clearMemory(at);
    }
Так понятно вылетает ибо онклик выполняет всё одновременно. А если без clearMemory(at);
то at красная, а определять его не хочет - подчёркивает красным. Ну и в track = null track серый;
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
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
        int count = (int)( sampleRate * 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 / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
        track.write(samples, 0, count);
        return track;
        AudioTrack at = generateTone(1000, 100);
        clearMemory(at);
    }
 
    void clearMemory(AudioTrack track) {
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
    }
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
07.09.2016, 19:45 #12
gvsp,

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
// кнопка RF А
    public void onClickRF(View view) {
            AudioTrack at = generateTone(1000, 100); // freqHz, durationMs freq, durationDot
            at.play();
            clearMemory(at);
    }
 
 
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
        int count = (int)( sampleRate * 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 / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
        track.write(samples, 0, count);
        return track;
    }
 
 
void clearMemory(AudioTrack track) {
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
    }
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 21:16  [ТС] #13
REALIST07, У меня так и есть. Но в track = null; - track серый. Ну и звук не выводится потому, что все события онклик обрабатываются одновременно. Попробую вынести в поток.
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
07.09.2016, 22:14 #14
gvsp, дык

Java
1
2
3
4
5
6
7
public void onClickRF(View view) { 
 
     switch(view.getId()) {
    case R.id.button1 : break;
    case R.id.button2 : break;
}
}
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
08.09.2016, 11:46  [ТС] #15
REALIST07, В общем оказалось не так просто. Вот такое, не работает, ибо вторая строчка сразу убивает первую.
Java
1
2
at.play();
clearMemory(at);
Пришлось вынести это дело в потоки и сделать так:
Java
1
2
3
4
5
 AudioTrack at = generateTone(freq, duration); // freqHz, duration
            at.play();
            Thread.sleep(duration); // ждём отработки звука
            clearMemory(at); 
            Thread.sleep(duration); // даём время очистить ресурсы перед выводом следующего звука
Добавлено через 29 минут
Генератор плохо заканчивает звук. Он обрывается со щелчком.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
08.09.2016, 12:20 #16
gvsp, щелчок это потому что в самом конце не нулевая амплитуда. либо обрывайте когда синусоида проходит ноль либо снижайте амплитуду синусоиды до нуля перед выключением либо костылите с громкостью
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
08.09.2016, 14:42  [ТС] #17
В общем кривая какая то метода. Ещё и при первом запуске генератор как бы раскачивается. Звук длительностью менее полусекунды может вообще не проиграть. Да и второй третий короткий звук играет с заметными задержками. Потом работает стабильно, но стоит не генерировать звук более 6 секунд и опять ему разогрев нужен. Пришлось даже добавить, чтобы первый звук проигрывался:
Java
1
2
3
                soundtaskini = new SoundTaskIni();
                soundtaskini.execute();
// далее вызовы нужных звуков
duration около 60 милисекунд.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// инициализатор возбуждения генератора
    class SoundTaskIni extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                AudioTrack at = generateTone(1, duration); // freqHz, durationMs
                at.play();
                Thread.sleep(duration);
                clearMemory(at);
                Thread.sleep(duration);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
08.09.2016, 15:09 #18
Цитата Сообщение от gvsp Посмотреть сообщение
с заметными задержками
все относительно. сколько именно задержки?

Добавлено через 1 минуту
как вариант - не убивать трек, а лишь заменять/добавлять данные
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
08.09.2016, 15:15  [ТС] #19
vxg, ну, если бы не морзянку делал, то и не замечал бы. А так если первой вызывалась точка на 60 миллисекунд, то она вообще не проигрывалась. После введения проигрывания вначале беззвучного файла, стал и первый звук слышен, но всё равно первая точка на 60 мс, почти не отличима от тире на 180 мс. А где то к третьему - четвёртому звуку всё приходит в норму. В общем не критично, но странно.
0
gvsp
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
12.09.2016, 09:35  [ТС] #20
Очень плохо работает, звук не чистый и часто заикается (одну и туже последовательность из звуков 60 мкс, 180 мкс и пауз 60 мкс всё время проигрывает по разному) и в конце звука щелчок. Хотя телефон не такой уж и слабенький. Память и процессор не загружены. Никто не может переделать в прямоугольные импульсы (синусоида сама почти получится индуктивностью динамика, а считать меньше) и с уходом в конце частоты вниз или вверх из области слышимости (чтобы щелчок убрать).
0
12.09.2016, 09:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2016, 09:35
Привет! Вот еще темы с решениями:

Генератор управляемой частоты и скважности
Подскажите пожалуйста есть ли у кого пример генератора на ардуино? Нужно чтобы...

Генератор частоты для пищалки
Доброго времени суток. купил себе пищалку (мини-динамик) на shyp-mm, теперь...

Определение частоты звука
Здравствуйте, очень хочется написать гитарный тюнер, поэтому пока пытаюсь...

Генератор С Регулировкой Частоты И Скважности Импульсов
Всем привет. Помогите пожалуйста. Имеется сварочный инвертор TIG без...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru