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

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

11.08.2016, 12:38. Просмотров 3357. Ответов 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
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
23.11.2016, 15:54 #21
Помогите пожалуйста,как её правильно рассчитать и согласовать. Если Вас не затруднит,дайте пожалуйста пример кода,который делает это. Что касается setVolume,я имею в виду другое. Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
23.11.2016, 16:22 #22
Цитата Сообщение от КАВ Посмотреть сообщение
Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
поставить одинаковую громкость на обоих каналах
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
23.11.2016, 16:47 #23
Я Вас не совсем понял. Просто если я поставлю одинаковую громкость на 2 канала,то звук и будет звучать в 2-х каналах,а мне нужно чтобы он звучал,к примеру,посередине. Ещё подскажите пожалуйста,если Вы знайте,формулу для расчёта амплитуды,просто хочется избавиться от щелчков во время воспроизведения звука.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
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 минуту
КАВ, если громкость одинаковая в обоих каналах человек воспринимает это так как будто источник звука находится между левым и правым динамиком
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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 минут
Ещё хочу спросить,что значит начальная фаза. Просто в начале Вы писали,что её нужно задавать,а в последнем сообщении Вы писали,что её нужно вычислять. Если её нужно задавать в формуле,то какую фазу лучше задать? Предыдущие вопросы остаются актуальны.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 09:57 #26
КАВ, фазу нужно вычислить по текущему сигналу что бы задать ее следующему сигналу. Период не нужно знать - я просто написал соотношение между частотой и периодом. Период - это время за которое происходит возврат амплитуды в исходное состояние, посмотрите литературу по математике раздел где рисуют графики синуса и подобного. Продолжительность - это то сколько звучит сигнал. А время - это аргумент функции. Если подставить вместо t D получим амплитуду в конце сигнала.

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

Добавлено через 1 минуту
КАВ, я могу написать за вас код, но тогда я украду у вас радость познания и творения)
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
24.11.2016, 10:29 #27
То есть в качестве f можно подставить частоту делённую на частоту дискретизации и в качестве фазы следующего сигнала подставлять фазу предыдущего сигнала,правильно ли я Вас понял? Извините пожалуйста за очень глупый вопрос,но как вывести фазу из того уравнения,которое Вы давали раньше?
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
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)
у этой фазы может быть двойник соответствующий такой же амплитуде но другой области. по идее эта фаза будет расположена симметрично "горбу" волны
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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);
}
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 12:35 #30
КАВ, для самого первого фаза может быть какой угодно например ноль. фаза нужна лишь для последующих сигналов. кстати, что бы было быстрее и понятнее - предлагаю вам генерировать звуки с продолжительностью исключительно кратной периоду. тогда они все будут стыковаться по нулевой возрастающей амплитуде и не нужно будет ничего считать. ну а с добавкой +/- периода к времени звучания я думаю кошмара не будет
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
24.11.2016, 13:05 #31
Просто хотелось бы понять,почему так,как я написал в коде выше не работает и генерировать звуки не только кратные периоду,но и любой другой длинны
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 13:28 #32
КАВ, имхо не цепляйтесь за точную длину - что для вас такого случиться если в самом худшем случае вы получите звук на 60 мс дольше или короче? я вам больше скажу - никто не узнает об этом - ведь это длина блока данных. вы можете выбрать ее любой. вы можете даже плавно менять частоту при генерации блока данных. зато реализация при "удобной" длине этого чисто технического "отреза" звука будет в разы проще
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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.,так как она по Вашим рассуждениям равна фазе предыдущего сигнала. Правильно ли я Вас понял,что фаза должна меняться в каждом бите.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 15:09 #34
КАВ, зачем вы дважды умножаете на амплитуду? 32767 = 0x7FFF. сейчас нарисую для тех кто думает глазом
1
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 16:09 #35
КАВ, см рисунок
на нем два сигнала:
-первый сигнал (синий) с частотой 1 Гц имеет период 1 с (по оси икс отложено время по оси игрек уровень сигнала)
-второй сигнал (красный) с частотой 2 Гц имеет период 2 с
стыкуем их:
-на первом мы стыкуем сигналы как попало - в результате в точке переключения имеем щелчок связанный с тем что уровень сигнала меняется скачком
-на втором рисунке мы стыкуем при помощи первой вычисленной фазы - видно что вычисленных фаз две - они расположены симметрично экстремума - обе фазы подходят нам по уровню сигнала однако видно что первая фаза меняется не в том направлении
-на третьем рисунке мы стыкуем при помощи второй вычисленной фазы - она правильно продолжает форму кривой
-на четвертом рисунке мы стыкуем при помощи подбора длительности - незначительно сократив длительность первого сигнала мы сделали ее кратной периоду - благодаря этому в точке стыковки мы сразу имеем одинаковый уровень сигнала (ноль) и верное направление изменения сигнала
1
Миниатюры
Генератор звукового сигнала  
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
24.11.2016, 16:17 #36
...естественно второй сигнал думает что отсчет времени для него пошел с нуля, а не с 2,4 с
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
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,То напишите пожалуйста код,который правильно генерирует звуки. Заранее благодарю Вас за помощь.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
25.11.2016, 10:35 #38
Цитата Сообщение от КАВ Посмотреть сообщение
Кстати какую задержки Вы бы посоветовали поставить,близкую к 200 мс,чтобы не было щелчков?
о какой задержке речь?
1
КАВ
13 / 1 / 1
Регистрация: 16.04.2016
Сообщений: 72
25.11.2016, 10:38 #39
Задержка звука
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
25.11.2016, 10:47 #40
Цитата Сообщение от КАВ Посмотреть сообщение
Задержка звука
OMG. где она у вас и зачем она вам?
1
25.11.2016, 10:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 10:47
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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