我想出了一个关于音频项目的想法,看起来Go是一种实用它的有用语言。但是,它需要能够将过滤器应用于传入音频,而Go似乎没有任何类型的音频处理包。我可以使用cgo来调用C代码,但我找到的每个信号处理库都使用cgo无法处理的C ++类。看起来libsox可能会起作用。还有其他人吗?
libsox可以提供什么,我需要的是获取传入的音频流并将其划分为频段。如果我只能读取文件一次,那么奖金!我不确定libsox是否可以做到这一点。
答案 0 :(得分:2)
如果你想使用C ++库,你可以尝试SWIG,但你必须从Subversion中获取它。下一个版本(2.0.1)将是第一个支持Go的发布版本。根据我的经验,Go支持仍然有点粗糙,但是我试图包装的库再次是一个怪物。
或者,您仍然可以使用与SWIG相同的方法通过cgo创建自己的绑定,但这将是痛苦和乏味的。基本的想法是你首先创建一个C包装器,然后让cgo在你的C包装器周围创建一个Go包装器。
但我对信号处理或libsox一无所知。遗憾。
答案 1 :(得分:1)
有一个相对较新的项目,名为ZikiChombo 到目前为止,其中包含一些针对音频的基本DSP功能,请参见here
该项目的dsp部分在其路线图上有过滤器,但它们尚不存在。另一方面,这里有一些用于实现过滤器的基础结构,例如实际的fft和块卷积。这意味着,如果需要FIR,并且可以通过其他方式计算系数,则可以通过当前在zc中与声音实时卷积来运行它们。
例如,以理想滤波器为起点的基本滤波设计支持(FIR,Biquad)将是zc的下一步。有许多小型的自包含开源项目,用于基本的和更高级的FIR和IIR滤波器设计,最著名的是Iowa Hills,它比大型项目在Go之外计算滤波器系数的访问性更高。
更高级的过滤(例如Butterworth)以及基于多项式求解和双线性变换的过滤器将花费更多的时间给zc。
还有一些软件定义的Golang广播项目,其中包含与过滤相关的一些代码,抱歉,没有可用的链接,但是对主题的搜索可能会将您引向他们。
最后,还有一个Fourier package来提供fft。
因此,Go在此领域中正在增长一些有趣且潜在的东西,但与较旧的项目(大多是C / C ++,或者例如通过numpy的Python包装器)相比,还有很多路要走。 / p>
答案 2 :(得分:0)
我正在使用此纯golang存储库执行傅立叶变换,效果很好
https://github.com/mjibson/go-dsp
只需为FFT调用提供
import (
"github.com/mjibson/go-dsp/fft" // https://github.com/mjibson/go-dsp
)
var audio_wave []float64
// ... now populate audio_wave with your audio PCM samples
var complex_fft []complex128
// input time domain ... output frequency domain of equally spaced freq bins
complex_fft = fft.FFTReal(audio_wave)