Главная » Processing » Быстрое преобразование Фурье в Processing

0

Быстрое преобразование Фурье (БПФ) используется для получения частотного спектра аудиофайла. Библиотека Minim имеет класс, который сделает за вас все вычисления, а вы можете сосредоточиться на рисовании спектра. Узнать больше о быстром преобразовании Фурье можно из статьи Пола Боурка: http://paulbourke.net/ miscellaneous/ dft/. Когда будете на его сайте, взгляните на последние работы Пола. Вы найдете там множество потрясающих геометрических алгоритмов.

Как это делается

Первая часть скетча похожа все предыдущие за исключением нового объекта FFT с тем же размером буфера и частотой семплов, что были указаны раньше.

import ddf.minim.*;

import ddf.minim.signals.*; import ddf.minim.analysis.*; import ddf.minim.effects.*;

Minim minim; AudioPlayer player; FFT fft;

void setup()

{

size( 1024, 480 );

minim = new Minim( this );

player = minim.loadFile("song.mp3", 512 ); player.loop();

fft = new FFT( player.bufferSize(), player.sampleRate() ); background( 255 );

В функции draw() мы пройдемся по буферу fft и выведем на экран все полосы частот. Я не использовал здесь функцию background(), так как я хотел добиться эффекта затухания для показа истории частотного спектра. Эффекта затухания можно добиться выводом на экран прозрачного цветного прямоугольника одного размера с окном.

void draw()

{

fill( 255, 8 ); noStroke();

rect( 0, 0, width, height ); fft.forward( player.mix );

strokeWeight( 4 ); strokeCap( SQUARE ); stroke( 0 );

for ( int i = 0; i < fft.specSize(); i++ ) {

line( i*4, height, i*4, height – fft.getBand( i ) * 20 );

}

}

void stop()

{

player.close(); minim.stop();

super.stop();

}

В результате вы увидите примерно то, что изображено на этом скриншоте. В песне из того примера вы видите мощные низкие частоты и слабые высокие.

Для того, чтобы использовать БПФ, нужно создать объект FFT с таким же размером буфера и частотой сэмплов, что и в аудиоплеере. Вы можете пропустить величины из объекта AudioPlayer через конструктор с помощью следующего кода:

fft = new FFT( player.bufferSize(), player.sampleRate() );

В функции draw() выполняется прямое преобразование в буфере с помощью следующей строки кода. Я использовал оба канала, но вы можете применить методы player.left и player.right и визуализировать спектр каждого канала по отдельности.

fft.forward( player.mix );

Для вывода на экран полос частот вам нужно перебрать значения в объекте FFT методом fft.specSize(). Размер этого спектра вычисляется в объекте FFT как player.bufferSize() / 2 + 1. Получить значение выбранной полосы частот можно методом fft. getBand(). Так как эти величины малы, вам нужно умножить их на некоторое число, чтобы увидеть их на экране.

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии