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

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

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

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

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

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

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

73
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
11.08.2016, 14:05
tip42, для начала определитесь что будет делать программа. просто бесконечно рассчитывать синус от непонятного аргумента? рассчитывать синус от введенного числа? рассчитывать синус и показывать таблицу? график? посылать расчет в космос в виде гравитационных волн?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
11.08.2016, 14:07
Цитата Сообщение от tip42 Посмотреть сообщение
генератор сигнала
В каком виде? Числа? Картинка/анимация? Звук?
0
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
11.08.2016, 16:49  [ТС]
vxg, согласен. извиняюсь. Речь идет о звуковом генераторе сигнала. Который воспроизводит звуковую волну в форме синуса, при чем частоту надо задавать в ручную. Т.е. как я вижу это: поле в котором отображается текущая частота, поле ввода частоты уставки и кнопка старт-стоп, при нажатии на которую начинается воспроизводится звук заданной частоты.
BOGG ART, звука.
0
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
16.08.2016, 12:43
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
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
20.08.2016, 17:58  [ТС]
Цитата Сообщение от 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
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
21.08.2016, 06:40
2REALIST07 Спасибо! В коллекцию...

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

Добавлено через 8 минут
А можно??... Еще окошко/монитор, сделать что бы там форму сигнала выводить на экран? Хотя бы как график. (тут глаза как у кота из Шрека )
0
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
21.08.2016, 16:04
Немного пояснений по коду, 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
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
22.08.2016, 06:09  [ТС]
Цитата Сообщение от Vladimir93 Посмотреть сообщение
Сделайте 2 окошка что бы задать (double freqHz, int durationMs).
Чет не работает.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
22.08.2016, 07:42
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
22.08.2016, 09:19
Цитата Сообщение от Tester64 Посмотреть сообщение
Может кто знает, как подобный AudioTrack записать в файл??? Wav или в mp3???
Отображение содержимого звукового буфера в логах
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
22.08.2016, 10:50
Цитата Сообщение от vxg Посмотреть сообщение
Отображение содержимого звукового буфера в логах.
Это почти побайтово играться!
Надеялся на метод/либу вида
Java
1
saveWav(AudioTrack at)

Не по теме:

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

0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
22.08.2016, 10:52
Цитата Сообщение от Tester64 Посмотреть сообщение
Это почти побайтово играться!
в теме за вас уже написан метод пишущий заголовок. кроме заголовка и ваших данных ничего не нужно
0
Автор FAQ
Автор FAQ
 Аватар для REALIST07
644 / 199 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
22.08.2016, 10:59
Последнее время я добрый, решил дать вам исходники моего проекта небольшого, меня на него все равно кинули,так что пользуйтесь, так как проект большой я заархивировал уровень main,создайте новый проект и скопируйте папки и все будет ок.
Вложения
Тип файла: rar main.rar (63.3 Кб, 53 просмотров)
1
145 / 134 / 22
Регистрация: 28.06.2015
Сообщений: 674
22.08.2016, 11:02
Цитата Сообщение от tip42 Посмотреть сообщение
Чет не работает.
Я сейчас доступа не имею к среде разработки. Могу схематично описать.
Рисуете разметку, на 2 EditText (для частоты и длительности) и кнопку что бы все это запускать. Все, лайот на этом закончен.
Код.
Объявляете, так же две переменных, что бы получить значения и передать в метод (double и int).
Потом, в коде, который выполняться по нажатию кнопки, получаете переменные из EditText и передаете их в метод описанный выше вот таким вот способом
Java
1
2
 AudioTrack at = generateTone(тут double переменная, тут int);
 at.play();
Если не получиться выложите код посмотрим что там не так.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
23.11.2016, 01:30
Здравствуйте. Очень классный генератор звука,но у меня возникли следующие вопросы: 1. Как можно улучшить качество звука,не портя его. Я пробовал использовать прямоугольную волну как у Вас в проекте,подставив одинаковые значения в параметр метода,который возвращает прямоугольную волну для конкретного элемента массива,частоты и частоты дискретизации fase и добился улучшения качества,но на высоких частотах слышны гармоники,т.е начинают наслаиваться неизвестно откуда взявшиеся низкие частоты.
2. Я пытался генерировать один звук с разными частотами,чтобы добиться плавного изменения частоты. Для этого я использовал режим STREAM класса AudioTrack,и в цикле воспроизводил и записывал новые данные в буфер аудиотрека,используя play и write методы. Всё работает прекрасно,т.е частота меняется плавно,но во время воспроизведения звука слышен треск. Подскажите пожалуйста,как правильно генерировать звук с изменяющейся частотой,чтобы не было слышно треска и звук менялся плавно. Для генерации звука я использовал функцию x*x,при этом x менялся от 0 до 100 с шагом 0.1. Частота звука равна именно этой функции.
3. Можно ли как-то более тонко управлять каналами,используя AudioTrack,т.е сделать так,чтобы звук перетекал плавно из левого канала в правый и наоборот,или звучал не вправом или левом канале а где-то посередине сверху. В общем я хочу сделать что-то вроде 3d звука.
4. Можно ли как-то генерировать и воспроизводить одновременно несколько звуков на разных частотах используя класс audiotrack? Заранее благодарю всех за помощь.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
23.11.2016, 08:59
КАВ
1 не совсем понятно о какой волне речь
2 щелчки обычно появляются при нестыковке амплитуд во время переключения, надо смотреть код
3 можно управлять балансом громкости L/R
4 можно запустив параллельно воспроизведение нескольких звуков
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
23.11.2016, 12:52
Здравствуйте. 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
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
23.11.2016, 13:37
КАВ
1 обычно сигнал синусоидальный или у вас по другому? так или иначе неограниченно увеличивая частоту вы можете достигнуть частоты близкой к той на которой работает железо формирующее звук. в этом случае могут появится артефакты.
2 функция sound генерирует блок данных которые суть сигнал заданной частоты и продолжительности. если продолжительность не кратна периоду колебаний, то в момент окончания ваш сигнал будет иметь ненулевую амплитуду в то время как продолжающий его сигнал другой частоты начинается с нулевой амплитуды. согласуйте амплитуды и направления изменения амплитуд заложив в процедуру генерации сигнала начальную фазу.
3 MediaPlayer метод setVolume наверное
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2016, 13:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru