# What's new in KFR 1.0

12 August 2016

#### 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 already optimized for armv7, armv7s and aarch64 (arm64).

#### Intel SSE2..4.2 and AVX1..2

KFR produces code optimized for latest Intel and AMD processors as well as for legacy ones.

#### Generic implementation New in 1.0

In addition to optimized ones, generic implementation of vector functions is available for all other architectures.

### Fast Fourier Transform Improved in 1.0

Our FFT implementation is fastest according to recent benchmarks.

In version 1.0 compilation of FFT also became faster.

Moreover, full support of complex numbers makes using of FFT a lot easier.

### 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 format 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 DC bias is as easy as calling one function.

const univector<double, 4410> vv = dcremove(sequence(1, 2));
// vv = {..., -0.5, 0.5}


##### Oscillators

Oscillators in KFR framework is both accurate and fast, so you can use more oscillators or use higher sample rate to achieve even better quality.

In addition, incremental oscillators is 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

KFR framework contains fast implementations of both Finite and Infinite Impulse Response filters, FIR filter design using window method and set of functions to easily setup 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 FIR filter you can archieve 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 used algorithms and code size).