代码之家  ›  专栏  ›  技术社区  ›  Matt K

Go中的信号处理

  •  4
  • Matt K  · 技术社区  · 14 年前

    我为一个音频项目想出了一个主意,看起来Go是实现它的一种有用的语言。但是,它需要能够对传入音频应用过滤器,并且Go似乎没有任何类型的音频处理包。我可以使用CGO调用C代码,但是我发现的每个信号处理库都使用CGO无法处理的C++类。看来libsox可能有效。还有其他的吗?

    libsox能提供的和我需要的是接收一个传入的音频流并将其划分为频带。如果我能做到这一点,同时只阅读一次文件,那么奖金!我不确定libsox是否能做到这一点。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Evan Shaw    14 年前

    如果你想使用C++库,你可以试试SWIG,但是你必须把它从颠覆中解脱出来。下一个版本(2.0.1)将是支持Go的第一个发布版本。根据我的经验,Go支持仍然有点粗糙,但我试图包装的库又是一个怪物。

    或者,您仍然可以使用与swig相同的方法通过CGO创建自己的绑定,但这将是痛苦和乏味的。基本思想是,首先创建一个C包装器,然后让CGO围绕C包装器创建一个Go包装器。

    不过,我对信号处理或libsox一无所知。对不起的。

        2
  •  1
  •   Cotton Scott    6 年前

    有一个相对新的项目叫做 ZikiChombo 它包含了目前为止一些面向音频的基本DSP功能,请参见 here

    该项目的DSP部分在其路线图上有过滤器,但它们还没有出现。另一方面,实现过滤器的一些基础设施,例如真正的FFT和块卷积。也就是说,如果您想要FIR,并且可以通过其他方法计算系数,那么您可以在ZC中通过卷积来运行这些系数,目前声音是实时的。

    基本的过滤设计支持(FIR,BiQuad),例如使用理想的过滤器作为起点,将是ZC的下一步。有许多小型的独立的开源项目,用于基本和更高级的FIR和IIR滤波器设计,最显著的是 Iowa Hills 这可能比大型项目更容易访问,以便在Go之外计算过滤系数。

    巴特沃斯滤波和基于多项式求解和双线性变换的滤波器等更先进的滤波方法,对ZC来说需要更多的时间。

    还有一些软件定义的无线电Golang项目,其中包含一些与过滤相关的代码,很抱歉没有现成的链接,但是搜索主题可能会引导您找到它们。

    最后,还有一个问题 Fourier package 它还提供快速傅立叶变换。

    所以GO在这个领域中增长了一些有趣的和潜在的东西,但与旧的项目(主要是C/C++,或者用Python包装通过NUMPY)相比,仍然有相当多的方法要去。

        3
  •  0
  •   Scott Stensland    6 年前

    我用这个纯的Golang repo来进行傅立叶变换,效果很好

    https://github.com/mjibson/go-dsp

    只需为快速电话提供一个

    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)