Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/48: Рейтинг темы: голосов - 48, средняя оценка - 4.94
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
1

Генератор звука нужной частоты

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

Author24 — интернет-сервис помощи студентам
Всем привет.
Что то не могу найти на просторах Интернета, как можно воспроизвести звук нужной частоты? Вариант с файлом не подходит, ибо пользователь должен подбирать частоту по его личной благозвучности. Для азбуки Морзе.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2016, 01:42
Ответы с готовыми решениями:

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

Нет нужной частоты ОЗУ
Купил ОЗУ CORSAIR Vengeance LPX CMK8GX4M1A2666C16 DDR4 - 8Гб 2666 x2, комп у меня AS Rock A 320M...

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

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

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

Решение

Генератор звукового сигнала
2
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
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
07.09.2016, 13:44 4
gvsp, ну так наверное надо освободить ресурсы
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:05  [ТС] 5
vxg, А как? track.stop(); не помог. Больше идей нет.
0
Автор FAQ
Автор FAQ
200 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
07.09.2016, 14:10 6
gvsp, как вариант можно записать в файл и считать из него

Добавлено через 15 секунд
В той же теме есть как это делается
0
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:30  [ТС] 7
Цитата Сообщение от REALIST07 Посмотреть сообщение
как вариант можно записать в файл и считать из него
Не хотелось бы. Это будет время и ресурсы занимать. А нужен мгновенный отклик на клавишу.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
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
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
Автор FAQ
Автор FAQ
200 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
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
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
Автор FAQ
Автор FAQ
200 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
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
14 / 3 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 21:16  [ТС] 13
REALIST07, У меня так и есть. Но в track = null; - track серый. Ну и звук не выводится потому, что все события онклик обрабатываются одновременно. Попробую вынести в поток.
0
Автор FAQ
Автор FAQ
200 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
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
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
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
08.09.2016, 12:20 16
gvsp, щелчок это потому что в самом конце не нулевая амплитуда. либо обрывайте когда синусоида проходит ноль либо снижайте амплитуду синусоиды до нуля перед выключением либо костылите с громкостью
0
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
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
08.09.2016, 15:09 18
Цитата Сообщение от gvsp Посмотреть сообщение
с заметными задержками
все относительно. сколько именно задержки?

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

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

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

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

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

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

SMH 2G. Генератор синуса низкой частоты
Стоит задача: сделать генератор синуса низкой частоты (скажем, 0,2Гц) и вывести его график на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru