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

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

Войти
Регистрация
Восстановить пароль
 
 
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 17
#1

Генератор звукового сигнала - Android

11.08.2016, 12:38. Просмотров 2189. Ответов 73
Метки нет (Все метки)

Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало. Если у кого-то есть желание, может в личку написать, может договоримся.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
11.08.2016, 14:05     Генератор звукового сигнала #2
tip42, для начала определитесь что будет делать программа. просто бесконечно рассчитывать синус от непонятного аргумента? рассчитывать синус от введенного числа? рассчитывать синус и показывать таблицу? график? посылать расчет в космос в виде гравитационных волн?
BOGG ART
483 / 409 / 120
Регистрация: 09.12.2013
Сообщений: 2,175
Записей в блоге: 2
11.08.2016, 14:07     Генератор звукового сигнала #3
Цитата Сообщение от tip42 Посмотреть сообщение
генератор сигнала
В каком виде? Числа? Картинка/анимация? Звук?
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 17
11.08.2016, 16:49  [ТС]     Генератор звукового сигнала #4
vxg, согласен. извиняюсь. Речь идет о звуковом генераторе сигнала. Который воспроизводит звуковую волну в форме синуса, при чем частоту надо задавать в ручную. Т.е. как я вижу это: поле в котором отображается текущая частота, поле ввода частоты уставки и кнопка старт-стоп, при нажатии на которую начинается воспроизводится звук заданной частоты.
BOGG ART, звука.
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
16.08.2016, 12:43     Генератор звукового сигнала #5
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;
            samples[i + 1] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        return track;
    }
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 17
20.08.2016, 17:58  [ТС]     Генератор звукового сигнала #6
Цитата Сообщение от REALIST07 Посмотреть сообщение
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;
            samples[i + 1] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        return track;
    }
а в Layout > MainActivity что писать?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
21.08.2016, 06:40     Генератор звукового сигнала #7
2REALIST07 Спасибо! В коллекцию...

Цитата Сообщение от tip42 Посмотреть сообщение
а в Layout > MainActivity что писать?
JSON
1
2
        AudioTrack at = generateTone(5000, 1000);
        at.play();
Vladimir93
35 / 35 / 4
Регистрация: 28.06.2015
Сообщений: 135
21.08.2016, 12:45     Генератор звукового сигнала #8
Цитата Сообщение от tip42 Посмотреть сообщение
а в Layout > MainActivity что писать?
Сделайте 2 окошка что бы задать (double freqHz, int durationMs). Или "крутилочку" частоту например задавать.

Добавлено через 8 минут
А можно??... Еще окошко/монитор, сделать что бы там форму сигнала выводить на экран? Хотя бы как график. (тут глаза как у кота из Шрека )
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
21.08.2016, 16:04     Генератор звукового сигнала #9
Немного пояснений по коду, 1 параметр частота дискретизации, измеряемая в Гц, 2 продолжительность "проигрывания" в миллисекундах, обратите внимание на :
Java
1
2
samples[i + 0] = sample;
samples[i + 1] = sample;
Вы пишите в правую и левую сторону одинаковые данные и этот звук будет в стерео формате, если вам нужен моно, уберите 2 операнд и измените строчку:
Java
1
2
3
AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 17
22.08.2016, 06:09  [ТС]     Генератор звукового сигнала #10
Цитата Сообщение от Vladimir93 Посмотреть сообщение
Сделайте 2 окошка что бы задать (double freqHz, int durationMs).
Чет не работает.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.08.2016, 07:42     Генератор звукового сигнала #11
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
22.08.2016, 09:19     Генератор звукового сигнала #12
Цитата Сообщение от Tester64 Посмотреть сообщение
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
Отображение содержимого звукового буфера в логах
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
22.08.2016, 10:50     Генератор звукового сигнала #13
Цитата Сообщение от vxg Посмотреть сообщение
Отображение содержимого звукового буфера в логах.
Это почти побайтово играться!
Надеялся на метод/либу вида
Java
1
saveWav(AudioTrack at)

Не по теме:

Немного поигрался с генерацией сигнала через generateTone.
Попробовал сгенерировать сигналы по https://ru.wikipedia.org/wiki/DTMF
А проверить нечем! Есть проигрыватель foobar2000 который отображает частоты на ленте.
Проверил образцы OGG c wiki - красиво видны 2 полосы.
Теперь хочу сверить с тем что сам нагенерировал в андроиде...
Похоже простого метода создать аудиофайл кроме как "записать с микрофона" нет!
Прийдется побайтово Wav писать...(целая наука о форматах аудио-файлах)

vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
22.08.2016, 10:52     Генератор звукового сигнала #14
Цитата Сообщение от Tester64 Посмотреть сообщение
Это почти побайтово играться!
в теме за вас уже написан метод пишущий заголовок. кроме заголовка и ваших данных ничего не нужно
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
22.08.2016, 10:59     Генератор звукового сигнала #15
Последнее время я добрый, решил дать вам исходники моего проекта небольшого, меня на него все равно кинули,так что пользуйтесь, так как проект большой я заархивировал уровень main,создайте новый проект и скопируйте папки и все будет ок.
Вложения
Тип файла: rar main.rar (63.3 Кб, 15 просмотров)
Vladimir93
35 / 35 / 4
Регистрация: 28.06.2015
Сообщений: 135
22.08.2016, 11:02     Генератор звукового сигнала #16
Цитата Сообщение от tip42 Посмотреть сообщение
Чет не работает.
Я сейчас доступа не имею к среде разработки. Могу схематично описать.
Рисуете разметку, на 2 EditText (для частоты и длительности) и кнопку что бы все это запускать. Все, лайот на этом закончен.
Код.
Объявляете, так же две переменных, что бы получить значения и передать в метод (double и int).
Потом, в коде, который выполняться по нажатию кнопки, получаете переменные из EditText и передаете их в метод описанный выше вот таким вот способом
Java
1
2
 AudioTrack at = generateTone(тут double переменная, тут int);
 at.play();
Если не получиться выложите код посмотрим что там не так.
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
23.11.2016, 01:30     Генератор звукового сигнала #17
Здравствуйте. Очень классный генератор звука,но у меня возникли следующие вопросы: 1. Как можно улучшить качество звука,не портя его. Я пробовал использовать прямоугольную волну как у Вас в проекте,подставив одинаковые значения в параметр метода,который возвращает прямоугольную волну для конкретного элемента массива,частоты и частоты дискретизации fase и добился улучшения качества,но на высоких частотах слышны гармоники,т.е начинают наслаиваться неизвестно откуда взявшиеся низкие частоты.
2. Я пытался генерировать один звук с разными частотами,чтобы добиться плавного изменения частоты. Для этого я использовал режим STREAM класса AudioTrack,и в цикле воспроизводил и записывал новые данные в буфер аудиотрека,используя play и write методы. Всё работает прекрасно,т.е частота меняется плавно,но во время воспроизведения звука слышен треск. Подскажите пожалуйста,как правильно генерировать звук с изменяющейся частотой,чтобы не было слышно треска и звук менялся плавно. Для генерации звука я использовал функцию x*x,при этом x менялся от 0 до 100 с шагом 0.1. Частота звука равна именно этой функции.
3. Можно ли как-то более тонко управлять каналами,используя AudioTrack,т.е сделать так,чтобы звук перетекал плавно из левого канала в правый и наоборот,или звучал не вправом или левом канале а где-то посередине сверху. В общем я хочу сделать что-то вроде 3d звука.
4. Можно ли как-то генерировать и воспроизводить одновременно несколько звуков на разных частотах используя класс audiotrack? Заранее благодарю всех за помощь.
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
23.11.2016, 08:59     Генератор звукового сигнала #18
КАВ
1 не совсем понятно о какой волне речь
2 щелчки обычно появляются при нестыковке амплитуд во время переключения, надо смотреть код
3 можно управлять балансом громкости L/R
4 можно запустив параллельно воспроизведение нескольких звуков
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
23.11.2016, 12:52     Генератор звукового сигнала #19
Здравствуйте. 1. Гармоники возникают при использовании прямоугольной волны.
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
class beeper {
public static short[] sample;
public static AudioTrack audioTrack;
public static void createAudioTrack() {
if(audioTrack==null) {
audioTrack=new AudioTrack(AudioManager.STREAM_MUSIC,48000, AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT,sample.length*(Short.SIZE / 8), AudioTrack.MODE_STREAM,AudioTrack.STATE_INITIALIZED);
if(Build.VERSION.SDK_INT<21 ) audioTrack.setStereoVolume(AudioTrack.getMaxVolume(),AudioTrack.getMaxVolume()); else audioTrack.setVolume(AudioTrack.getMaxVolume());
}
}
private static short getSquareSignalPerTact(int tact ,double freqHz,double mPhase) {
// Используется для генерации звука с помощью прямоугольной волны,но я не использую этот метод,из-за проблемы,о которой я писал выше.
return Math.sin(mPhase+(2 * Math.PI * tact / (((double) 48000)/ freqHz))) < 0 ? Short.MIN_VALUE : Short.MAX_VALUE;
}
static void sound(double frequency,double durationMs) {
sample = new short[(int)(2*48000*durationMs/1000)];
for (int i = 0; i < sample.length; i+=2) {
sample[i] = (short) (Math.sin(2* Math.PI * i / (48000/frequency))*0x7FFF);
sample[i+1] = (short) (Math.sin(2* Math.PI * i / (48000/frequency))*0x7FFF);
}
createAudioTrack();
audioTrack.play();
audioTrack.write(sample, 0, sample.length);
}
public static void audioTrackdestroy() {
    if (audioTrack != null) {
audioTrack.stop();
audioTrack.flush();
audioTrack.release();
audioTrack = null;
}
}
}
Так как в классе MainActivity используется генерация звука только в одной кнопке,далее будет её код. переменные a,b,steppchange и result типа double,а также thread и другие переменные объявлены в начале класса. Во избежании неточности при вычислении значений функции x*x,которая связана с ошибками округления в типе double,я округляю полученное значение до 4-х знаков. Чтобы избежать тормозов,я обернул мой код,который генерирует звук,в thread.
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
public void button0 (View view) {
try {
a=Double.valueOf(edit1.getText().toString());
b=Double.valueOf(edit2.getText().toString());
canbuildfunction=true;
}
catch (NumberFormatException e) {
canbuildfunction =false;
show(getString(R.string.NumberFormatException));
}
if(canbuildfunction) {
if(a<b) steppchange=0.1; else if(a>b) steppchange=-0.1; else steppchange =0;
thread=new Thread(new Runnable() {
@Override
public void run() {
while((a<b && steppchange>0) || (a>b &&steppchange<0)) {
build=true;
a=new BigDecimal(a).setScale(4, BigDecimal.ROUND_HALF_DOWN).doubleValue();
result=new BigDecimal(a*a).setScale(4, BigDecimal.ROUND_HALF_DOWN).doubleValue();
if(canbuildfunction && result>=0) beeper.sound(result+100,200); else if(canbuildfunction &&result<0) beeper.sound(result-100,200);
show(getString(R.string.x)+a+","+getString(R.string.y)+result);
a+=steppchange;
}
}
});
}
}
3. Подскажите пожалуйста,если знайте,как управлять балансом в audiotrack и как одновременно воспроизводить несколько звуков. Заранее благодарю всех за помощь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 13:37     Генератор звукового сигнала
Еще ссылки по теме:

Android Сделать звуковой генератор
Генератор / сборник иконок Android
Android Непрерывная генерация сигнала
Android Запустить приложение при поступлении сигнала
Генератор звука нужной частоты Android

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3057 / 1859 / 195
Регистрация: 13.01.2012
Сообщений: 7,064
23.11.2016, 13:37     Генератор звукового сигнала #20
КАВ
1 обычно сигнал синусоидальный или у вас по другому? так или иначе неограниченно увеличивая частоту вы можете достигнуть частоты близкой к той на которой работает железо формирующее звук. в этом случае могут появится артефакты.
2 функция sound генерирует блок данных которые суть сигнал заданной частоты и продолжительности. если продолжительность не кратна периоду колебаний, то в момент окончания ваш сигнал будет иметь ненулевую амплитуду в то время как продолжающий его сигнал другой частоты начинается с нулевой амплитуды. согласуйте амплитуды и направления изменения амплитуд заложив в процедуру генерации сигнала начальную фазу.
3 MediaPlayer метод setVolume наверное
Yandex
Объявления
23.11.2016, 13:37     Генератор звукового сигнала
Ответ Создать тему
Опции темы

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