Страница 1 из 1

Генерация звукового сигнала на определённой частоте и с опре

Добавлено: 29 май 2016, 23:01
Александр Козловский
Всех приветствую. Подскажите пожалуйста как сгенерить звук на определённой частоте и с определённой длительностью в android. в windows для этого вроде была функция beep,а для андроида я ничего похожего не нашёл. Заранее огромное спасибо всем за помощь.

Re: Генерация звукового сигнала на определённой частоте и с

Добавлено: 30 май 2016, 14:14
Sergey777
Александр Козловский писал(а):Всех приветствую. Подскажите пожалуйста как сгенерить звук на определённой частоте и с определённой длительностью в android. в windows для этого вроде была функция beep,а для андроида я ничего похожего не нашёл. Заранее огромное спасибо всем за помощь.
http://marblemice.blogspot.ru/2010/04/g ... droid.html

Re: Генерация звукового сигнала на определённой частоте и с

Добавлено: 30 май 2016, 20:18
Александр Козловский
Здравствуйте Сергей. Огромное Вам спасибо за ссылку на код. Не могли бы Вы пожалуйста подсказать,как сделать звук с частотой дискретизации 48000. Там где было 8000 я заменил на 48000 и в конструкторе аудиотрека написал вмеесто MONO STEREO,но качества звука не улучшается. Вот моя реализация метода на основе кода,ссылку на который Вы дали. Заранее благодарю Вас за помощь.
public static AudioTrack audioTrack;
public void sound(double frequency,double durationMs) {
double a=48000*durationMs/1000;
int array=(int) a;
double sample[] = new double[array];
byte generatedSnd[] = new byte[2*array];
for (int i = 0; i < sample.length; ++i) {
sample[i] = Math.sin(2* Math.PI * i / (48000/frequency));
}
int idx = 0;
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
if (audioTrack == null)
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,48000, AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT,generatedSnd.length, AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}

Re: Генерация звукового сигнала на определённой частоте и с

Добавлено: 30 май 2016, 21:10
Sergey777
Александр Козловский писал(а):Здравствуйте Сергей. Огромное Вам спасибо за ссылку на код. Не могли бы Вы пожалуйста подсказать,как сделать звук с частотой дискретизации 48000. Там где было 8000 я заменил на 48000 и в конструкторе аудиотрека написал вмеесто MONO STEREO,но качества звука не улучшается. Вот моя реализация метода на основе кода,ссылку на который Вы дали. Заранее благодарю Вас за помощь.
public static AudioTrack audioTrack;
public void sound(double frequency,double durationMs) {
double a=48000*durationMs/1000;
int array=(int) a;
double sample[] = new double[array];
byte generatedSnd[] = new byte[2*array];
for (int i = 0; i < sample.length; ++i) {
sample = Math.sin(2* Math.PI * i / (48000/frequency));
}
int idx = 0;
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
if (audioTrack == null)
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,48000, AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT,generatedSnd.length, AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}

При инициализации переменных в начале класса нужно изменить чистоту на нужную Вам:

Код: Выделить всё

// период длительности звучания
private final int duration = 1; // seconds
private final int sampleRate = 8000;
private final int numSamples = duration * sampleRate;
private final double sample[] = new double[numSamples];
// частота звука, в данном случае Ля первой октавы (440 Гц)
private final double freqOfTone = 440; // hz
private EditText testEditText;

Re: Генерация звукового сигнала на определённой частоте и с

Добавлено: 30 май 2016, 21:48
Александр Козловский
Вы меня не так поняли. Я имею ввиду частоту дискретизации в Вашей реализации это private final int sampleRate = 8000; А мне нужно изменить на 48000. Как я ранее писал,я всё это заменил,но качества звука не улучшилось. А так у меня задержка и частота сигнала регулируется и с этим проблем нет. у меня проблема как перевести звук из моно в стерео. О своих попытках я писал в прошлом сообщении и немного упомянул сейчас.