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

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

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

Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало. Если у кого-то есть желание, может в личку написать, может договоримся.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2016, 12:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Генератор звукового сигнала (Программирование Android):

Передача звукового потока в микрофон
Здравствуйте все форумчане! Хотел бы узнать в какую мне сторону двигаться....

Отображение содержимого звукового буфера в логах
while(!stopped) { short buffer...

Как заполнить заголовок звукового файла?
public class AudioRecord { byte header = new byte; byte channels ;...

Генератор кубиков
Всем привет) Помогите новичку... Познания нулевые и вот решил попробовать...

Генератор String
Добрый день, уважаемые форумчане. Уже который день пытаюсь решить маленькую...

Сделать звуковой генератор
Всем привет. Ребят, как выдать в наушник звук импульсами примерно...

73
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
11.08.2016, 14:05 #2
tip42, для начала определитесь что будет делать программа. просто бесконечно рассчитывать синус от непонятного аргумента? рассчитывать синус от введенного числа? рассчитывать синус и показывать таблицу? график? посылать расчет в космос в виде гравитационных волн?
0
BOGG ART
576 / 444 / 146
Регистрация: 09.12.2013
Сообщений: 2,384
Записей в блоге: 2
11.08.2016, 14:07 #3
Цитата Сообщение от tip42 Посмотреть сообщение
генератор сигнала
В каком виде? Числа? Картинка/анимация? Звук?
0
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
11.08.2016, 16:49  [ТС] #4
vxg, согласен. извиняюсь. Речь идет о звуковом генераторе сигнала. Который воспроизводит звуковую волну в форме синуса, при чем частоту надо задавать в ручную. Т.е. как я вижу это: поле в котором отображается текущая частота, поле ввода частоты уставки и кнопка старт-стоп, при нажатии на которую начинается воспроизводится звук заданной частоты.
BOGG ART, звука.
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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;
    }
3
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
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 что писать?
0
Tester64
396 / 357 / 46
Регистрация: 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();
0
Vladimir93
53 / 54 / 8
Регистрация: 28.06.2015
Сообщений: 229
21.08.2016, 12:45 #8
Цитата Сообщение от tip42 Посмотреть сообщение
а в Layout > MainActivity что писать?
Сделайте 2 окошка что бы задать (double freqHz, int durationMs). Или "крутилочку" частоту например задавать.

Добавлено через 8 минут
А можно??... Еще окошко/монитор, сделать что бы там форму сигнала выводить на экран? Хотя бы как график. (тут глаза как у кота из Шрека )
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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);
0
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
22.08.2016, 06:09  [ТС] #10
Цитата Сообщение от Vladimir93 Посмотреть сообщение
Сделайте 2 окошка что бы задать (double freqHz, int durationMs).
Чет не работает.
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
22.08.2016, 07:42 #11
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
22.08.2016, 09:19 #12
Цитата Сообщение от Tester64 Посмотреть сообщение
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
http://www.cyberforum.ru/android-dev/thread1547665.html#post8172303
1
Tester64
396 / 357 / 46
Регистрация: 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 писать...(целая наука о форматах аудио-файлах)

0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
22.08.2016, 10:52 #14
Цитата Сообщение от Tester64 Посмотреть сообщение
Это почти побайтово играться!
в теме за вас уже написан метод пишущий заголовок. кроме заголовка и ваших данных ничего не нужно
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 10:59 #15
Последнее время я добрый, решил дать вам исходники моего проекта небольшого, меня на него все равно кинули,так что пользуйтесь, так как проект большой я заархивировал уровень main,создайте новый проект и скопируйте папки и все будет ок.
1
Вложения
Тип файла: rar main.rar (63.3 Кб, 21 просмотров)
Vladimir93
53 / 54 / 8
Регистрация: 28.06.2015
Сообщений: 229
22.08.2016, 11:02 #16
Цитата Сообщение от tip42 Посмотреть сообщение
Чет не работает.
Я сейчас доступа не имею к среде разработки. Могу схематично описать.
Рисуете разметку, на 2 EditText (для частоты и длительности) и кнопку что бы все это запускать. Все, лайот на этом закончен.
Код.
Объявляете, так же две переменных, что бы получить значения и передать в метод (double и int).
Потом, в коде, который выполняться по нажатию кнопки, получаете переменные из EditText и передаете их в метод описанный выше вот таким вот способом
Java
1
2
 AudioTrack at = generateTone(тут double переменная, тут int);
 at.play();
Если не получиться выложите код посмотрим что там не так.
0
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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? Заранее благодарю всех за помощь.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
23.11.2016, 08:59 #18
КАВ
1 не совсем понятно о какой волне речь
2 щелчки обычно появляются при нестыковке амплитуд во время переключения, надо смотреть код
3 можно управлять балансом громкости L/R
4 можно запустив параллельно воспроизведение нескольких звуков
0
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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 и как одновременно воспроизводить несколько звуков. Заранее благодарю всех за помощь.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
23.11.2016, 13:37 #20
КАВ
1 обычно сигнал синусоидальный или у вас по другому? так или иначе неограниченно увеличивая частоту вы можете достигнуть частоты близкой к той на которой работает железо формирующее звук. в этом случае могут появится артефакты.
2 функция sound генерирует блок данных которые суть сигнал заданной частоты и продолжительности. если продолжительность не кратна периоду колебаний, то в момент окончания ваш сигнал будет иметь ненулевую амплитуду в то время как продолжающий его сигнал другой частоты начинается с нулевой амплитуды. согласуйте амплитуды и направления изменения амплитуд заложив в процедуру генерации сигнала начальную фазу.
3 MediaPlayer метод setVolume наверное
1
23.11.2016, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 13:37
Привет! Вот еще темы с решениями:

Генератор / сборник иконок
Может кто знает что то типа https://design.google.com/icons/? - но чтобы в...

Фильтрация звукового сигнала
Здравствуйте друзья, пишу работу по фильтрации звуковых сигналов (от шумов). В...

ВЧ фильтрация звукового сигнала
Добрый день! Подскажите, пожалуйста, какой фильтр лучше использовать для ВЧ...

Воспроизведение звукового сигнала
Здравствуйте, меня интересует вопрос как в командной строке воспроизвести...


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

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

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