What's new in KFR 1.0
ARM NEON support New in 1.0
One of the most significant features added since the previous version is full ARM NEON support. All
algorithms bundled with KFR 1.0 are already optimized for armv7, armv7s and
aarch64 (arm64).
Intel SSE2..4.2 and AVX1..2
KFR produces code optimized for the latest Intel and AMD processors as well as for legacy ones.
Generic implementation New in 1.0
In addition to optimized ones, a generic implementation of vector functions is available for all other architectures.
Fast Fourier Transform Improved in 1.0
Our FFT implementation performs very well in recent benchmarks. See the FFT benchmarks for details.
In version 1.0, FFT compilation also became faster.
Moreover, full support for complex numbers makes FFT a lot easier to use.
DSP algorithms
Dozens of new features have been added, including the following:
Stereo conversion New in 1.0
You can now convert left/right to mid/side and vice versa in one pass. Both split and interleaved formats are supported.
const univector<double, 12> left = sequence(1, 2, 3, 2);
const univector<double, 12> right = sequence(3, 2, 1, 2);
univector<double, 12> mid;
univector<double, 12> side;
pack(mid, side) = mixdown_stereo(left, right, matrix_sum_diff());
// mid = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}
// side = {-2, 0, 2, 0, -2, 0, 2, 0, -2, 0, 2, 0}
Delay line New in 1.0
const univector<double, 12> vv = delay(sequence(1, 2, 3, 4), csize<3>);
// vv = {0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 1}
DC removal filter New in 1.0
Removing a DC bias is as easy as calling a single function.
const univector<double, 4410> vv = dcremove(sequence(1, 2));
// vv = {..., -0.5, 0.5}
Oscillators
Oscillators in the KFR framework are both accurate and fast, so you can use more oscillators or a higher sample rate to achieve even better quality.
In addition, incremental oscillators are also available.
const univector<double, 256> o1 = sine(linspace(0, 32, 256));
const univector<double, 256> o2 = square(linspace(0, 32, 256));
const univector<double, 256> o3 = sawtooth(linspace(0, 32, 256));
const univector<double, 256> o4 = triangle(linspace(0, 32, 256));
FIR and IIR filtering and filter design
The KFR framework contains fast implementations of both Finite and Infinite Impulse Response filters, FIR filter design using the window method, and a set of functions to easily set up biquad filters.
Upsample/Downsample by powers of two New in 1.0
As of version 1.0.0 the following functions have been added: upsample2, upsample4, downsample2 and downsample4.
In combination with a FIR filter, you can achieve high-quality results with minimal code.
Also in version 1.0
Improvements and fixes Improved in 1.0
Lots of small improvements and fixes (nearly 200 commits since the previous version)
New tests have been added New in 1.0
Many new tests have been added, not only to check new functionality but also to more stringently check existing functionality.
Build time improvements Improved in 1.0
Build time has been reduced by 10-50% (depending on the algorithms used and the code size).