2015-04-26 4 views
0

Если я ошибаюсь, динамик состоит из гибкого металлического листа, который имеет много положений. В Java есть ли способ вручную установить положение динамика? Я ищу что-то в этом направлении:Ручное изменение положения динамика

... 
Speaker.setPosition(byte position); 
// or 
setSpeakerPosition(byte position); 
... 

Заранее благодарен!

+2

Java работает примерно на шесть уровней абстракции над контролем громкоговорителей, который работает на магнитных полях, а не непосредственно на позиции динамика. – chrylis

ответ

2
  1. Вы ошибаетесь. Большинство ораторов не являются металлическими листами. (Если вы хотите понять, как работает обычный динамик, попробуйте следующее: http://electronics.howstuffworks.com/speaker.htm)

  2. Невозможно сделать это (переместите «пластину» в определенную позицию) на Java. Я сомневаюсь, что это возможно даже на аппаратном уровне ... если динамик не был реализован довольно странным образом/дорогостоящим/неэффективным способом. Кроме того, в компьютерной системе типичная компьютерная аудиосистема, между вашей программой и планкой динамика имеется ряд аппаратных и программных компонентов, ни одна из которых не предназначена для использования таким образом.

+0

Спасибо за ответ! Я этого никогда не знал. Итак, теперь я выяснил другое решение моей проблемы! – HyperNeutrino

0

На самом деле в Java есть что-то вроде этого. Вам просто нужно понять, что сам звук этого не делает. Если вы просто установите положение динамика на одно значение и оставьте его, вы услышите максимум короткий импульс, а затем ничего.

Если вы хотите, чтобы он делал шум, он должен был двигаться. Поэтому вы не просто устанавливаете одну позицию. Вы устанавливаете связку, изменяя значение с течением времени. Вот пример:

/** Generates a tone. 
    @param hz Base frequency (neglecting harmonic) of the tone in cycles per second 
    @param msecs The number of milliseconds to play the tone. 
    @param volume Volume, form 0 (mute) to 100 (max). 
    @param addHarmonic Whether to add an harmonic, one octave up. */ 
    public static void generateTone(int hz,int msecs, int volume, boolean addHarmonic) 
    throws LineUnavailableException { 

    float frequency = 44100; 
    byte[] buf; 
    AudioFormat af; 
    if (addHarmonic) { 
     buf = new byte[2]; 
     af = new AudioFormat(frequency,8,2,true,false); 
    } else { 
     buf = new byte[1]; 
     af = new AudioFormat(frequency,8,1,true,false); 
    } 
    SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
    sdl = AudioSystem.getSourceDataLine(af); 
    sdl.open(af); 
    sdl.start(); 
    for(int i=0; i<msecs*frequency/1000; i++){ 
     double angle = i/(frequency/hz)*2.0*Math.PI; 
     buf[0]=(byte)(Math.sin(angle)*volume); 

     if(addHarmonic) { 
     double angle2 = (i)/(frequency/hz)*2.0*Math.PI; 
     buf[1]=(byte)(Math.sin(2*angle2)*volume*0.6); 
     sdl.write(buf,0,2); 
     } else { 
     sdl.write(buf,0,1); 
     } 
    } 
    sdl.drain(); 
    sdl.stop(); 
    sdl.close(); 
    } 

От https://community.oracle.com/thread/1273219

SourceDataLine.write() используется здесь не сильно отличается от Speaker.setPosition() вы воображаемого. Массив байтов (или только один байт при выключении гармоники) записывается в SourceDataLine каждый раз, когда он петли. Величина байта равна амплитуде. В этом случае он колеблется от -100 до 100. Позиция, которую использует динамик, будет прямо пропорциональна этому значению в идеальном динамике. В реальной динамиком это с учетом физической спикеры частотной характеристики:

enter image description here

Частотная характеристика идеального оратора была бы горизонтальная линия от 0 Гц до бесконечности. Если вы играете музыку для собак или горбатых китов, это может быть проблемой. Для большинства людей, хотя это достаточно близко к идеалу для того, что мы способны слышать. Особенно, если вы добавите немного основания и высоких частот, чтобы сгладить его. Тем не менее, это означает, что ваша способность контролировать положение динамика точно ограничена диапазоном частот.

В приведенном выше списке они используют математику для создания очень простого тона звука. В частности, синусоида. Это не будет потрясающе. На самом деле это звучит так, как вы слышите, когда слушаете тест на слух. Но верьте или нет, все, что вы когда-либо слышали, - это действительно много простых звуков, подобных этому. Вот что учит нас http://en.wikipedia.org/wiki/Fourier_transform.

enter image description here

generateTone() метод из списка выше, будет в том, что анализ Фурье называет Frequency Domain. Здесь звуковой сигнал определяется на основе частоты (ов). Математика внутри generateTone() преобразует это определение в Time Domain. Здесь аудиосигнал определяется в зависимости от позиций в любой момент времени.SourceDataLine.write() просит, чтобы положение динамиков было поднято до определенного положения.

Таким образом, способ формирования вашего вопроса: какие методы java управляют звуком из домена времени? SourceDataLine.write() является лишь одним из многих, которые работают таким образом. Любой метод, который может воспроизводить sampled audio (записанный с помощью микрофона), работает во временном домене. В любой момент времени он имеет желаемое значение для положения динамиков.

Другие аудио API, такие как MIDI, работают в частотной области. Когда вы нажимаете конкретный ключ на фортепиано, вы просите частоты. Есть детали, которые усложняют это (гармоники, атака, сустейн и т. Д.), Но это основная идея. Попытка построить интересные звуки из математики, как показано выше, - это то, что делают синтезаторы.

Существуют и другие аудиоформаты, в которых байт непосредственно не отражает положение динамика в определенное время. Некоторые делают компрессию. Некоторые из них потеряли. Но, безусловно, существует много аудиоформатов, в которых байт непосредственно отражает положение динамиков. У них есть частота дискретизации, которая просто показывает, как часто измерялась позиция.

В любом случае все это должно в конечном итоге перевести на то, чтобы диафрагма динамиков попала в определенное положение в определенное время.

enter image description here

+1

Ну да ... но вы не можете позиционировать «тарелку» напрямую ... это то, что хочет сделать OP. Шаг или импульсная волна заставит пластину двигаться, но вы не можете надежно позиционировать пластинку. 1) Невозможно выполнить калибровку положения. 2) Динамик не динамически удерживает пластину в положении, поэтому она, скорее всего, «расслабится» до положения покоя с течением времени. –

+0

Я позволю ОР сказать нам, что он хочет сделать. Позиционирование «пластины» - это именно то, что делает аудиосигнал. Удерживать его в одном фиксированном положении в течение длительного времени, ничем не отличается от воспроизведения звука с очень низкой частотой. Насколько хорошо поддерживает один из динамиков, это просто детали оборудования. Java все равно.Также обратите внимание, он никогда не говорил, как часто он будет называть этот метод и меняет стоимость. Поэтому будьте осторожны с тем, что вы предполагаете. – CandiedOrange

+0

ОП рассказал нам, чего он хочет. Методы, которые перемещают «планшет» в позицию, заданную с помощью байта. Я только предполагаю, что он хочет, что он просил ... что (ИМО) является разумным исходным предположением! –

1

A динамик двигается пластина из его точки покоя по отношению к напряжению, приложенному к его клеммам. Положительное напряжение заставляет пластину отойти от катушки, а отрицательное напряжение заставляет ее двигаться ближе. Вы можете подключить батарею с постоянным постоянным напряжением, и пластина выйдет и останется там (до тех пор, пока громкоговоритель не выгорит), поскольку громкоговоритель на данный момент ведет себя как резистор. Нормальные звуковые сигналы имеют характер AC.

Способ, которым компьютерная система управляет динамиком, отправляет серию временных рядов числовых значений на чип, называемый цифро-аналоговым преобразователем, который преобразует каждое конкретное числовое значение в аналоговое напряжение. Затем аналоговое напряжение посылается через усилитель, а затем, наконец, в динамик. Существуют все виды API для создания цифровых сигналов и маршрутизации их в динамик.

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

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

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

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