2016-01-05 2 views
12

Я экспериментировал с созданием звукового сигнала с использованием Java. Я нашел this ответ на SO.Звук гудка Java: Произвести звук некоторых конкретных частот

Я использую код этого ответа для получения звуковых сигналов. Код:

import javax.sound.sampled.*; 
public class Sound 
{ 
    public static float SAMPLE_RATE = 8000f; 
    public static void tone(int hz, int msecs) 
    throws LineUnavailableException 
    { 
     tone(hz, msecs, 1.0); 
    } 

    public static void tone(int hz, int msecs, double vol) 
    throws LineUnavailableException 
    { 
     byte[] buf = new byte[1]; 
     AudioFormat af = new AudioFormat(SAMPLE_RATE,8,1,true,false);  
     SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
     sdl.open(af); 
     sdl.start(); 
     for (int i=0; i < msecs*8; i++) { 
       double angle = i/(SAMPLE_RATE/hz) * 2.0 * Math.PI; 
       buf[0] = (byte)(Math.sin(angle) * 127.0 * vol); 
       sdl.write(buf,0,1); 
     } 
     sdl.drain(); 
     sdl.stop(); 
     sdl.close(); 
    } 

    public static void main(String[] args) throws Exception { 
     Sound.tone(15000,1000); 
    } 
} 

В методе main я использую Sound.tone(15000,1000); производить звук частоты 15000 Гц играть за 1000 мс

Но, я могу услышать звук, если я меняю до:

  • Sound.tone(1,1000);,.
  • Sound.tone(19999,1000);

С научной точки зрения это невозможно.

  • В первом случае звук должен быть инфразвуковой, и я не должен быть в состоянии воспринимать.
  • Во втором случае я все равно не слышу звук, потому что, поскольку мы стареем, способность слышать имеет тенденцию к уменьшению, и человек примерно моего возраста должен только слышать звук приблизительно 16000 Гц.

Кроме того, я не могу услышать:

  • Sound.tone(0,1000); (несколько, как и ожидалось)
  • Sound.tone(20000,1000);

Так, Как я могу производить звуки некоторых конкретных частот?
Я искал в Интернете, но ничего не мог найти по этому поводу.

Ответы, приведенные перед этим правилом, объясняют, почему это происходит, но не дают ответа, который я хочу.

+0

Вы все еще можете слушать звук, но вы не можете отличить частоту с человеческим глазом, когда они очень маленькие :) –

+2

Но я, конечно, не слышу инфразвукового звука, который, по-видимому, я могу в соответствии с этой программой. – Hackerdarshi

+0

Существует также вероятность того, что компьютеры просто не изготовлены для производства инфра- и ультразвука – Arc676

ответ

3

Только что перепроверяется с помощью гитарного тюнера перед моим динамиком - метод, который вы предоставили, является точной для низких частот.

Однако, если вы получаете слишком низко вы можете услышать обертоны или «заикание» звук из-за динамики не работает слишком велик инфразвук (по крайней мере, я получил это)

На высоких частот, ваш код не вычисляется слишком хорошо - с частотой выборки 8000 выборок в секунду вы быстро создадите «недопустимые» тона для более высоких частот - колебание синусоидальной волны просто случайно будет соответствовать вашей частоте дискретизации. Таким образом, вы получите высоких частот, которые вы можете услышать (в основном потому, что ваши образцы всегда попадают в какое-то ненулевое значение) или не слышат (все ваши образцы возникают в моменты, когда волна проходит через нуль.

Проверить этот цикл (с динамиком на):

public static void main(String[] args) throws Exception { 
    for(int freq = 400; freq < 20000; freq *= 2) { 
     Sound.tone(freq,500); 
    } 
} 

Вы услышите низкий-высокий-низкий-высокий в конце по причинам, только что описал.

Другой тест:

Sound.tone(8000,500); 

абсолютно бесшумно, и

Sound.tone(8001,500); 

производит очень обалденный звук.

+1

Это зависит от того, что вы хотите с этим сделать. Для оповещения пользователей, вероятно, достаточно диапазона 20-3000 Гц. Для более высоких скоростей выборки, хотя расчет угла также недействителен. придется подумать об этом чуть больше. – Jan

+0

Как получить обертоны от волны греха, Ян? Я ничего не вижу в расчетах, которые должны привести к запуску/остановке воспроизведения (заикание). Даже с целым делением прогрессирование угла выглядит так, как будто оно будет плавным. –

8

Что вы испытываете, это явление, известное как наложение. Возможно, вы видели примеры этого в видеоролике, где вращающееся колесо поворачивается медленно или даже вращается в обратном направлении. Это связано с тем, что колесо вращается только немного больше или меньше, чем кратное целому числу витков на видеокадр. Аналогично, если колесо вращает точное число оборотов на кадр, оно будет оставаться неподвижным. Причина, по которой это называется сглаживание, заключается в том, что нет способа узнать , как многие повороты фактически повернуты.

Аудио выборка имеет тот же артефакт и называется теоремой выборки Найквиста, которая в основном указывает, что вы можете представлять только частоты до половины частоты дискретизации (частота nyquist). Выходя за эту частоту, тона начинают отбрасываться (например, поворачивать назад).

При частоте дискретизации 8 кГц частоты от 0 Гц до 4 кГц будут воспроизводиться отлично (синусоидальная частота 4 кГц будет иметь 2 отсчета за период). Вне 4 кГц частоты начнут складываться назад, так что 4001 Гц будет слышен как 3999, 5000 Гц как 3000 Гц и, в конечном счете, 8000 Гц как 0 Гц (отсюда и молчание). Помимо 8 кГц он снова начнет складываться так, чтобы 8001 Гц составлял 1 Гц и так далее.

Ключ отнимает то, что вам нужно выбрать частоту дискретизации, которая, по крайней мере, вдвое превышает максимальную частоту, которую вы планируете воспроизвести.

+4

Если я останусь в этой теме, я могу стать звукоинженером! – hamena314

+0

Но выбор частоты дискретизации ** 40000 ** все еще не решает проблему. Я все еще слышу ниже 20 Гц и до 19999 Гц. – Hackerdarshi

+0

Ваше синусоидальное поколение является немного подозрительным, поскольку 8-битный звук обычно не имеет знака (0-255). Вы должны слушать тон на 1 кГц и сравнить его с https://www.youtube.com/watch?v=3yQcXlvccCI. Если ваш звук не звучит одинаково, вам нужно изменить этот бит '(byte) (Math.sin (angle) * 127.0 * vol);' to '(byte) ((Math.sin (angle) * 127.0 + 127) * vol); ' – jaket

Смежные вопросы