- Variance and standard deviation functions:
varianceandstddev
- Audio and IO modules can now be disabled during KFR build with
KFR_ENABLE_AUDIOandKFR_ENABLE_IOoptions (both on by default) @jcelerier - DSP module can be disabled too with
KFR_ENABLE_DSPoption (on by default) - Documentation migrated to mkdocs + cxxdox 2
- C++23 compatibility fixes
- Fixed
extend(vec)function for compound vectors
- 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.cmakemerges two directories into one with universal binaries- Custom port to fix the
macosforge/alacbug - New
ellipticfunction to design elliptic filters with ripple parameters (follows SciPy semantics) - Version information added for each module (
library_version_dsp,library_version_audio, etc.) samples_storeandsamples_loadconvert audio channels to/from stored formats (integer and floating-point, optional dithering)strided_channelclass for reading/writing strided data in KFR expressionsaudio_dataclass 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_encoderandaudio_decoderbase 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_fileanddecode_audio_filefunctions for simplified file handlingarangefunction added (similar to NumPy’s)- Added
has_expression_traits,input_expression,output_expression, andinput_output_expressionconcepts expr_elementconcept defines valid expression element types- Added
f_class,i_class, andu_classconcepts (is_f_class,is_i_class,is_u_class) - Added
not_f_class,not_i_class, andnot_u_classconcepts has_data_sizeconcept checks forstd::dataandstd::sizedefinitions- Added
filtfiltfor forward-backward IIR filtering - Added
arrangement_speakersandarrangement_for_channelsfunctions - Added
fopen_pathfor cross-platform UTF-8 file access; replacesfopen_portable memory_readerandmemory_writeradapters for user memory buffers- Added more tests for vector concatenation and slicing
- Minimal usage examples added under
tests/usage-configandtests/usage-manual - New RISC-V vector types:
f32rvv,i32rvv,u32rvv, etc. - Added
simd_compatconcept to verify SIMD element compatibility - Added
scoped_flush_denormalsRAII class to enable flush-to-zero semantics on x86 and ARM test_matrixfunction introduced (replacestesto::matrixfor Catch2 compatibility)
- Prebuilt binaries are tested after build
- Prebuilt binaries use Clang 21
KFR_ENABLE_MULTIARCHis forcibly turned off for non-x86KFR_USE_BOOST_MATHoption enables the use of standalone Boost.Math for elliptic filters (on by default)KFR_USE_BOOSToption 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_20CMake feature and inherited by dependent targets - Refactored CMake config with separate targets and dependency handling
add_kfr_libraryrefactored 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/thirdpartyorinclude/kfr/thirdparty - Old audio I/O handled by
audio_readerandaudio_writeris now deprecated reverseexpression is now writableaudio_sample_typenow represents bit depth; negative if floating-pointconvert_endiannessnow accepts references to data typessamplerate_converteris now default-, move-constructible, and move-assignableIO_SEEK_64andIO_TELL_64macros renamed toKFR_IO_SEEK_64andKFR_IO_TELL_64get_nth_typeoptimized for Clang and GCC- All
constexprvariables now markedinline 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]
cometanamespace merged intokfr; Cometa is no longer distributed separately. Replacecometawithkfrin your sources - [Breaking change] All macros renamed from
CMT_toKFR_; replace all occurrences ofCMT_withKFR_ - [Breaking change] All macros renamed from
TESTO_toKFR_; replace all occurrences ofTESTO_withKFR_ - [Breaking change]
cometa.hpprenamed tometa.hpp;kfr/cometa/*.hpprenamed tokfr/meta/*.hpp. Update your includes accordingly - [Breaking change]
kfr/testo/*.hpprenamed tokfr/test/*.hpp - [Breaking change] Some classes and functions no longer accept a template parameter and now default to
doublefor maximum precision. Related changes:zpk<float_type>replaced withzpkbessel<float_type>andbutterworth<float_type>replaced withbesselandbutterworthbilinear<float_type>,lp2lp_zpk<float_type>,lp2bs_zpk<float_type>,lp2bp_zpk<float_type>,lp2hp_zpk<float_type>, andwarp_freq<float_type>replaced with non-template equivalentsiir_lowpass<float_type>,iir_highpass<float_type>,iir_bandpass<float_type>,iir_bandstop<float_type>replaced with non-template equivalentsiir_params<float_type>still accepts a template parameter to control precisionto_sosnow acceptsfloat_type(defaultdouble) to returniir_params<float_type>- New
ellipticfunction follows the same rule and always produces double-precisionzpk
intrinsicsnamespace renamed tointr- Many functions from
iir_design.hppmoved tosrc/iir_design.cpp - Documentation updates: applying FIR/IIR filters, computing loudness, performing sample conversion
- [Breaking change]
KFR_ACCEPT_EXPRESSIONSremoved; replaced withexpression_argumentandexpression_argumentsconcepts - [Breaking change]
identityremoved; replaced with C++std::type_identity_t - [Breaking change]
output_expressionconcept replacesenable_if_output_expressiontrait - [Breaking change] 8-bit sample support removed
- [Breaking change] Fixed typo:
convert_endianess→convert_endianness - [Breaking change]
CMT_NOEXCEPTremoved; usenoexcept - [Breaking change] C API:
kfr_size_tandkfr_int32_tremoved; usesize_tandint32_t - [Breaking change]
Speaker→speaker_type,SpeakerArrangement→speaker_arrangement - [Breaking change]
from_lambdaparameter required to constructvecfrom a lambda generator ebu_r128now acceptsstd::spaninstead ofstd::vectorarraysizeandcarraysizeremoved; usestd::sizefrom C++17- Removed C++17 compatibility definitions for non-compliant compilers
- More functions marked
noexceptandconstexpr CMT_ENABLE_IFmostly replaced with concepts andrequires;KFR_ENABLE_IFstill availableCMT_CLANG_EXTrenamed toKFR_VEC_EXTand now usable with GCC- C API can now be built without exceptions
numericconcept replacesis_numeric<T1>predicatealigned_size,aligned_force_free,aligned_release, andaligned_reallocateonly defined ifKFR_MANAGED_ALLOCATIONis on (default off)
- Custom port to fix the
macosforge/alacbug - Fixed generic fallback for
bittestany - Fixed u8/i8 shifts on x86 and related tests
- Various smaller fixes
- Fix u8/i8 shifts on x86
- Refactor Bluestein's algorithm to make accuracy stable across all sizes
- Improve test coverage for large SIMD vector types
- Progressive DFT execution
- Matrix transpose performance has been improved by 10-30%
- Optimize scalar to expression assignment for msvc
- Android x86 and x86_64 builds
- Linux arm and aarch64 (arm64) builds
- Documentation update
- Minor fixes to
small_bufferandnpy.hpp.
- DFT performance has been improved by 30-80% for ARM and ARM64 cpus
- DFT benchmark is now enabled for non-x86 builds
- C API now supports Multidimensional DFT
- Documentation update
- Update to latest CxxDox
Dimstemplate parameter indft_plan_mdanddft_plan_md_realnow defaults todynamic_shape
- Clang 19 compatibility fix
- Added more Doxygen documentation for filter functions (@Jalmenara)
- Examples now include detailed comments
- Fixed stateless parameter
- Fixed build with non-MSVC on Win32 (@jcelerier)
- Resolved Android building issues
- Removed deprecated atomic initialization
- Windows arm64 support
- Emscripten (wasm/wasm64) support
complex_sizenow takes dft_pack_format as parameter
- 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) .npyformat support (reading/writing, v1/v2, c/fortran order, real/complex, bigendian/littleendian)- Multidimensional DFT: real/complex
inline_vector
- 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_groupandwrite_group- [❗breaking change]
reshape_may_copyandflatten_may_copyintensor<>allows copying by default shape<>::transposefunctiontensor<>::transposefunctionconvert_endianess- DFT, DSP and IO sources have been moved to
src/directory - Multiarchitecture is enabled by default
KFR_DFT_NO_NPo2has 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_functioninstead ofexpression_function KFR_WITH_CLANGKFR_VERSIONCMake variable- Functions to get module versions (
library_version_dft,library_version_dspetc) - Exceptions are no longer enforced in MSVC
kfr::complexremoved (usestd::complexinstead).KFR_STD_COMPLEXcmake variable removed toostrides_for_shapefor fortran order- AARCH and ARM emulation refactoring (dynamic libraries are now supported)
call_with_tempmaximum_dimsis now 16 (was 8)to_fmt/from_fmtsupports inplaceshaperefactoring:rotate_left,rotate_right,remove_back,remove_front- temp argument can be
nullptrfor DFT (temporary buffer will be allocated on stack or heap) dft_planand similar classes have now default and move constructors-DCMAKE_POSITION_INDEPENDENT_CODE=ONis required for building C APIci/run.shcan now build in a directory outside source tree- [❗breaking change]
graphics/color.hppandgraphics/geometry.hpphave been removed - Simpler
CMT_CVALmacro /Zc:lambdais now required for building KFR in MSVCprintlnforstring_view- MSVC internal compiler error fixed
- Complex vector operators fixed
2023-11-27
- The performance of DFT has been increased up to 40% compared to KFR 5 on x86 and x86_64 in single and double precision, inplace and out of place processing.
KFR_NO_PERF_TESTSdefine can now disable performance testsCMT_CVALfor extracting constexpr-enabled value fromcval_tfft_algorithm_selectionto select FFT algorithm for given FFT size.
- Warnings in Clang 10 kfrlib#198
std::is_povis peprecated in C++20 kfrlib#190- DFT sizes 0 and 1 were not processed correctly kfrlib#195
- Internal compiler error in Visual Studio Compiler 19.37 kfrlib#194
- Goertzel issue kfrlib#121
- Bug in
nearest_real_or_complexkfrlib#137 - Fixed operators in
KFR_STD_COMPLEXmode - Testo library: typo in
epsilon_scope - Fix ambiguities with std::identity (c++20)
- Force linking in correct order for multi-architecture binaries
2023-10-11
- Tukey window function
- Subscript operator for
vec<> - Unary operators for
vec<>
- Inverse DCT has been fixed
- Allow C API to be built on non-x86 systems
- Tensor iteration range has been fixed
transpose(vec<vec<>>)has been fixedvec<bit<>>bug on GCC and MSVC- Internal constant
is_podhas been removed rootandcbrthave been fixed for negative values- Fixed numerous warnings in MSVC
2023-06-26
- Planck-taper window function
- Sample rate conversion: automatic zero padding
- DFT: incorrect result of real dft when input size != 4N kfrlib#141
- Add options for installing libraries and headers kfrlib#182
2023-01-25
- ARM/ARM64 performance has been improved up to 2 times in various usage scenarios, including DFT.
- Fix sine and other functions not accepting scalar references
- Fix possible name conflict with fmt
2022-12-06
- Documentation updates
- MSVC fixes
- Ambiguous assign operator fixes
2022-11-30
- New
tensor<T, dims>class for multidimensional data (like numpy's nparray) - Histogram computation
- Normal (gaussian) distribution for random number generator
- All builtin expressions support multiple dimensions
- Exception support (may be configured to call user-supplied function or std::abort)
- [changes required] CMake variables now have
KFR_prefix - Template parameter deduction for
vec, sovec{1, 2}is the same asvec<int, 2>{1, 2} - [changes required]
random_stateis now architecture-agnostic and defined inkfrnamespace - All expression classes have been moved from
kfr::CMT_ARCH_NAME::internaltokfr::CMT_ARCH_NAMEnamespace expression_traits<T>introduced to support interpreting any object as kfr expression- [changes required] User-defined expressions should be rewritten to be used in KFR5
- Out-of-class assign operators for all input & output expressions
round.hpp,clamp.hpp,select.hpp,sort.hpp,saturation.hpp,min_max.hpp,logical.hpp,abs.hppheaders have been moved tosimdmodulestate_holder.hpphas been moved tobasemodule- All code related to expressions have been moved to
basemodule vec<T, N>::front()andvec<T, N>::front()are now writableset_elementsfunctions for output expressions likeget_elementsfor input expressions
- Documentation updates
2022-11-23
- C++20 compatibility fixes
2022-10-14
- Compile times improved and memory usage reduced for MSVC and GCC
cxxdoxversion updated- Tests for latest Clang, Azure Pipelines images are updated
- .editorconfig file
- Fixed incompatibility with latest GCC
- Fixed various Internal Compiler Error in latest MSVC2019
- Fixed tests for Clang 14
- Fixed bugs in gather/scatter and read/write functions
2021-04-29
- AVX512 intrinsics in MSVC and GCC
carg- Python 3.7 compatibility
- Global constants are now inline
2020-02-17
ENABLE_DFT_MULTIARCHcmake option can be used to buildkfr_dftwith multiple architectures support (x86/x86_64 only)config.his generated during install step with all#defines needed for correct usage of installed libraries
CMAKE_INSTALL_PREFIXis reset to empty on Win32 (can be overriden in cmake command line)- C API binary is now installed using install command (
make install,ninja installorcmake --build . --target install)
2020-03-04
- MSVC2019 support (16.4.4 is required)
- Stateless short_fir expression (thanks to https://github.com/slarew)
biquad_filterconstructor takingstd::vector<biquad_params<T>>(thanks to https://github.com/BenjaminNavarro)cabssqrfunction (thanks to https://github.com/slarew)moving_sumexpression (thanks to https://github.com/slarew)gen_expjgenerator (thanks to https://github.com/slarew)
cdirect_t{}is now allowed in real dft plan methods for compatibility- complex support for
convolve_filter(thanks to https://github.com/slarew)
- GCC debug build (thanks to https://github.com/BenjaminNavarro)
is_invocable_r_implfallback for missing C++17 featurestd::complexcompatibility (thanks to https://github.com/slarew)- Various CI fixes
2019-12-05
- IIR filter design
- Butterworth
- Chebyshev type I and II
- Bessel
- Lowpass, highpass, bandpass and bandstop filters
- Conversion of arbitrary filter from Z,P,K to SOS format (suitable for biquad function and filter)
- Discrete Cosine Transform type II and III
- cmake uninstall target
- C API:
- DFT
- real DFT
- DCT
- FIR
- IIR
- Convolution
- Aligned memory allocation
- Built for SSE2, SSE4.1, AVX, AVX2, AVX512, x86 and x86_64, architecture is selected at runtime
- New vector based types:
- color
- rectangle
- point
- size
- border
- geometric vector
- 2D matrix
- Color space conversion:
- sRGB
- linear RGB
- XYZ
- Lab
- LCH
- HSV
- MP3 audio reading
aligned_reallocatefunctionzipandcolumnfunctionsvec<vec<vec<T>>>support- New example:
iir.cpp biquadthat getsstd::vectorofbiquad_paramscsqrfunctionfactorialfunctionisrealfunctionmake_complexfunction for expressions- New optimization technique for vector element shuffle
std::get<>support forvec<>- C++17 structured bindings support for
vec<> - comparison operators for
cvals_t - compile time
cminof,cmaxoffunctions vector_width_forconstant to get vector width for specific architecture- make_univector for containers and arrays
- univector: copy constructor optimization
- Custom
assertion_failed
- C++17 compiler is required. Some of C++17 library features may be missing, in this case KFR uses custom implementation
castfunction now works with both vectors and expressions (expression versions was previously calledconvert)- Memory alignment can be up to 32768
- New implementation for
cometa::functionusing shared pointer memory.hppallocation functions has been moved to cometacconjhas been moved to simd module (instead ofmath)- dr_libs version updated
- All global constants are now
inline constexpr - enums moved out of architecture namespace
special_constant::undefinedremoved
- Fixed real DFT with raw poitners
- Bug with generators
- Fixed grid issues in dspplot
- Wrong index in
concatenate csqrtfunction- Fixed NaNs in
amp_to_dB - GCC 9 support
- Workaround for Clang 8.0 FMA code generator bug
- Flat top window
- SSE4.2 detection (previously detected as SSE4.1)
- MSVC support is limited to MSVC2017 due to ICE in MSVC2019. Once fixed, support will be added
- DFT is limited to Clang due to ICE in MSVC and broken AVX optimization in GCC 8 and 9. Once fixed, support will be added
2019-04-02
reducesupports different types and containers other thanunivector- Assignment operators for
univector:+=,*=etc concatenatefunction to concatenate two expressions sequentially- Audio file IO:
read_channels/write_channelsto read channels data directly without interleaving/deinterleaving as_string: support forstd::vector
expression_scalar: support forvec<T>
- CPU detection in cmake subdirectory
- MSVC 2017 32-bit intrinsics
2019-03-15
- Ability to pass
random_bit_generatorby reference - Tests for iOS ARM and ARM64
kfr::complexis placed inkfrnamespace
2019-03-13
- Detected CPU is now saved to CMake cache
- Linux/AArch64 tests have been added to CI
mask<>is now a specialization ofvec<>. This allows using manyvecfunctions for masksshort_firperformance has been increased by around 50%-60%
- Fixed the bug with infinitely loading in Intellisense
2019-03-07
- Android arm & arm64 tests have been added to CI
- Fixed Android support (thanks to https://github.com/Jman420)
- Fixed building cpu detection tool in CMake subdirectory (thanks to https://github.com/Jman420)
2019-02-21
- DFT speeds have been improved by up to 15% on most modern cpus
- Support for MSVC 2017
- Support for GCC 7.3
- Support for GCC 8.2
- Support for resampling complex vectors (Thanks to https://github.com/ermito)
- Tests for various math functions no longer depend on MPFR
- Testo now allocates much less memory during long tests (x3 less than previously)
- Building generators (Thanks to https://github.com/ermito)
2019-01-08
KFR_READCYCLECOUNTERmay be redefined to point to any function returning (pseudo-)random value- Ability to disable random number initialization functions
2018-12-27
- Partial compatibility for Visual Studio 2017
- Support for
KFR_USE_STD_ALLOCATION univectorsupport forabstract_reader/abstract_writer
- Paths in
CMakeLists.txt
2018-12-19
- More documentation
- dspplot:
freqticksparameter - dspplot:
freq_limparameter - dspplot:
freq_dB_limparameter - dspplot:
phaseargparameter - More tests for Sample Rate Converter
- Sample Rate Converter: now computes the transition width of the filter. This makes cutoff frequency more precise
- Sample Rate Converter: now uses Kaiser window with different β parameter for different quality. This leads to a better balance between transition width and sidelobes attenuation.
- Sample Rate Converter:
qualityparameter is now passed as runtime parameter rather than compile time parameter fir.cppexample has been extended to include examples of applying FIR filters
amp_to_dBfunction- 24-bit audio reading
2018-11-28
- WAV file reading/writing
- FLAC file reading
- Audio sample conversion
- Interleaving/deinterleaving
- sample_rate_converter example
- Sample Rate Converter:
process() function
- Assignment to an empty vector resizes it
- New documentation
- KFR IO is now built separately (only needed for audio file support)
- Resampler bug: sequential calls to
resampler::operator()may fail
- Optimized non-power of two DFT implementation
- Full AVX-512 support
- EBU R128
- Ability to include KFR as a subdirectory in cmake project
- Number of automatic tests has been increased
- C API for DFT
- Partial GCC 8.x support
- Ability to make sized linspace
fractiontype
- GPL version changed from 3 to 2+
- Refactoring of DFT code
- KFR DFT is now built separately
- FIR filter now supports different tap and sample types (thanks to @fbbdev)
- Various fixes for KFR functions
- FFT with size=128 on architectures with SSE only
- Small kfr::complex type fixes