JavaScript:Библиотеки/p5.sound/Класс p5.FFT

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Класс p5.FFT [1]

Описание

FFT расшифровывается как «fast Fourier transform», т.е. «быстрые преобразования Фурье» или «БПФ». Это аналитический алгоритм, «разбирающий» волнообразный сигнал на отдельные звуковые частоты.

Будучи созданным, объект p5.FFT может провести два типа анализа:

  • waveform() – рассчитывает амплитудные значения на временной шкале. Таким образом, каждая позиция в массиве, рассчитанном при помощи этого типа анализа, соответствует определенному (очень короткому) моменту времени (отсчету), и содержит значение, соответствующее этому моменту.
  • analyze() – рассчитывает амплитудные значения на шкале частот. Каждая позиция в массиве, рассчитанном при помощи этого типа анализа, соответствует определенной частоте (высоте звука) – от самой высокой до самой низкой частоты, слышимой человеческим ухом – и содержит значение, соответствующее этой частоте. Используется вместе с getEnergy() для измерения энергии заданной частоты или средней энергии в диапазоне между двумя заданными частотами.

Объект p5.FFT анализирует очень короткий фрагмент звука, называемый «буфером отсчетов», и возвращает массив значений, называемых «отсчетами». По умолчанию массив состоит из 1024 отсчетов. Эту цифру можно поменять, но, чтобы БПФ-алгоритм работал корректно, это должно быть значение от «16» до «16384», являющееся степенью двойки. Реальный размер БПФ-буфера в два раза превышает количество отсчетов, поэтому, например, если задать 1024 отсчета, его реальный размер будет составлять 2048 отсчетов.

Чтобы использовать этот класс, нужно подключить библиотеку p5.sound. Для этого в заголовок своего файла «index.html» впишите следующее:

<script language="javascript" type="text/javascript" src="path/to/p5.sound.js"></script>

Синтаксис

new p5.FFT([smoothing], [bins])

Параметры

smoothing  коэффициент сглаживания результатов анализа. Диапазон допустимых значений: 0.0 <= 1. По умолчанию стоит «0.8». Тип данных  number
bins  размер массива, содержащего результаты анализа. Это значение должно быть в диапазоне от «16» до «16384», а также должно быть степенью двойки. По умолчанию стоит «1024». Тип данных  number

Методы

  • setInput() – задает источник звука для ПБФ-анализа. Если его предоставлено не будет, БПФ проанализирует весь звук в скетче.
  • waveform() – возвращает массив амплитудных значений (в диапазоне от «-1.0» до «+1.0»), представляющий собой «скриншот» считанных данных из одного буфера. Размер этого массива будет равен количеству отсчетов (по умолчанию стоит «1024»). Эту функцию можно использовать для рисования волнообразного звукового сигнала.
  • analyze() – возвращает массив амплитудных значений (в диапазоне между «0» и «255»), разбросанных по шкале частот. Размер этого массива будет равен количеству БПФ-отсчетов (по умолчанию стоит «1024»). Каждая позиция в массиве соответствует некоторой частоте (высоте звука) – от самой высокой до самой низкой частоты, слышимой человеческим ухом – и содержит значение, соответствующее этой частоте. Необходимо вызывать до getEnergy().
  • getEnergy() – возвращает количество так называемой «энергии», которое приходится на заданную частоту или среднее количество энергии между двумя заданными частотами. В качестве параметра используется либо значение (или значения) типа number, соответствующее частоте (в Гц), либо строка (String), соответствующая заранее заданным частотным диапазонам ("bass", "lowMid", "mid", "highMid", "treble"). Возвращает значение в диапазоне между «0» (это значит, что у этой частоты вообще нет энергии) и «255» (максимальная энергия). Примечание: до getEnergy() нужно обязательно вызвать analyze(). Функция analyze() говорит объекту p5.FFT проанализировать частотные данные, а getEnergy() затем использует эти результаты для определения энергии на заданной частоте или среднюю энергию в заданном диапазоне частот.
  • getCentroid() – возвращает спектральный центроид входящего сигнала. Примечание: до getCentroid() нужно обязательно вызвать analyze(). Функция analyze() говорит объекту p5.FFT проанализировать частотные данные, а getCentroid() затем использует результаты анализа, чтобы определить спектральный центроид.
  • smooth() – сглаживает анализ БПФ, беря за основу значение в последнем отсчете.
  • linAverages() – возвращает массив с усредненными значениями для заданного количества частотных диапазонов (количество частот во всех этих диапазонах одинаково). Параметр «N» (т.е. количество диапазонов) по умолчанию имеет значение «16». Примечание: перед linAverages() необходимо обязательно вызвать analyze(). Эта функция говорит объекту p5.FFT проанализировать частотные данные, а linAverages() затем использует результаты, чтобы сгруппировать их в небольшой массив усредненных значений.
  • logAverages() – возвращает массив с усредненными амплитудными значениями для заданного количества октавных частотных диапазонов. Примечание: перед logAverages() нужно обязательно вызвать analyze(). Эта функция говорит объекту p5.FFT проанализировать частотные данные, а logAverages() затем использует результаты, чтобы сгруппировать их в небольшой массив усредненных значений.
  • getOctaveBands() – рассчитывает и возвращает 1/n-октавные полосы частот. По умолчанию параметр «N» имеет значение «3» (т.е. получается 1/3, что дает примерно 31 частотный диапазон), а «fCtr0» – «15.625» (в Гц). В параметре «fCtr0» задается центральная частота какой-либо октавы, служащая границей, ниже которой находятся частотные диапазоны, которые не будут показаны в итоговой выдаче функции.

Пример

№1

function preload(){
  sound = loadSound('assets/Damscray_DancingTiger.mp3');
}

function setup(){
  var cnv = createCanvas(100,100);
  cnv.mouseClicked(togglePlay);
  fft = new p5.FFT();
  sound.amp(0.2);
}

function draw(){
  background(0);

  var spectrum = fft.analyze();
  noStroke();
  fill(0,255,0); // диапазон частот – зеленым цветом
  for (var i = 0; i< spectrum.length; i++){
    var x = map(i, 0, spectrum.length, 0, width);
    var h = -height + map(spectrum[i], 0, 255, height, 0);
    rect(x, height, width / spectrum.length, h )
  }

  var waveform = fft.waveform();
  noFill();
  beginShape();
  stroke(255,0,0); // волновой сигнал – красным цветом
  strokeWeight(1);
  for (var i = 0; i< waveform.length; i++){
    var x = map(i, 0, waveform.length, 0, width);
    var y = map( waveform[i], -1, 1, 0, height);
    vertex(x,y);
  }
  endShape();

  text('click to play/pause', 4, 10);
   //  'кликните, чтобы начать проигрывание или поставить на паузу'
}

// включение/выключение звука при клике на холст:
function togglePlay() {
  if (sound.isPlaying()) {
    sound.pause();
  } else {
    sound.loop();
  }
}

№2

№3

См.также

Внешние ссылки