Skip to content

Releases: kfrlib/kfr

KFR 7.0.1

14 Nov 14:27

Choose a tag to compare

Added

  • Variance and standard deviation functions: variance and stddev
  • macOS universal binaries
  • New module: audio
  • New Wave, AIFF, FLAC, and Mp3 (via minimp3) encoders/decoders
  • Apple ALAC support
  • Apple CAF container support
  • RF64/BW64 container support
  • RISC-V support
  • RISC-V prebuilt binaries
  • New ARM and ARM64 toolchain implementation
  • New RISC-V 64 toolchain for riscv64-linux-gnu
  • macos-merge-binaries.cmake merges two directories into one with universal binaries
  • Custom port to fix the macosforge/alac bug
  • New elliptic function to design elliptic filters with ripple parameters (follows SciPy semantics)
  • Version information added for each module (library_version_dsp, library_version_audio, etc.)
  • samples_store and samples_load convert audio channels to/from stored formats (integer and floating-point, optional dithering)
  • strided_channel class for reading/writing strided data in KFR expressions
  • audio_data class providing a unified interface for interleaved/planar audio data
  • Zero-copy construction from user-supplied pointers for audio_data
  • Computing statistics for audio_data: Peak and RMS
  • Per-channel processing for audio_data
  • Basic dithering support: Rectangular and Triangular
  • audio_encoder and audio_decoder base classes for encoding/decoding audio
  • Reading RIFF chunks in audio_decoder
  • Audio format detection from the first 16 bytes
  • Audio format selection from file extension
  • Raw decoder/encoder
  • Audio decoder based on Media Foundation for Windows
  • Automatic switch from standard Wave to RF64 if audio exceeds 4 GB (can be disabled with switch_to_rf64_if_over_4gb)
  • encode_audio_file and decode_audio_file functions for simplified file handling
  • arange function added (similar to NumPy’s)
  • Added has_expression_traits, input_expression, output_expression, and input_output_expression concepts
  • expr_element concept defines valid expression element types
  • Added f_class, i_class, and u_class concepts (is_f_class, is_i_class, is_u_class)
  • Added not_f_class, not_i_class, and not_u_class concepts
  • has_data_size concept checks for std::data and std::size definitions
  • Added filtfilt for forward-backward IIR filtering
  • Added arrangement_speakers and arrangement_for_channels functions
  • Added fopen_path for cross-platform UTF-8 file access; replaces fopen_portable
  • memory_reader and memory_writer adapters for user memory buffers
  • Added more tests for vector concatenation and slicing
  • Minimal usage examples added under tests/usage-config and tests/usage-manual
  • New RISC-V vector types: f32rvv, i32rvv, u32rvv, etc.
  • Added simd_compat concept to verify SIMD element compatibility
  • Added scoped_flush_denormals RAII class to enable flush-to-zero semantics on x86 and ARM
  • test_matrix function introduced (replaces testo::matrix for Catch2 compatibility)

Changed

  • Audio and IO modules can now be disabled during KFR build with KFR_ENABLE_AUDIO and KFR_ENABLE_IO options (both on by default) @jcelerier
  • DSP module can be disabled too with KFR_ENABLE_DSP option (on by default)
  • Documentation migrated to mkdocs + cxxdox 2
  • Prebuilt binaries are tested after build
  • Prebuilt binaries use Clang 21
  • KFR_ENABLE_MULTIARCH is forcibly turned off for non-x86
  • KFR_USE_BOOST_MATH option enables the use of standalone Boost.Math for elliptic filters (on by default)
  • KFR_USE_BOOST option switches to using Boost.Math from a full Boost installation. Enable if you already use Boost
  • C++20 standard is now handled via the cxx_std_20 CMake feature and inherited by dependent targets
  • Refactored CMake config with separate targets and dependency handling
  • add_kfr_library refactored to distinguish between private and public dependencies and definitions
  • In multiarch builds, the base architecture is now named exactly as the module itself (was: kfr_dsp_sse2, kfr_dsp_avx2; now: kfr_dsp, kfr_dsp_avx2)
  • Examples and tools migrated to the new audio I/O code
  • All third-party libraries moved to src/thirdparty or include/kfr/thirdparty
  • Old audio I/O handled by audio_reader and audio_writer is now deprecated
  • reverse expression is now writable
  • audio_sample_type now represents bit depth; negative if floating-point
  • convert_endianness now accepts references to data types
  • samplerate_converter is now default-, move-constructible, and move-assignable
  • IO_SEEK_64 and IO_TELL_64 macros renamed to KFR_IO_SEEK_64 and KFR_IO_TELL_64
  • get_nth_type optimized for Clang and GCC
  • All constexpr variables now marked inline
  • is_poweroftwo, next_poweroftwo, ilog2, etc., now use C++20 <bit> header
  • Sample Rate Converter tool refactored for chunked resampling
  • [Breaking change] CMake 3.16 required
  • [Breaking change] cometa namespace merged into kfr; Cometa is no longer distributed separately. Replace cometa with kfr in your sources
  • [Breaking change] All macros renamed from CMT_ to KFR_; replace all occurrences of CMT_ with KFR_
  • [Breaking change] All macros renamed from TESTO_ to KFR_; replace all occurrences of TESTO_ with KFR_
  • [Breaking change] cometa.hpp renamed to meta.hpp; kfr/cometa/*.hpp renamed to kfr/meta/*.hpp. Update your includes accordingly
  • [Breaking change] kfr/testo/*.hpp renamed to kfr/test/*.hpp
  • [Breaking change] Some classes and functions no longer accept a template parameter and now default to double for maximum precision. Related changes:
    • zpk<float_type> replaced with zpk
    • bessel<float_type> and butterworth<float_type> replaced with bessel and butterworth
    • bilinear<float_type>, lp2lp_zpk<float_type>, lp2bs_zpk<float_type>, lp2bp_zpk<float_type>, lp2hp_zpk<float_type>, and warp_freq<float_type> replaced with non-template equivalents
    • iir_lowpass<float_type>, iir_highpass<float_type>, iir_bandpass<float_type>, iir_bandstop<float_type> replaced with non-template equivalents
    • iir_params<float_type> still accepts a template parameter to control precision
    • to_sos now accepts float_type (default double) to return iir_params<float_type>
    • New elliptic function follows the same rule and always produces double-precision zpk
  • intrinsics namespace renamed to intr
  • Many functions from iir_design.hpp moved to src/iir_design.cpp
  • Documentation updates: applying FIR/IIR filters, computing loudness, performing sample conversion
  • [Breaking change] KFR_ACCEPT_EXPRESSIONS removed; replaced with expression_argument and expression_arguments concepts
  • [Breaking change] identity removed; replaced with C++ std::type_identity_t
  • [Breaking change] output_expression concept replaces enable_if_output_expression trait
  • [Breaking change] 8-bit sample support removed
  • [Breaking change] Fixed typo: convert_endianessconvert_endianness
  • [Breaking change] CMT_NOEXCEPT removed; use noexcept
  • [Breaking change] C API: kfr_size_t and kfr_int32_t removed; use size_t and int32_t
  • [Breaking change] Speakerspeaker_type, SpeakerArrangementspeaker_arrangement
  • [Breaking change] from_lambda parameter required to construct vec from a lambda generator
  • ebu_r128 now accepts std::span instead of std::vector
  • arraysize and carraysize removed; use std::size from C++17
  • Removed C++17 compatibility definitions for non-compliant compilers
  • More functions marked noexcept and constexpr
  • CMT_ENABLE_IF mostly replaced with concepts and requires; KFR_ENABLE_IF still available
  • CMT_CLANG_EXT renamed to KFR_VEC_EXT and now usable with GCC
  • C API can now be built without exceptions
  • numeric concept replaces is_numeric<T1> predicate
  • aligned_size, aligned_force_free, aligned_release, and aligned_reallocate only defined if KFR_MANAGED_ALLOCATION is on (default off)

Fixed

  • C++23 compatibility fixes
  • Fixed extend(vec) function for compound vectors
  • Custom port to fix the macosforge/alac bug
  • Fixed generic fallback for bittestany
  • Fixed u8/i8 shifts on x86 and related tests
  • Various smaller fixes

KFR 7.0.0-rc

29 Oct 13:46

Choose a tag to compare

7.0.0-rc

Added

  • macOS universal binaries
  • New module: audio
  • New Wave, AIFF, FLAC, and Mp3 (via minimp3) encoders/decoders
  • Apple ALAC support
  • Apple CAF container support
  • RF64/BW64 container support
  • RISC-V support
  • RISC-V prebuilt binaries
  • New ARM and ARM64 toolchain implementation
  • New RISC-V 64 toolchain for riscv64-linux-gnu
  • macos-merge-binaries.cmake merges two directories into one with universal binaries
  • Custom port to fix the macosforge/alac bug
  • New elliptic function to design elliptic filters with ripple parameters (follows SciPy semantics)
  • Version information added for each module (library_version_dsp, library_version_audio, etc.)
  • samples_store and samples_load convert audio channels to/from stored formats (integer and floating-point, optional dithering)
  • strided_channel class for reading/writing strided data in KFR expressions
  • audio_data class providing a unified interface for interleaved/planar audio data
  • Zero-copy construction from user-supplied pointers for audio_data
  • Computing statistics for audio_data: Peak and RMS
  • Per-channel processing for audio_data
  • Basic dithering support: Rectangular and Triangular
  • audio_encoder and audio_decoder base classes for encoding/decoding audio
  • Reading RIFF chunks in audio_decoder
  • Audio format detection from the first 16 bytes
  • Audio format selection from file extension
  • Raw decoder/encoder
  • Audio decoder based on Media Foundation for Windows
  • Automatic switch from standard Wave to RF64 if audio exceeds 4 GB (can be disabled with switch_to_rf64_if_over_4gb)
  • encode_audio_file and decode_audio_file functions for simplified file handling
  • arange function added (similar to NumPy’s)
  • Added has_expression_traits, input_expression, output_expression, and input_output_expression concepts
  • expr_element concept defines valid expression element types
  • Added f_class, i_class, and u_class concepts (is_f_class, is_i_class, is_u_class)
  • Added not_f_class, not_i_class, and not_u_class concepts
  • has_data_size concept checks for std::data and std::size definitions
  • Added filtfilt for forward-backward IIR filtering
  • Added arrangement_speakers and arrangement_for_channels functions
  • Added fopen_path for cross-platform UTF-8 file access; replaces fopen_portable
  • memory_reader and memory_writer adapters for user memory buffers
  • Added more tests for vector concatenation and slicing
  • Minimal usage examples added under tests/usage-config and tests/usage-manual
  • New RISC-V vector types: f32rvv, i32rvv, u32rvv, etc.
  • Added simd_compat concept to verify SIMD element compatibility
  • Added scoped_flush_denormals RAII class to enable flush-to-zero semantics on x86 and ARM
  • test_matrix function introduced (replaces testo::matrix for Catch2 compatibility)

Changed

  • Prebuilt binaries are tested after build
  • Prebuilt binaries use Clang 21
  • KFR_ENABLE_MULTIARCH is forcibly turned off for non-x86
  • KFR_USE_BOOST_MATH option enables the use of standalone Boost.Math for elliptic filters (on by default)
  • KFR_USE_BOOST option switches to using Boost.Math from a full Boost installation. Enable if you already use Boost
  • C++20 standard is now handled via the cxx_std_20 CMake feature and inherited by dependent targets
  • Refactored CMake config with separate targets and dependency handling
  • add_kfr_library refactored to distinguish between private and public dependencies and definitions
  • In multiarch builds, the base architecture is now named exactly as the module itself (was: kfr_dsp_sse2, kfr_dsp_avx2; now: kfr_dsp, kfr_dsp_avx2)
  • Examples and tools migrated to the new audio I/O code
  • All third-party libraries moved to src/thirdparty or include/kfr/thirdparty
  • Old audio I/O handled by audio_reader and audio_writer is now deprecated
  • reverse expression is now writable
  • audio_sample_type now represents bit depth; negative if floating-point
  • convert_endianness now accepts references to data types
  • samplerate_converter is now default-, move-constructible, and move-assignable
  • IO_SEEK_64 and IO_TELL_64 macros renamed to KFR_IO_SEEK_64 and KFR_IO_TELL_64
  • get_nth_type optimized for Clang and GCC
  • All constexpr variables now marked inline
  • is_poweroftwo, next_poweroftwo, ilog2, etc., now use C++20 <bit> header
  • Sample Rate Converter tool refactored for chunked resampling
  • [Breaking change] CMake 3.16 required
  • [Breaking change] cometa namespace merged into kfr; Cometa is no longer distributed separately. Replace cometa with kfr in your sources
  • [Breaking change] All macros renamed from CMT_ to KFR_; replace all occurrences of CMT_ with KFR_
  • [Breaking change] All macros renamed from TESTO_ to KFR_; replace all occurrences of TESTO_ with KFR_
  • [Breaking change] cometa.hpp renamed to meta.hpp; kfr/cometa/*.hpp renamed to kfr/meta/*.hpp. Update your includes accordingly
  • [Breaking change] kfr/testo/*.hpp renamed to kfr/test/*.hpp
  • [Breaking change] Some classes and functions no longer accept a template parameter and now default to double for maximum precision. Related changes:
    • zpk<float_type> replaced with zpk
    • bessel<float_type> and butterworth<float_type> replaced with bessel and butterworth
    • bilinear<float_type>, lp2lp_zpk<float_type>, lp2bs_zpk<float_type>, lp2bp_zpk<float_type>, lp2hp_zpk<float_type>, and warp_freq<float_type> replaced with non-template equivalents
    • iir_lowpass<float_type>, iir_highpass<float_type>, iir_bandpass<float_type>, iir_bandstop<float_type> replaced with non-template equivalents
    • iir_params<float_type> still accepts a template parameter to control precision
    • to_sos now accepts float_type (default double) to return iir_params<float_type>
    • New elliptic function follows the same rule and always produces double-precision zpk
  • intrinsics namespace renamed to intr
  • Many functions from iir_design.hpp moved to src/iir_design.cpp
  • Documentation updates: applying FIR/IIR filters, computing loudness, performing sample conversion
  • [Breaking change] KFR_ACCEPT_EXPRESSIONS removed; replaced with expression_argument and expression_arguments concepts
  • [Breaking change] identity removed; replaced with C++ std::type_identity_t
  • [Breaking change] output_expression concept replaces enable_if_output_expression trait
  • [Breaking change] 8-bit sample support removed
  • [Breaking change] Fixed typo: convert_endianessconvert_endianness
  • [Breaking change] CMT_NOEXCEPT removed; use noexcept
  • [Breaking change] C API: kfr_size_t and kfr_int32_t removed; use size_t and int32_t
  • [Breaking change] Speakerspeaker_type, SpeakerArrangementspeaker_arrangement
  • [Breaking change] from_lambda parameter required to construct vec from a lambda generator
  • ebu_r128 now accepts std::span instead of std::vector
  • arraysize and carraysize removed; use std::size from C++17
  • Removed C++17 compatibility definitions for non-compliant compilers
  • More functions marked noexcept and constexpr
  • CMT_ENABLE_IF mostly replaced with concepts and requires; KFR_ENABLE_IF still available
  • CMT_CLANG_EXT renamed to KFR_VEC_EXT and now usable with GCC
  • C API can now be built without exceptions
  • numeric concept replaces is_numeric<T1> predicate
  • aligned_size, aligned_force_free, aligned_release, and aligned_reallocate only defined if KFR_MANAGED_ALLOCATION is on (default off)

Fixed

  • Custom port to fix the macosforge/alac bug
  • Fixed generic fallback for bittestany
  • Fixed u8/i8 shifts on x86 and related tests
  • Various smaller fixes

KFR 6.3.1

26 Aug 09:38

Choose a tag to compare

Bug-fix release.

Fixed

  • Fix u8/i8 shifts in MSVC
  • Refactor Bluestein's algorithm to make accuracy stable across all sizes
  • Improve test coverage for large SIMD vector types

KFR 6.3.0

18 Jul 15:34

Choose a tag to compare

Added

  • Progressive DFT execution

Changed

  • Matrix transpose performance has been improved by 10-30%
  • Optimize scalar to expression assignment for msvc (thanks to @zengdaiwei)

6.2.0

08 Apr 17:54

Choose a tag to compare

Added

  • Android x86 and x86_64 builds
  • Linux arm and aarch64 (arm64) builds

Changed

  • Documentation update

Fixed

  • Minor fixes to small_buffer and npy.hpp.

6.1.1

13 Jan 12:43

Choose a tag to compare

Changed

  • DFT performance has been improved by 30-80% for ARM and ARM64 cpus
  • DFT benchmark is now enabled for non-x86 builds

6.1.0

21 Nov 19:56

Choose a tag to compare

  • It is now possible to perform multidimensional DFT via the C API.
  • Documentation updated.
  • [Internal] Updated to the latest CxxDox for enhanced documentation features.
  • The Dims template parameter in dft_plan_md and dft_plan_md_real now defaults to dynamic_shape.
  • A workaround has been applied to mitigate the MSVC Internal Compiler Error.
  • Additional tests added.

Full Changelog: 6.0.4...6.1.0

6.0.4

28 Oct 11:18

Choose a tag to compare

This release includes fixes to ensure compatibility with Clang 19. No new features have been added.

6.0.3

17 Sep 13:54

Choose a tag to compare

KFR 6.0.3 fixes and improvements

  • More documentation (thanks to @Jalmenara)
  • Stateless parameter fixed
  • Fix build with non-MSVC on Win32 (thanks to @jcelerier)
  • Android fixes
  • Removed deprecated atomic initialization

6.0.2

14 Feb 10:45

Choose a tag to compare

What's new in KFR 6

  • DFT performance has been improved up to 40% (backported to KFR 5.2.0 branch)
  • C API for non x86 architectures
  • DSP refactoring with easier initialization
  • Multiarchitecture for resampling, FIR and IIR filters
  • matrix_transpose: optimized matrix transpose (square/non-square, inplace/out-of-place, real/complex, scalar/vectors)
  • CMake config file generation (find_package(KFR CONFIG) support, see installation)
  • .npy format support (reading/writing, v1/v2, c/fortran order, real/complex, bigendian/littleendian)
  • Multidimensional DFT: real/complex
  • inline_vector
  • Windows arm64 support
  • Emscripten (wasm/wasm64) support

Other changes

  • CMake minimum version is 3.12
  • Multidimensional reference DFT
  • Easier cross compilation to ARM64 on x86_64 macOS
  • Automated tests using GitHub Actions (previously Azure Pipelines)
  • GCC 7 and 8: emulate missing avx-512 instrinsics
  • read_group and write_group
  • [❗breaking change] reshape_may_copy and flatten_may_copy in tensor<> allows copying by default
  • shape<>::transpose function
  • tensor<>::transpose function
  • convert_endianess
  • DFT, DSP and IO sources have been moved to src/ directory
  • Multiarchitecture is enabled by default
  • KFR_DFT_NO_NPo2 has been removed (assumed always enabled)
  • Tests refactoring
  • Some tests moved to tests/internal/
  • [❗breaking change] Scalars are now passed by value in expressions (this fixes dangling references in some cases)
  • Expression functions should return expression_make_function instead of expression_function
  • KFR_WITH_CLANG
  • KFR_VERSION CMake variable
  • Functions to get module versions (library_version_dft, library_version_dsp etc)
  • Exceptions are no longer enforced in MSVC
  • kfr::complex removed (use std::complex instead). KFR_STD_COMPLEX cmake variable removed too
  • strides_for_shape for fortran order
  • AARCH and ARM emulation refactoring (dynamic libraries are now supported)
  • call_with_temp
  • maximum_dims is now 16 (was 8)
  • to_fmt/from_fmt supports inplace
  • shape refactoring: rotate_left, rotate_right, remove_back, remove_front
  • temp argument can be nullptr for DFT (temporary buffer will be allocated on stack or heap)
  • dft_plan and similar classes have now default and move constructors
  • -DCMAKE_POSITION_INDEPENDENT_CODE=ON is required for building C API
  • ci/run.sh can now build in a directory outside source tree
  • [❗breaking change]graphics/color.hpp and graphics/geometry.hpp have been removed
  • Simpler CMT_CVAL macro
  • /Zc:lambda is now required for building KFR in MSVC
  • println for string_view
  • MSVC internal compiler error fixed
  • Complex vector operators fixed