Эквалайзер звука в Ruby

Я работаю (ну, играю...) в ruby, пытаясь создать несколько полезных звуковых инструментов. Ничего живого, ничего вроде миди-синтезатора, живых фильтров или mp3-плеера. Я делаю простые инструменты, которые открывают файл .wav, изменяют его и сохраняют. У меня есть хорошие генераторы (квадратные, синусоидальные, шумовые, треугольные, пилообразные и т.д... и многое другое!). У меня есть конвертный фильтр, с которым мне удобно. У меня хорошее тремоло (автоматический фильтр огибающей).

Самое близкое, что у меня есть к низкочастотному, высокочастотному или параметрическому эквалайзеру, - это тремоло, которое работает в звуковом диапазоне... в основном, повышая частоту до тех пор, пока тремоло не окажется в диапазоне звуковых частот. Это интересный звук.

Вы знаете, как реализовать параметрический эквалайзер в ruby ​​(желательно)?


person Oswald Roswell    schedule 20.03.2013    source источник
comment
Посмотрите и здесь: dspguide.com.   -  person Neil Slater    schedule 20.03.2013


Ответы (1)


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

Вы можете реализовать фильтры нижних частот, «размыв» образцы, и фильтры высоких частот с помощью других простых математических операций (не могу вспомнить, что это такое на данный момент)

Однако, если вы работаете со звуком, вам в конечном итоге потребуется преобразовать сигналы в частотную область и обратно. Лучшей библиотекой с открытым исходным кодом для этого является FFTW3, и в драгоценном камне есть привязка Ruby fftw3 — она работает с narray, которую, если вы еще не используете, вам все равно следует рассмотреть, поскольку она будет очень хорошо работать при манипулировании массивами из 1000 отдельных образцы.

Чтобы начать преобразование в частотную область:

require 'narray'
require 'fftw3'


# You'll need to feed in real-world data in audio_segment 
# This generates white noise -1.0 to 1.0
audio_segment = 2.0 * ( NArray.float(1024).random() - 0.5 )

# To avoid edges of the window looking like high-frequency changes, 
# you need to apply a window function. This is just a multiplier for  each sampel point
# Look up Hann window on Wikipedia, the maths is very simple.
# hann_window is a simple 1024 NArray of floats, and you can re-use the same one each time 
audio_window = audio_segment * hann_window

# This does FFT magic
frequency_domain_window = FFTW3.fft(audio_window, -1)

# What you do next depends on the processing you need to do. Typically you'll want to
# re-normalise the data (as FFTW doesn't do that for you)
frequency_domain_window *= 1.0/1024

# This is a very crude "notch filter" that reduces amplitude of some mid frequencies
frequency_domain_window[100..200] *= 0.3

#  Convert back to samples in time (but we still are in a Hann window)
processed_audio_window = (FFTW3.ifft( frequency_domain_window, 0 )).real


# Next you need to do an inverse of the Hann window


# After then you'll want to step forward say 256 samples, and repeat the process
# whilst averaging windows together where they overlap . . .

Извините, это не полнофункциональный фрагмент кода, но, надеюсь, он даст вам достаточно указаний, чтобы начать играть!

person Neil Slater    schedule 20.03.2013
comment
Шаг в правильном направлении очень полезен, спасибо! Итак, я хочу получить драгоценный камень fftw, который предоставляет инструменты для работы с сигналами как с частотными областями? Я видел это раньше. Это странно выглядящая вариация звуковых волн, когда звук выглядит как большое нечеткое, иногда цветное изображение, верно? - person Oswald Roswell; 20.03.2013
comment
Да, переменная Frequency_domain_Window представляет собой один столбец шириной в один пиксель в этом представлении, и вы обычно берете другое перекрывающееся окно (возможно, 256 сэмплов) в качестве следующей вещи для обработки, создавая карту частот и времени вашего аудио. Фактически, для моего использования FFTW3, насколько это возможно, я конвертирую в частотную область и смотрю на это. Поэтому я не знаю, как снова вернуться в обычное пространство звуковых сэмплов. Один важный момент — Frequency_domain_window представляет собой массив комплексных чисел. narray.abs преобразует обратно в значения с плавающей запятой в нескольких необходимых вам местах. - person Neil Slater; 20.03.2013
comment
Разобрался с начальным обратным преобразованием. . . добавление к ответу - person Neil Slater; 21.03.2013