Go to file
Uladzimir Karpenka a77dbbb6e5 Fix Windows.h case on Linux: use lowercase windows.h
On Linux (case-sensitive filesystem) MinGW-w64 installs the header as
windows.h (lowercase) while comm.h included <Windows.h> (capital W),
causing a fatal compile error when cross-compiling for Windows.

Changed to <windows.h> which works on both Linux/MinGW-w64 and native
Windows/MSVC (Windows header includes are case-insensitive on NTFS).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 12:43:45 +03:00
java/org/openhpsdr/dsp first commit 2026-06-01 15:58:45 +03:00
third_party first commit 2026-06-01 15:58:45 +03:00
.gitignore first commit 2026-06-01 15:58:45 +03:00
amd.c first commit 2026-06-01 15:58:45 +03:00
amd.h first commit 2026-06-01 15:58:45 +03:00
ammod.c first commit 2026-06-01 15:58:45 +03:00
ammod.h first commit 2026-06-01 15:58:45 +03:00
amsq.c first commit 2026-06-01 15:58:45 +03:00
amsq.h first commit 2026-06-01 15:58:45 +03:00
analyzer.c first commit 2026-06-01 15:58:45 +03:00
analyzer.h first commit 2026-06-01 15:58:45 +03:00
anf.c first commit 2026-06-01 15:58:45 +03:00
anf.h first commit 2026-06-01 15:58:45 +03:00
anr.c first commit 2026-06-01 15:58:45 +03:00
anr.h first commit 2026-06-01 15:58:45 +03:00
apfshadow.c first commit 2026-06-01 15:58:45 +03:00
apfshadow.h first commit 2026-06-01 15:58:45 +03:00
bandpass.c first commit 2026-06-01 15:58:45 +03:00
bandpass.h first commit 2026-06-01 15:58:45 +03:00
calcc.c first commit 2026-06-01 15:58:45 +03:00
calcc.h first commit 2026-06-01 15:58:45 +03:00
calculus first commit 2026-06-01 15:58:45 +03:00
calculus.c first commit 2026-06-01 15:58:45 +03:00
calculus.h first commit 2026-06-01 15:58:45 +03:00
cblock.c first commit 2026-06-01 15:58:45 +03:00
cblock.h first commit 2026-06-01 15:58:45 +03:00
cfcomp.c first commit 2026-06-01 15:58:45 +03:00
cfcomp.h first commit 2026-06-01 15:58:45 +03:00
cfir.c first commit 2026-06-01 15:58:45 +03:00
cfir.h first commit 2026-06-01 15:58:45 +03:00
channel.c first commit 2026-06-01 15:58:45 +03:00
channel.h first commit 2026-06-01 15:58:45 +03:00
cmath.c first commit 2026-06-01 15:58:45 +03:00
cmath.h first commit 2026-06-01 15:58:45 +03:00
comm.h Fix Windows.h case on Linux: use lowercase windows.h 2026-06-02 12:43:45 +03:00
compress.c first commit 2026-06-01 15:58:45 +03:00
compress.h first commit 2026-06-01 15:58:45 +03:00
COPYING first commit 2026-06-01 15:58:45 +03:00
delay.c first commit 2026-06-01 15:58:45 +03:00
delay.h first commit 2026-06-01 15:58:45 +03:00
dexp.c first commit 2026-06-01 15:58:45 +03:00
dexp.h first commit 2026-06-01 15:58:45 +03:00
div.c first commit 2026-06-01 15:58:45 +03:00
div.h first commit 2026-06-01 15:58:45 +03:00
doublepole.c first commit 2026-06-01 15:58:45 +03:00
doublepole.h first commit 2026-06-01 15:58:45 +03:00
eer.c first commit 2026-06-01 15:58:45 +03:00
eer.h first commit 2026-06-01 15:58:45 +03:00
emnr.c first commit 2026-06-01 15:58:45 +03:00
emnr.h first commit 2026-06-01 15:58:45 +03:00
emph.c first commit 2026-06-01 15:58:45 +03:00
emph.h first commit 2026-06-01 15:58:45 +03:00
eq.c first commit 2026-06-01 15:58:45 +03:00
eq.h first commit 2026-06-01 15:58:45 +03:00
fastmath.h first commit 2026-06-01 15:58:45 +03:00
fcurve.c first commit 2026-06-01 15:58:45 +03:00
fcurve.h first commit 2026-06-01 15:58:45 +03:00
FDnoiseIQ.c first commit 2026-06-01 15:58:45 +03:00
FDnoiseIQ.h first commit 2026-06-01 15:58:45 +03:00
fir.c first commit 2026-06-01 15:58:45 +03:00
fir.h first commit 2026-06-01 15:58:45 +03:00
firmin.c first commit 2026-06-01 15:58:45 +03:00
firmin.h first commit 2026-06-01 15:58:45 +03:00
fmd.c first commit 2026-06-01 15:58:45 +03:00
fmd.h first commit 2026-06-01 15:58:45 +03:00
fmmod.c first commit 2026-06-01 15:58:45 +03:00
fmmod.h first commit 2026-06-01 15:58:45 +03:00
fmsq.c first commit 2026-06-01 15:58:45 +03:00
fmsq.h first commit 2026-06-01 15:58:45 +03:00
gain.c first commit 2026-06-01 15:58:45 +03:00
gain.h first commit 2026-06-01 15:58:45 +03:00
gaussian.c first commit 2026-06-01 15:58:45 +03:00
gaussian.h first commit 2026-06-01 15:58:45 +03:00
gen.c first commit 2026-06-01 15:58:45 +03:00
gen.h first commit 2026-06-01 15:58:45 +03:00
icfir.c first commit 2026-06-01 15:58:45 +03:00
icfir.h first commit 2026-06-01 15:58:45 +03:00
iir.c first commit 2026-06-01 15:58:45 +03:00
iir.h first commit 2026-06-01 15:58:45 +03:00
impulse_cache.c first commit 2026-06-01 15:58:45 +03:00
impulse_cache.h first commit 2026-06-01 15:58:45 +03:00
iobuffs.c first commit 2026-06-01 15:58:45 +03:00
iobuffs.h first commit 2026-06-01 15:58:45 +03:00
iqc.c first commit 2026-06-01 15:58:45 +03:00
iqc.h first commit 2026-06-01 15:58:45 +03:00
linux_port.c first commit 2026-06-01 15:58:45 +03:00
linux_port.h first commit 2026-06-01 15:58:45 +03:00
lmath.c first commit 2026-06-01 15:58:45 +03:00
lmath.h first commit 2026-06-01 15:58:45 +03:00
main.c first commit 2026-06-01 15:58:45 +03:00
main.h first commit 2026-06-01 15:58:45 +03:00
make_calculus.c first commit 2026-06-01 15:58:45 +03:00
make_interface.c first commit 2026-06-01 15:58:45 +03:00
make_zetahat.c first commit 2026-06-01 15:58:45 +03:00
Makefile first commit 2026-06-01 15:58:45 +03:00
Makefile.android Auto-download FFTW source for Android build 2026-06-02 12:15:59 +03:00
Makefile.windows Fix Windows.h case on Linux: use lowercase windows.h 2026-06-02 12:43:45 +03:00
matchedCW.c first commit 2026-06-01 15:58:45 +03:00
matchedCW.h first commit 2026-06-01 15:58:45 +03:00
meter.c first commit 2026-06-01 15:58:45 +03:00
meter.h first commit 2026-06-01 15:58:45 +03:00
meterlog10.c first commit 2026-06-01 15:58:45 +03:00
meterlog10.h first commit 2026-06-01 15:58:45 +03:00
nbp.c first commit 2026-06-01 15:58:45 +03:00
nbp.h first commit 2026-06-01 15:58:45 +03:00
nob.c first commit 2026-06-01 15:58:45 +03:00
nob.h first commit 2026-06-01 15:58:45 +03:00
nobII.c first commit 2026-06-01 15:58:45 +03:00
nobII.h first commit 2026-06-01 15:58:45 +03:00
org_openhpsdr_dsp_Wdsp.c first commit 2026-06-01 15:58:45 +03:00
org_openhpsdr_dsp_Wdsp.h first commit 2026-06-01 15:58:45 +03:00
osctrl.c first commit 2026-06-01 15:58:45 +03:00
osctrl.h first commit 2026-06-01 15:58:45 +03:00
patchpanel.c first commit 2026-06-01 15:58:45 +03:00
patchpanel.h first commit 2026-06-01 15:58:45 +03:00
README.md Fix missing Windows.h: require full mingw-w64 package, not just compiler 2026-06-02 12:33:13 +03:00
resample.c first commit 2026-06-01 15:58:45 +03:00
resample.h first commit 2026-06-01 15:58:45 +03:00
resource.h first commit 2026-06-01 15:58:45 +03:00
rmatch.c first commit 2026-06-01 15:58:45 +03:00
rmatch.h first commit 2026-06-01 15:58:45 +03:00
rnnr.c first commit 2026-06-01 15:58:45 +03:00
rnnr.h first commit 2026-06-01 15:58:45 +03:00
RXA.c first commit 2026-06-01 15:58:45 +03:00
RXA.h first commit 2026-06-01 15:58:45 +03:00
sbnr.c first commit 2026-06-01 15:58:45 +03:00
sbnr.h first commit 2026-06-01 15:58:45 +03:00
sender.c first commit 2026-06-01 15:58:45 +03:00
sender.h first commit 2026-06-01 15:58:45 +03:00
shift.c first commit 2026-06-01 15:58:45 +03:00
shift.h first commit 2026-06-01 15:58:45 +03:00
siphon.c first commit 2026-06-01 15:58:45 +03:00
siphon.h first commit 2026-06-01 15:58:45 +03:00
slew.c first commit 2026-06-01 15:58:45 +03:00
slew.h first commit 2026-06-01 15:58:45 +03:00
snb.c first commit 2026-06-01 15:58:45 +03:00
snb.h first commit 2026-06-01 15:58:45 +03:00
ssql.c first commit 2026-06-01 15:58:45 +03:00
ssql.h first commit 2026-06-01 15:58:45 +03:00
syncbuffs.c first commit 2026-06-01 15:58:45 +03:00
syncbuffs.h first commit 2026-06-01 15:58:45 +03:00
TXA.c first commit 2026-06-01 15:58:45 +03:00
TXA.h first commit 2026-06-01 15:58:45 +03:00
utilities.c first commit 2026-06-01 15:58:45 +03:00
utilities.h first commit 2026-06-01 15:58:45 +03:00
varsamp.c first commit 2026-06-01 15:58:45 +03:00
varsamp.h first commit 2026-06-01 15:58:45 +03:00
version.c first commit 2026-06-01 15:58:45 +03:00
wcpAGC.c first commit 2026-06-01 15:58:45 +03:00
wcpAGC.h first commit 2026-06-01 15:58:45 +03:00
wdsp.h first commit 2026-06-01 15:58:45 +03:00
wisdom.c first commit 2026-06-01 15:58:45 +03:00
zetaHat.bin first commit 2026-06-01 15:58:45 +03:00
zetaHat.c first commit 2026-06-01 15:58:45 +03:00
zetaHat.h first commit 2026-06-01 15:58:45 +03:00

WDSP

DSP library for SDR (Software Defined Radio) applications.

Originally written for Windows by Warren Pratt, NR0V. Ported to Linux and Android by John Melton G0ORX/N6LYT.

Project structure

wdsp/
├── *.c / *.h                    — WDSP library sources
├── org_openhpsdr_dsp_Wdsp.c/.h  — JNI bridge
├── Makefile                     — host build (Linux / macOS)
├── Makefile.android             — Android cross-build
├── Makefile.windows             — Windows cross-build (MinGW-w64, runs on Linux)
├── java/
│   └── org/openhpsdr/dsp/Wdsp.java
├── third_party/
│   ├── fftw-3.3.11/       — FFTW source (downloaded automatically)
│   ├── fftw-win64/        — FFTW Windows binaries (downloaded automatically)
│   ├── rnnoise/           — RNNoise noise suppression
│   └── libspecbleach/     — spectral noise reduction
├── obj/                   — object files (generated)
├── obj_win/               — Windows object files (generated)
├── lib/                   — built libraries (generated)
└── lib_win/               — Windows libraries (generated)

Host build (Linux / macOS)

Dependencies

Linux:

sudo apt install build-essential libfftw3-dev pkg-config default-jdk

macOS:

brew install fftw pkg-config

Build

# Full build: static + shared + JNI library + Java classes
make

# Individual targets
make static        # lib/libwdsp.a
make shared        # lib/libwdsp.so  (or .dylib on macOS)
make java          # lib/libwdspj.so + java/build/

Install

sudo make install                    # installs to /usr/local/lib and /usr/local/include
sudo make PREFIX=/opt/wdsp install   # custom prefix
sudo make install_java               # install libwdspj alongside libwdsp

Options

Variable Default Description
PREFIX /usr/local Install prefix
NR34LIB off Set to ON to skip bundled rnnoise/libspecbleach
CC gcc C compiler
CFLAGS -pthread -O3 ... Compiler flags
make NR34LIB=ON    # build without NR3/NR4 noise reduction
make CC=clang

Clean

make clean

Windows build (кросс-компиляция с Linux)

Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается и собирается из исходников автоматически.

Зависимости

# Arch
sudo pacman -S mingw-w64-gcc        # тянет mingw-w64-headers автоматически

# Debian / Ubuntu — нужен мета-пакет mingw-w64, а не только компилятор
sudo apt install mingw-w64

# Fedora
sudo dnf install mingw64-gcc        # тянет mingw64-headers автоматически

Также нужен wget или curl.

Debian/Ubuntu: пакет gcc-mingw-w64-x86-64 содержит только компилятор без Windows API заголовков — Windows.h не будет найден. Используйте mingw-w64.

Сборка

# DLL + статическая библиотека (рекомендуется)
make -f Makefile.windows

# Только DLL
make -f Makefile.windows dll

# Только статическая библиотека
make -f Makefile.windows static

Результат в lib_win/:

Файл Назначение
libwdsp.dll DLL для Windows
libwdsp.dll.a Import library для MinGW (-lwdsp)
libwdsp.a Статическая библиотека
libfftw3-3.dll Runtime dependency — распространять вместе с DLL
libfftw3f-3.dll Runtime dependency — распространять вместе с DLL

Линковка приложения

MinGW:

gcc myapp.c -Llib_win -lwdsp -o myapp.exe

MSVC — переименовать libwdsp.dll.a в libwdsp.lib и подключить обычным образом.

Статически (MinGW):

gcc myapp.c libwdsp.a third_party/rnnoise/librnnoise.a \
    third_party/libspecbleach/libspecbleach.a \
    -Lthird_party/fftw-win64 -lfftw3-3 -lfftw3f-3 -lavrt -lm -o myapp.exe

Параметры

Переменная По умолчанию Описание
MINGW_PREFIX x86_64-w64-mingw32 Префикс MinGW toolchain
FFTW_VERSION 3.3.11 Версия FFTW
CFLAGS -O3 -Wno-parentheses Флаги компилятора
make -f Makefile.windows MINGW_PREFIX=i686-w64-mingw32   # 32-bit Windows

Очистка

make -f Makefile.windows clean       # артефакты сборки
make -f Makefile.windows distclean   # + удалить скачанный FFTW

Android build

Prerequisites

  1. Android NDK r23 or newer
  2. Java compiler — for building the .class file (Android Studio's JBR or any JDK)

FFTW 3.3.11 скачивается и собирается автоматически. Чтобы использовать уже скачанный исходник, передайте FFTW_SRC=/path/to/fftw-3.3.11.

Build

make android
# or directly
make -f Makefile.android

Output is placed into:

lib/android/
├── arm64-v8a/
│   ├── libfftw3.so
│   ├── libfftw3f.so
│   ├── libwdsp.so
│   └── libwdspj.so
├── armeabi-v7a/
│   └── ...
├── x86_64/
│   └── ...
└── java/
    └── org/openhpsdr/dsp/Wdsp.class

libwdsp.so has FFTW linked statically — no separate FFTW dependency at runtime on the device.

Options

Variable Default Description
ANDROID_NDK /home/vladimir/Android/Sdk/ndk/29.0.14206865 Path to Android NDK
ANDROID_API 24 Minimum API level
ANDROID_ABIS arm64-v8a armeabi-v7a x86_64 Target ABIs
ANDROID_HOST_TAG auto-detected Host platform (linux-x86_64, darwin-x86_64, etc.)
FFTW_SRC third_party/fftw Path to FFTW source
JAVAC /opt/android-studio/jbr/bin/javac Java compiler
make -f Makefile.android \
    ANDROID_NDK=~/Android/Sdk/ndk/26.3.11579264 \
    ANDROID_API=26 \
    ANDROID_ABIS=arm64-v8a

Clean

make -f Makefile.android clean       # удаляет obj/android/ и lib/android/
make -f Makefile.android distclean   # + удаляет скачанный FFTW

Using in an Android project

Copy lib/android/{abi}/ into your Android project's jniLibs:

app/src/main/jniLibs/
├── arm64-v8a/
│   ├── libwdsp.so
│   └── libwdspj.so
├── armeabi-v7a/
│   └── ...
└── x86_64/
    └── ...

Add Wdsp.java to your source tree and load the libraries at startup:

System.loadLibrary("wdsp");
System.loadLibrary("wdspj");

Or use the singleton:

Wdsp wdsp = Wdsp.getInstance();