Обработка сигналов в Go - PullRequest
       22

Обработка сигналов в Go

4 голосов
/ 25 августа 2010

У меня есть идея для аудио проекта, и похоже, что Go - полезный язык для его реализации. Однако для этого требуется возможность применять фильтры к входящему аудио, и Go, похоже, не имеет какого-либо пакета обработки аудио. Я могу использовать cgo для вызова кода C, но каждая библиотека обработки сигналов, которую я нахожу, использует классы C ++, которые cgo не может обработать. Похоже, что libsox может работать. Есть ли другие?

Что может предоставить libsox и что мне нужно, это взять входящий аудиопоток и разделить его на полосы частот. Если я могу сделать это, читая файл только один раз, тогда бонус! Я не уверен, что libsox может это сделать.

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Если вы хотите использовать библиотеку C ++, вы можете попробовать SWIG, но вам придется вытащить ее из Subversion.Следующая версия (2.0.1) будет первой выпущенной версией, поддерживающей Go.По моему опыту, поддержка Go все еще немного грубовата, но опять же библиотека, которую я пытался обернуть, является монстром.

В качестве альтернативы, вы все равно можете создавать свои собственные привязки через cgo, используя тот же метод, что и SWIG, ноэто будет больно и утомительно.Основная идея заключается в том, что вы сначала создаете оболочку C, а затем позволяете cgo создавать оболочку Go вокруг вашей оболочки C.

Хотя я ничего не знаю об обработке сигналов или libsox.К сожалению.

1 голос
/ 24 сентября 2018

Существует относительно новый проект под названием ZikiChombo , который на данный момент содержит некоторые базовые функции DSP, ориентированные на аудио, см. здесь

Часть проекта dsp имеетфильтры на его дорожной карте, но они еще не там.С другой стороны, есть некоторая инфраструктура для реализации фильтров, такая как реальное fft и свертка блоков.Это означает, что если вам нужны значения FIR, и вы можете вычислять коэффициенты другими способами, вы можете запустить их с помощью свертки в zc в настоящее время со звуком в режиме реального времени.

Например, поддержка базовой конструкции фильтрации (FIR, Biquad)использование идеального фильтра в качестве отправной точки будет следующим шагом для zc.Существует множество небольших автономных проектов с открытым исходным кодом для базовой и более сложной конструкции фильтров FIR и IIR, прежде всего Iowa Hills , которые могут быть более доступными, чем более крупный проект для вычисления коэффициентов фильтра за пределами Go.

Более продвинутая фильтрация, такая как Баттерворт, и фильтры, основанные на полиномиальном решении и билинейном преобразовании, потребуют больше времени для zc.

Существуют также некоторые программно-определяемые проекты радио Голанга с некоторым кодом, связанным с фильтрацией,извините, у вас нет ссылок, но поиск по теме может привести вас к ним.

Наконец, есть гонум пакет Фурье , который также предоставляет fft.

Так что Go развивает некоторые интересные и потенциально полезные вещи в этой области, но все еще имеет довольно много способовпо сравнению со старыми проектами (которые в основном на C / C ++ или, возможно, с оболочкой Python, например, через numpy).

0 голосов
/ 25 сентября 2018

Я использую этот чистый репозиторий Голанга для выполнения преобразований Фурье с хорошим эффектом

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) 
...