Библиотека обработки сигналов в Java?
Я хотел бы вычислить спектральную плотность мощности временных рядов; выполнить полосовую, низкочастотную и высокочастотную фильтрацию; может быть, некоторые другие основные вещи.
Есть ли хорошая библиотека Java с открытым исходным кодом, чтобы сделать это?
Я немного охотился безуспешно (например, поиск в Google "спектральная плотность мощности java" или "обработка сигналов java" и переход по ссылкам, поиск в Apache Commons, Sourceforge, java.net и т. Д.).
Есть много апплетов, книг, учебных пособий, коммерческих продуктов и т. Д., Которые не соответствуют моим потребностям.
Обновление: я нашел org.apache.commons.math.transform для преобразований Фурье. Это не реализует спектральную плотность мощности, полосу пропускания и т. Д., Но это нечто.
5 ответов
Мое первое предложение состоит в том, чтобы не делать вашу реализацию DSP в Java. Вторым моим предложением было бы накатить свои собственные простые реализации DSP на Java.
Почему бы не использовать Java:
У меня большой опыт написания кода DSP за последние 10 с лишним лет... и почти ни один из кодов DSP не написан на Java... поэтому прости меня, когда я не решаюсь читать о ком-то, кто хочет реализовать DSP на Java.
Если вы собираетесь делать нетривиальный DSP, то вам не следует использовать Java. Причина, по которой DSP так болезненно реализовать в Java, заключается в том, что все хорошие реализации DSP используют низкоуровневые приемы управления памятью, указатели (сумасшедшие количества указателей), большие массивы необработанных данных и т. Д.
Зачем использовать Java:
Если вы делаете простые вещи DSP, используйте свою собственную реализацию Java. Простые вещи DSP, такие как PSD и фильтрация, относительно просты в реализации (легкая реализация, но они не будут быстрыми), потому что есть очень много примеров реализации и хорошо документированной теории онлайн.
В моем случае я реализовал функцию PSD в Java один раз, потому что я графически отображал PSD в графическом интерфейсе Java, поэтому было проще всего измерить снижение производительности в Java и рассчитать PSD в графическом интерфейсе Java, а затем построить его.
Как реализовать PSD:
PSD - это обычно величина FFT, отображаемая в дБ. Есть много примеров из академических, коммерческих и открытых источников, показывающих, как вычислить величину БПФ в дБ. Например, Apache имеет реализацию Java, которая дает вам выход FFT, а затем вам просто нужно преобразовать в величину и дБ. Все после БПФ должно быть адаптировано к тому, что вам нужно / нужно.
Как реализовать низкочастотную, полосовую фильтрацию:
Самая простая реализация (не самая эффективная в вычислительном отношении), по моему мнению, будет использовать FIR-фильтр и выполнять свертку во временной области.
Свертка очень проста в реализации, это два вложенных цикла, и в сети буквально миллионы примеров кода.
КИХ-фильтр будет сложной задачей, если вы ничего не знаете о дизайне фильтра. Самый простой способ - использовать Matlab для генерации вашего фильтра FIR, а затем скопировать коэффициенты в java. Я предлагаю использовать firpmord() и firpm() из Matlab. Снимите для ослабления от -30 до -50 дБ в полосе пропускания и пульсации 3 дБ в полосе пропускания.
Я написал коллекцию некоторых классов Java DSP, например, фильтры IIR:
Я нашел книгу Java Digital Signal Processing и ее пример исходного кода. Вы можете просмотреть код, чтобы увидеть, соответствует ли он вашим потребностям.
Вы также можете проверить DSP Laboratory.
Как упоминалось в комментариях duffymo и basszero, со времени публикации Java DSP произошли изменения в Java, которые могут повлиять на некоторые примеры кода. В частности, (относительно) новый пакет утилит параллелизма может оказаться полезным.
Это выглядит довольно редко. Попробуйте Signalgo или jein или библиотеку Intel Signal Processing, хотя я думаю, что последняя - это просто оболочка JNI.
Я видел много тех апплетов, о которых ты говорил. Я думаю, что вы можете получить JAR для них и использовать API классов внутри. Возможно, придется использовать eclipse и jad для декомпиляции и выяснить, что они делают, хотя из-за отсутствия документации. Попробуйте источник на этой странице, например.
Я нашел другой ресурс, хотя это не библиотека: http://www.dickbaldwin.com/tocdsp.htm. Это просто базовое обсуждение обработки сигналов и преобразования Фурье с некоторыми примерами Java. См., Например, учебные пособия 1478, 1482, 1486. Не уверены, какая лицензия на код.