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

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

Восстановить пароль Регистрация
 
 
tip42
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 17
11.08.2016, 12:38     Генератор звукового сигнала #1
Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало. Если у кого-то есть желание, может в личку написать, может договоримся.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
23.11.2016, 15:54     Генератор звукового сигнала #21
Помогите пожалуйста,как её правильно рассчитать и согласовать. Если Вас не затруднит,дайте пожалуйста пример кода,который делает это. Что касается setVolume,я имею в виду другое. Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 16:22     Генератор звукового сигнала #22
Цитата Сообщение от КАВ Посмотреть сообщение
Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
поставить одинаковую громкость на обоих каналах
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
23.11.2016, 16:47     Генератор звукового сигнала #23
Я Вас не совсем понял. Просто если я поставлю одинаковую громкость на 2 канала,то звук и будет звучать в 2-х каналах,а мне нужно чтобы он звучал,к примеру,посередине. Ещё подскажите пожалуйста,если Вы знайте,формулу для расчёта амплитуды,просто хочется избавиться от щелчков во время воспроизведения звука.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
23.11.2016, 16:56     Генератор звукового сигнала #24
КАВ
про согласование фаз.
пусть есть сигнал y = a sin ( 2 pi (f t + p) ),
a - амплитуда
pi - число пи
f - частота [Гц]
f = 1 / T, T - период [с]
t - время [с]
p - фаза [доли периода]
пусть мы генерируем этот сигнал в течение времени D
на этом времени укладывается n = D / T периодов. так же останется хвост. его можно получить выделив дробную часть n. это хвост будет в долях периода. по этой величине мы сможем понять
-были ли мы на подъеме в области положительных амплитуд (T < 0.25)
-были ли мы на спуске в области положительных амплитуд (0.25 < T < 0.5)
-были ли мы на спуске в области отрицательных амплитуд (0.5 < T < 0.75)
-были ли мы на подъеме в области отрицательных амплитуд (0.75 < T)
амплитуду в конце мы знаем.
область мы знаем.
из уравнения сигнала можно получить фазу которая правильно пристыкует новый сигнал к тому который отзвучал

Добавлено через 1 минуту
КАВ, если громкость одинаковая в обоих каналах человек воспринимает это так как будто источник звука находится между левым и правым динамиком
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
23.11.2016, 23:05     Генератор звукового сигнала #25
Я Вас не совсем понял. Согласно Вашему уравнению y = a*sin ( 2*pi*(f*t + p) f умножается на t,а потом к этому прибавляется p. f по Вашей формуле равно 1/T. Но я не понял,как рассчитать T. Также мне не понятно,чем отличается время D от времени t? Ещё не понятно,какое значение можно подставить в качестве a. Вроде все подставляют 32767,но я не уверен,правильно ли это. Как потом Ваше уравнение применить,учитывая,что у нас есть frequency и samplerate,где frequency - Частота звукового сигнала в герцах,а sampleRate частота дискретизации. Помогите пожалуйста вывести общую формулу для генерации звука в каждом бите,чтобы звуковые сигналы правильно стыковались. Заранее огромное спасибо за помощь.

Добавлено через 4 часа 20 минут
Ещё хочу спросить,что значит начальная фаза. Просто в начале Вы писали,что её нужно задавать,а в последнем сообщении Вы писали,что её нужно вычислять. Если её нужно задавать в формуле,то какую фазу лучше задать? Предыдущие вопросы остаются актуальны.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 09:57     Генератор звукового сигнала #26
КАВ, фазу нужно вычислить по текущему сигналу что бы задать ее следующему сигналу. Период не нужно знать - я просто написал соотношение между частотой и периодом. Период - это время за которое происходит возврат амплитуды в исходное состояние, посмотрите литературу по математике раздел где рисуют графики синуса и подобного. Продолжительность - это то сколько звучит сигнал. А время - это аргумент функции. Если подставить вместо t D получим амплитуду в конце сигнала.

Добавлено через 3 часа 6 минут
КАВ, амплитуду (a) вы можете задать какую вам хочется. задавая 32767 вы просто будете получать 16 битный сигнал с максимальной громкостью (которую потом дополнительно можно будет менять задавая громкость на самом устройстве). что касается дискретизации 48 кГц то тут дело обстоит так: уравнение дает зависимость амплитуды от времени. каждую секунду вы должны разбить на 48 000 отсчетов и посчитать в полученных точках (t) амплитуду

Добавлено через 1 минуту
КАВ, я могу написать за вас код, но тогда я украду у вас радость познания и творения)
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
24.11.2016, 10:29     Генератор звукового сигнала #27
То есть в качестве f можно подставить частоту делённую на частоту дискретизации и в качестве фазы следующего сигнала подставлять фазу предыдущего сигнала,правильно ли я Вас понял? Извините пожалуйста за очень глупый вопрос,но как вывести фазу из того уравнения,которое Вы давали раньше?
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 10:42     Генератор звукового сигнала #28
КАВ
имеем y = a sin ( 2 pi (f t + p) )
для того что бы получить блок данных который будет восприниматься устройством как звук с частотой дискретизации 48 кГц продолжительностью D мы считаем y для t равного
0
dt
dt * 2
dt * 3
...
D
где
dt = 1 / 48000 - float естественно
в самом конце мы будем иметь
y = a sin ( 2 pi (f D + p) ) - мы подставили вместо t значение D
именно с такой начальной амплитуды должен стартовать следующий звук. кроме амплитуды нам нужно знать характер ее изменения что бы не попасть на ситуацию когда она снижалась, а мы будем генерировать звук начинающийся с нужной амплитуды, но при этом она будет возрастать, что может восприниматься человеческим ухом как разновидность артефакта.
выразим фазу из уравнения
очевидно будет что то вроде
p = arcsin (y / a) / (2 pi)
у этой фазы может быть двойник соответствующий такой же амплитуде но другой области. по идее эта фаза будет расположена симметрично "горбу" волны
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
24.11.2016, 12:26     Генератор звукового сигнала #29
Подскажите пожалуйста,как считать фазу для первого сигнала. Пока что я прибавил к нему 0.1 в качестве фазы,но теперь звука вообще не слышно. Ниже будет мой код,который заполняет массив с данными,согласно Вашим рассуждениям.
Java
1
2
3
for (int i = 0; i < sample.length; i++) {
sample[i] = (short) (32767*Math.sin(2* Math.PI*(frequency*i*(float) (1/48000)+0.01))*0x7FFF);
}
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 12:35     Генератор звукового сигнала #30
КАВ, для самого первого фаза может быть какой угодно например ноль. фаза нужна лишь для последующих сигналов. кстати, что бы было быстрее и понятнее - предлагаю вам генерировать звуки с продолжительностью исключительно кратной периоду. тогда они все будут стыковаться по нулевой возрастающей амплитуде и не нужно будет ничего считать. ну а с добавкой +/- периода к времени звучания я думаю кошмара не будет
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
24.11.2016, 13:05     Генератор звукового сигнала #31
Просто хотелось бы понять,почему так,как я написал в коде выше не работает и генерировать звуки не только кратные периоду,но и любой другой длинны
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 13:28     Генератор звукового сигнала #32
КАВ, имхо не цепляйтесь за точную длину - что для вас такого случиться если в самом худшем случае вы получите звук на 60 мс дольше или короче? я вам больше скажу - никто не узнает об этом - ведь это длина блока данных. вы можете выбрать ее любой. вы можете даже плавно менять частоту при генерации блока данных. зато реализация при "удобной" длине этого чисто технического "отреза" звука будет в разы проще
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
24.11.2016, 14:55     Генератор звукового сигнала #33
vxg,

Добавлено через 46 минут
Я исправил формулу для генерации звука,и теперь она выглядит так:
sample[i] = (short) (32767*Math.sin(2* Math.PI*(frequency*i*1/48000))*0x7FFF);
Но когда я подставляю туда амплитуду 32767,звук очень сильно искажается. Также я не совсем понял,как считать фазу для следующего сигнала,ведь Вы писали,что фаза следующего сигнала вычисляется по предыдущему сигналу,но ведь фаза предыдущего сигнала равна 0,значит фаза следующего сигнала тоже будет равна 0.,так как она по Вашим рассуждениям равна фазе предыдущего сигнала. Правильно ли я Вас понял,что фаза должна меняться в каждом бите.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 15:09     Генератор звукового сигнала #34
КАВ, зачем вы дважды умножаете на амплитуду? 32767 = 0x7FFF. сейчас нарисую для тех кто думает глазом
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 16:09     Генератор звукового сигнала #35
КАВ, см рисунок
на нем два сигнала:
-первый сигнал (синий) с частотой 1 Гц имеет период 1 с (по оси икс отложено время по оси игрек уровень сигнала)
-второй сигнал (красный) с частотой 2 Гц имеет период 2 с
стыкуем их:
-на первом мы стыкуем сигналы как попало - в результате в точке переключения имеем щелчок связанный с тем что уровень сигнала меняется скачком
-на втором рисунке мы стыкуем при помощи первой вычисленной фазы - видно что вычисленных фаз две - они расположены симметрично экстремума - обе фазы подходят нам по уровню сигнала однако видно что первая фаза меняется не в том направлении
-на третьем рисунке мы стыкуем при помощи второй вычисленной фазы - она правильно продолжает форму кривой
-на четвертом рисунке мы стыкуем при помощи подбора длительности - незначительно сократив длительность первого сигнала мы сделали ее кратной периоду - благодаря этому в точке стыковки мы сразу имеем одинаковый уровень сигнала (ноль) и верное направление изменения сигнала
Миниатюры
Генератор звукового сигнала  
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
24.11.2016, 16:17     Генератор звукового сигнала #36
...естественно второй сигнал думает что отсчет времени для него пошел с нуля, а не с 2,4 с
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
25.11.2016, 10:00     Генератор звукового сигнала #37
Огромное Вам спасибо за пояснение. Просто когда мне нужно было сгенерировать звуковой сигнал,я искал в нете генераторы звука,но не понимал формулы,которые используются в коде и как это работает. Теперь благодаря Вам я начал понимать,как это работает. Помогите всё-таки пожалуйста с кодом. Просто раз я уже начал разбираться с этим,хочется разобраться,как это работает. Я по Вашим рассуждениям доработал код,но треск так и остался. Его неслышно только первые несколько звуков. Переменную с фазой я объявил в классе. Заранее благодарю Вас за помощь и за понимание ситуации.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void sound(double frequency,double durationMs) {
    sample = new short[(int)(2*48000*durationMs/1000)];
    phase=Math.asin(sample[sample.length-1]/32767)/(2*Math.PI)-frequency/sample.length;
    for (int i = 0; i < sample.length; i++) {
        sample[i] = (short) (32767*Math.sin(2* Math.PI*(frequency*i/48000+phase)));
    }
    createAudioTrack();
    if(audioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) audioTrack.play();
    audioTrack.write(sample, 0, sample.length);
}
public static void audioTrackdestroy() {
    if (audioTrack != null) {
        audioTrack.stop();
        audioTrack.flush();
        audioTrack.release();
        audioTrack = null;
    }
}
 Комментарий модератора 
Используйте теги для выделения кода

Добавлено через 14 часов 14 минут
Кстати какую задержки Вы бы посоветовали поставить,близкую к 200 мс,чтобы не было щелчков? Просто может проблема совсем не в том,что Вы говорили. Если ближайшая задержка,которая подходит для генерации звука больше 1000,То напишите пожалуйста код,который правильно генерирует звуки. Заранее благодарю Вас за помощь.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
25.11.2016, 10:35     Генератор звукового сигнала #38
Цитата Сообщение от КАВ Посмотреть сообщение
Кстати какую задержки Вы бы посоветовали поставить,близкую к 200 мс,чтобы не было щелчков?
о какой задержке речь?
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
25.11.2016, 10:38     Генератор звукового сигнала #39
Задержка звука
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 10:47     Генератор звукового сигнала
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
25.11.2016, 10:47     Генератор звукового сигнала #40
Цитата Сообщение от КАВ Посмотреть сообщение
Задержка звука
OMG. где она у вас и зачем она вам?
Yandex
Объявления
25.11.2016, 10:47     Генератор звукового сигнала
Ответ Создать тему
Опции темы

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