【问题标题】:Audio Equalizer in RubyRuby 中的音频均衡器
【发布时间】:2013-03-20 15:46:19
【问题描述】:

我在 ruby​​ 中工作(嗯,正在玩......),试图创建一些有用的音频工具。不是现场直播,不是像 midi 合成器或现场动作过滤器或 mp3 播放器之类的东西。我正在制作的是打开一个 .wav 文件、修改它并保存它的简单工具。我有很好的发电机(正方形、正弦、噪声、三角形、锯齿等......等等!)。我有一个我觉得很舒服的包络滤波器。我有一个很好的颤音(自动包络滤波器)。

与低通、高通或参数均衡器最接近的东西是进入音频范围的颤音...基本上将频率调高直到颤音在音频范围内。这是一个有趣的声音。

你知道如何在 ruby​​ 中实现参数均衡器吗(最好)?

【问题讨论】:

标签: ruby audio filter wav equalizer


【解决方案1】:

听起来是个有趣的项目。

您可以通过跨样本“模糊”来实现低通滤波器,并通过其他简单的数学实现高通(暂时不记得那是什么)

但是,如果您正在处理音频,您最终会希望将信号转换为频域并返回。最好的开源库是 FFTW3,并且在 gem fftw3 中有一个 Ruby 绑定 - 它可以与 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 . . .

很抱歉,这不是一段功能齐全的代码,但希望能给你足够的指引去玩!

【讨论】:

  • 朝着正确方向迈出的一步非常有帮助,谢谢!所以我想获得 fftw gem,它提供了将波形作为“频域”处理的工具?我以前见过这个。这是声音波形的奇怪变化,声音看起来像一个模糊的、有时是彩色的图像,对吧?
  • 是的 - 在该视图中,frequency_domain_window 变量是单个 1 像素宽的列,您通常将另一个重叠窗口(可能是 256 个样本)作为下一个要处理的对象,建立频率与您的音频的时间图。事实上,对于我对 FFTW3 的使用,就目前而言,我正在转换到频域并查看它。因此,为什么我不知道如何再次回到常规音频样本空间。一个重要的点 - frequency_domain_window 是一个复数数组。 narray.abs 在你需要的几个地方转换回浮点数。
  • 想出了初始的反向变换。 . .添加到答案
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 2015-12-23
  • 2015-02-28
  • 1970-01-01
  • 2016-07-29
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多