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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
#1

Непрерывная генерация сигнала - Программирование Android

18.04.2016, 11:47. Просмотров 841. Ответов 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// originally from [url]http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html[/url]
    // and modified by Steve Pomeroy <steve@staticfree.info>
    private final int duration = 3; // seconds
    private final int sampleRate = 8000;
    private final int numSamples = duration * sampleRate;
    private final double sample[] = new double[numSamples];
    private final double freqOfTone = 440; // hz
 
    private final byte generatedSnd[] = new byte[2 * numSamples];
 
    Handler handler = new Handler();
 
 
 
    @Override
    protected void onResume() {
        super.onResume();
 
        // Use a new tread as this can take a while
        final Thread thread = new Thread(new Runnable() {
            public void run() {
                genTone();
                handler.post(new Runnable() {
 
                    public void run() {
                        playSound();
                    }
                });
            }
        });
        thread.start();
    }
 
    void genTone(){
 
            // fill out the array
            for (int i = 0; i < numSamples; ++i) {
                sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
            }
 
            // convert to 16 bit pcm sound array
            // assumes the sample buffer is normalised.
            int idx = 0;
            for (final double dVal : sample) {
                // scale to maximum amplitude
                final short val = (short) ((dVal * 32767));
                // in 16 bit wav PCM, first byte is the low order byte
                generatedSnd[idx++] = (byte) (val & 0x00ff);
                generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
 
            }
 
    }
 
    void playSound(){
        final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
                AudioTrack.MODE_STATIC);
            audioTrack.write(generatedSnd, 0, generatedSnd.length);
            audioTrack.play();
 
    }
Вопрос - как сделать звук непрерывно звучащим? Я сам баловался с бесконечным циклом,но не помогает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2016, 11:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непрерывная генерация сигнала (Программирование Android):

Генератор звукового сигнала - Программирование Android
Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало....

Генерация Треугольного Сигнала - Matlab
Привет всем! Кто-то можешь помочь написать код программы для такого вот сигнала?

Генерация треугольного сигнала - AVR
Ребят,подскажите,пожалуйста,верно ли я генерирую данный сигнал? в частности интересуют две строчки ...

Генерация сигнала в матлабе - Matlab
Помогите пожалуйста сгенерировать сигнал такого рода в матлабе: Y(t)=α1X(t) + α2*X(t-Δt) +α3*X(t-2Δt)+α4*X(t-3Δt) X(t)=белый шум; ...

Генерация сигнала и его интерполяция - Matlab
Здравствуйте. Нужно сгенерировать три модели сигнала и провести интерполяцию. Гармонический сигнал, Полиномиальный сигнал,...

Генерация прямоугольного сигнала в Excel - MS Excel
Здравствуйте! Помогите пожалуйста. Как в MS Excel сгенерировать прямоугольный сигнал (имется синусоидальный, может его передалать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
22.04.2016, 10:12  [ТС] #2
Решил свою проблему сам, нашел функцию в стерео формате, которая с заданной частотой и временем в миллисекундах воспроизводит синусоиду
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Usage:
//    AudioTrack tone = generateTone(440, 250);
//    tone.play();
//
private AudioTrack generateTone(double freqHz, int durationMs)
{
    int count = (int)(44100.0 * 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 / (44100.0 / freqHz)) * 0x7FFF);
        samples[i + 0] = sample;
        samples[i + 1] = sample;
    }
    AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
        AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
        count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
    track.write(samples, 0, count);
    return track;
}
1
КАВ
13 / 1 / 0
Регистрация: 16.04.2016
Сообщений: 42
29.05.2016, 21:54 #3
А как сделать,чтобы звук играл с частотой дискретизации 48000 hz. Замена с 44100 на 48000 не помогает,т.е звук начинает играть на более высокой частоте,хоть так быть не должно,поскольку частота моего сигнала не меняется. Я понимаю,что 44100 и 48000 не сильно отличаются по качеству,но всё-таки хотелось бы понять,как генерировать звуковой сигнал,используя частоту дискретизации 48000 hz. Также подскажите пожалуйста,как заставить играть звук столько миллисекунд,сколько я захочу. Просто я ввожу в параметры 200 и 1 sound(200,1);,но звуковой сигнал начинает играть бесконечно долго. Ниже будет код метода,который я реализовал на основе Вашего метода. объект Audiotrack я объявил в начале класса. Заранее благодарю Вас за помощь.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[JAVA]public void sound(double frequency,double durationMs) {
int count = (int)(48000.0 * 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 / (48000.0 / frequency)) * 0x7FFF);
samples[i] = sample;
samples[i + 1] = sample;
}
if (audioTrack == null) {
audioTrack= new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
audioTrack.write(samples, 0, count);
audioTrack.setLoopPoints(0, samples.length/2, -1);
audioTrack.play();
audioTrack=null;
}
}
[/JAVA]
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2016, 21:54
Привет! Вот еще темы с ответами:

Генерация сигнала вложенного объекта - C++ Qt
TInclClass inclClass; emit inclClass.signal_1(); Класс TInclClass является включенным в класс виджета. При попытке послать...

Генерация звукового сигнала (PIC16F873, MPLAB) - Микроконтроллеры
Нужно сделать программу на Ассемблер для микроконтроллера PIC16F873 в MPLAB ( программатор-отладчик PICkit-2) Исходное состояние - все...

Генерация звукового сигнала через Speaker IBM PC - Assembler
Всем привет! Есть готовая программа которая генерирует звуки, но мне задали вопрос что если в MOV AL, 10110110b поменять на MOV AL,...

Извлечение сигнала заданной частоты из более сложного сигнала - Matlab
Нужен совет. Предположим, у меня есть некий сложный сигнал. Я знаю, что в него входит синусоида, которая сохраняет свою амплитуду, затем...


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

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

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