Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/56: Рейтинг темы: голосов - 56, средняя оценка - 4.93
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало. Если у кого-то есть желание, может в личку написать, может договоримся.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2016, 12:38
Ответы с готовыми решениями:

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

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

Отсчёты звукового сигнала
Добрый день! Работаю с wav-файлом в рамках лабораторной работы. Не могу понять, что такое отсчёт звукового сигнала. Заранее спасибо!

73
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
23.11.2016, 15:54
Студворк — интернет-сервис помощи студентам
Помогите пожалуйста,как её правильно рассчитать и согласовать. Если Вас не затруднит,дайте пожалуйста пример кода,который делает это. Что касается setVolume,я имею в виду другое. Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
23.11.2016, 16:22
Цитата Сообщение от КАВ Посмотреть сообщение
Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
поставить одинаковую громкость на обоих каналах
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
23.11.2016, 16:47
Я Вас не совсем понял. Просто если я поставлю одинаковую громкость на 2 канала,то звук и будет звучать в 2-х каналах,а мне нужно чтобы он звучал,к примеру,посередине. Ещё подскажите пожалуйста,если Вы знайте,формулу для расчёта амплитуды,просто хочется избавиться от щелчков во время воспроизведения звука.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
23.11.2016, 16:56
КАВ
про согласование фаз.
пусть есть сигнал 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
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
23.11.2016, 23:05
Я Вас не совсем понял. Согласно Вашему уравнению 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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 09:57
КАВ, фазу нужно вычислить по текущему сигналу что бы задать ее следующему сигналу. Период не нужно знать - я просто написал соотношение между частотой и периодом. Период - это время за которое происходит возврат амплитуды в исходное состояние, посмотрите литературу по математике раздел где рисуют графики синуса и подобного. Продолжительность - это то сколько звучит сигнал. А время - это аргумент функции. Если подставить вместо t D получим амплитуду в конце сигнала.

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

Добавлено через 1 минуту
КАВ, я могу написать за вас код, но тогда я украду у вас радость познания и творения)
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.11.2016, 10:29
То есть в качестве f можно подставить частоту делённую на частоту дискретизации и в качестве фазы следующего сигнала подставлять фазу предыдущего сигнала,правильно ли я Вас понял? Извините пожалуйста за очень глупый вопрос,но как вывести фазу из того уравнения,которое Вы давали раньше?
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 10:42
КАВ
имеем 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
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.11.2016, 12:26
Подскажите пожалуйста,как считать фазу для первого сигнала. Пока что я прибавил к нему 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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 12:35
КАВ, для самого первого фаза может быть какой угодно например ноль. фаза нужна лишь для последующих сигналов. кстати, что бы было быстрее и понятнее - предлагаю вам генерировать звуки с продолжительностью исключительно кратной периоду. тогда они все будут стыковаться по нулевой возрастающей амплитуде и не нужно будет ничего считать. ну а с добавкой +/- периода к времени звучания я думаю кошмара не будет
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.11.2016, 13:05
Просто хотелось бы понять,почему так,как я написал в коде выше не работает и генерировать звуки не только кратные периоду,но и любой другой длинны
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 13:28
КАВ, имхо не цепляйтесь за точную длину - что для вас такого случиться если в самом худшем случае вы получите звук на 60 мс дольше или короче? я вам больше скажу - никто не узнает об этом - ведь это длина блока данных. вы можете выбрать ее любой. вы можете даже плавно менять частоту при генерации блока данных. зато реализация при "удобной" длине этого чисто технического "отреза" звука будет в разы проще
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
24.11.2016, 14:55
vxg,

Добавлено через 46 минут
Я исправил формулу для генерации звука,и теперь она выглядит так:
sample[i] = (short) (32767*Math.sin(2* Math.PI*(frequency*i*1/48000))*0x7FFF);
Но когда я подставляю туда амплитуду 32767,звук очень сильно искажается. Также я не совсем понял,как считать фазу для следующего сигнала,ведь Вы писали,что фаза следующего сигнала вычисляется по предыдущему сигналу,но ведь фаза предыдущего сигнала равна 0,значит фаза следующего сигнала тоже будет равна 0.,так как она по Вашим рассуждениям равна фазе предыдущего сигнала. Правильно ли я Вас понял,что фаза должна меняться в каждом бите.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 15:09
КАВ, зачем вы дважды умножаете на амплитуду? 32767 = 0x7FFF. сейчас нарисую для тех кто думает глазом
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 16:09
КАВ, см рисунок
на нем два сигнала:
-первый сигнал (синий) с частотой 1 Гц имеет период 1 с (по оси икс отложено время по оси игрек уровень сигнала)
-второй сигнал (красный) с частотой 2 Гц имеет период 2 с
стыкуем их:
-на первом мы стыкуем сигналы как попало - в результате в точке переключения имеем щелчок связанный с тем что уровень сигнала меняется скачком
-на втором рисунке мы стыкуем при помощи первой вычисленной фазы - видно что вычисленных фаз две - они расположены симметрично экстремума - обе фазы подходят нам по уровню сигнала однако видно что первая фаза меняется не в том направлении
-на третьем рисунке мы стыкуем при помощи второй вычисленной фазы - она правильно продолжает форму кривой
-на четвертом рисунке мы стыкуем при помощи подбора длительности - незначительно сократив длительность первого сигнала мы сделали ее кратной периоду - благодаря этому в точке стыковки мы сразу имеем одинаковый уровень сигнала (ноль) и верное направление изменения сигнала
Миниатюры
Генератор звукового сигнала  
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.11.2016, 16:17
...естественно второй сигнал думает что отсчет времени для него пошел с нуля, а не с 2,4 с
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.11.2016, 10:00
Огромное Вам спасибо за пояснение. Просто когда мне нужно было сгенерировать звуковой сигнал,я искал в нете генераторы звука,но не понимал формулы,которые используются в коде и как это работает. Теперь благодаря Вам я начал понимать,как это работает. Помогите всё-таки пожалуйста с кодом. Просто раз я уже начал разбираться с этим,хочется разобраться,как это работает. Я по Вашим рассуждениям доработал код,но треск так и остался. Его неслышно только первые несколько звуков. Переменную с фазой я объявил в классе. Заранее благодарю Вас за помощь и за понимание ситуации.
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
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
25.11.2016, 10:35
Цитата Сообщение от КАВ Посмотреть сообщение
Кстати какую задержки Вы бы посоветовали поставить,близкую к 200 мс,чтобы не было щелчков?
о какой задержке речь?
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.11.2016, 10:38
Задержка звука
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
25.11.2016, 10:47
Цитата Сообщение от КАВ Посмотреть сообщение
Задержка звука
OMG. где она у вас и зачем она вам?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2016, 10:47

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

Распознавание звукового сигнала
Здравствуйте, прошу прощения если немного не в тот раздел. Изучаю Data Science, заинтересовался такой вещью - как, имея записанный звуковой...

Визуализация спектра звукового сигнала
Привет всем! Хочу реализовать визуализацию звука. Имеем звук: Нужно подсчитать количество гармоник (на примере их 3) и их...

Спектр цифрового звукового сигнала
Собственно я занимаюсь обработкой сигналов для своей дипломной, но не могу понять как перейти от цифрового сигнала(простой поток...

Считывание частоты звукового сигнала
Думаю все знают, что с помощью Beep() можно воспроизводить звуковой сигнал из заданною частотою. Стоит обратная задача, можно ли как-то...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru