Merge from branch bqfft

This commit is contained in:
Chris Cannam
2021-05-10 12:56:07 +01:00
9 changed files with 1064 additions and 1859 deletions

View File

@@ -87,8 +87,8 @@ Rubber Band consists of:
* The Rubber Band Library code. This is the code that will normally * The Rubber Band Library code. This is the code that will normally
be used by your applications. The headers for this are in the be used by your applications. The headers for this are in the
rubberband/ directory, and the source code is in src/. rubberband/ directory, and the source code is in src/.
The Rubber Band Library depends upon resampler and FFT code; see The Rubber Band Library may also depend upon external resampler
section 3a below for details. and FFT code; see section 3a below for details.
* The Rubber Band command-line tool. This is in main/main.cpp. * The Rubber Band command-line tool. This is in main/main.cpp.
This program uses the Rubber Band Library and also requires libsndfile This program uses the Rubber Band Library and also requires libsndfile
@@ -194,9 +194,9 @@ standard. It is unlikely to make any difference (performance or
otherwise) which C++ standard your compiler uses - as long as it's no otherwise) which C++ standard your compiler uses - as long as it's no
older than C++98! older than C++98!
If you are building this software using one of the bundled library If you are building this software using either of the Speex or KissFFT
options (Speex or KissFFT), please be sure to review the terms for library options, please be sure to review the terms for those
those libraries in `src/speex/COPYING` and `src/kissfft/COPYING` as libraries in `src/speex/COPYING` and `src/kissfft/COPYING` as
applicable. applicable.
@@ -369,13 +369,26 @@ options (Speex or KissFFT), please be sure to review the terms for
those libraries in `src/speex/COPYING` and `src/kissfft/COPYING` as those libraries in `src/speex/COPYING` and `src/kissfft/COPYING` as
applicable. applicable.
If you are proposing to package Rubber Band for a Linux distribution
using other packaged libraries, please select FFTW and libsamplerate.
#### FFT libraries supported #### FFT libraries supported
``` ```
Library Build option CPP define Notes Library Build option CPP define Notes
---- ------------ ---------- ----- ---- ------------ ---------- -----
KissFFT -Dfft=kissfft -DUSE_KISSFFT Default except on macOS/iOS. Built-in -Dfft=builtin -DUSE_BUILTIN_FFT
Default except on macOS/iOS.
Can be distributed with either
the Rubber Band GPL or
commercial licence.
KissFFT -Dfft=kissfft -DHAVE_KISSFFT
Single precision.
Only indicated for use with
single-precision sample type
(see below).
Bundled, can be distributed with Bundled, can be distributed with
either the Rubber Band GPL or either the Rubber Band GPL or
commercial licence. commercial licence.
@@ -432,8 +445,9 @@ build files will handle these for you.)
-DPROCESS_SAMPLE_TYPE=float -DPROCESS_SAMPLE_TYPE=float
Select single precision for internal calculations. The default is Select single precision for internal calculations. The default is
double precision. Consider using for mobile architectures with double precision. Consider in conjunction with single-precision
slower double-precision support. KissFFT for mobile architectures with slower double-precision
support.
-DUSE_POMMIER_MATHFUN -DUSE_POMMIER_MATHFUN
Select the Julien Pommier implementations of trig functions for ARM Select the Julien Pommier implementations of trig functions for ARM

View File

@@ -77,7 +77,7 @@
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild> <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -91,7 +91,7 @@
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader> <PrecompiledHeader>
@@ -109,7 +109,7 @@
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers> <OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
@@ -127,7 +127,7 @@
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers> <OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
@@ -178,8 +178,6 @@
<ClCompile Include="..\src\dsp\AudioCurveCalculator.cpp" /> <ClCompile Include="..\src\dsp\AudioCurveCalculator.cpp" />
<ClCompile Include="..\src\dsp\FFT.cpp" /> <ClCompile Include="..\src\dsp\FFT.cpp" />
<ClCompile Include="..\src\dsp\Resampler.cpp" /> <ClCompile Include="..\src\dsp\Resampler.cpp" />
<ClCompile Include="..\src\kissfft\kiss_fft.c" />
<ClCompile Include="..\src\kissfft\kiss_fftr.c" />
<ClCompile Include="..\src\rubberband-c.cpp" /> <ClCompile Include="..\src\rubberband-c.cpp" />
<ClCompile Include="..\src\RubberBandStretcher.cpp" /> <ClCompile Include="..\src\RubberBandStretcher.cpp" />
<ClCompile Include="..\src\speex\resample.c" /> <ClCompile Include="..\src\speex\resample.c" />

View File

@@ -2,7 +2,7 @@
project( project(
'Rubber Band Library', 'Rubber Band Library',
'c', 'cpp', 'c', 'cpp',
version: '1.9.1', version: '1.9.2-pre',
license: 'GPL-2.0-or-later', license: 'GPL-2.0-or-later',
default_options: [ default_options: [
# All Rubber Band code is actually C++98, but some compilers no # All Rubber Band code is actually C++98, but some compilers no
@@ -132,7 +132,7 @@ if fft == 'auto'
if system == 'darwin' if system == 'darwin'
fft = 'vdsp' fft = 'vdsp'
else else
fft = 'kissfft' fft = 'builtin'
endif endif
endif endif
@@ -144,14 +144,23 @@ if resampler == 'auto'
endif endif
endif endif
if fft == 'kissfft' if fft == 'builtin'
config_summary += { 'FFT': 'Built-in' }
message('For FFT: using built-in implementation')
if fftw3_dep.found()
message('(to use FFTW instead, reconfigure with -Dfft=fftw)')
endif
feature_defines += ['-DUSE_BUILTIN_FFT']
elif fft == 'kissfft'
config_summary += { 'FFT': 'KissFFT' } config_summary += { 'FFT': 'KissFFT' }
message('For FFT: using KissFFT') message('For FFT: using KissFFT')
if fftw3_dep.found() if fftw3_dep.found()
message('(to use FFTW instead, reconfigure with -Dfft=fftw)') message('(to use FFTW instead, reconfigure with -Dfft=fftw)')
endif endif
feature_sources += ['src/kissfft/kiss_fft.c', 'src/kissfft/kiss_fftr.c'] feature_sources += ['src/kissfft/kiss_fft.c', 'src/kissfft/kiss_fftr.c']
feature_defines += ['-DUSE_KISSFFT'] feature_defines += ['-DHAVE_KISSFFT']
general_include_dirs += 'src/kissfft'
elif fft == 'fftw' elif fft == 'fftw'
if fftw3_dep.found() if fftw3_dep.found()

View File

@@ -1,9 +1,9 @@
option('fft', option('fft',
type: 'combo', type: 'combo',
choices: ['auto', 'kissfft', 'fftw', 'vdsp', 'ipp'], choices: ['auto', 'builtin', 'kissfft', 'fftw', 'vdsp', 'ipp'],
value: 'auto', value: 'auto',
description: 'FFT library to use. The default (auto) will use vDSP if available, KissFFT otherwise.') description: 'FFT library to use. The default (auto) will use vDSP if available, the builtin implementation otherwise.')
option('resampler', option('resampler',
type: 'combo', type: 'combo',

View File

@@ -6,7 +6,7 @@ OPTFLAGS := -DNDEBUG -ffast-math -O3 -ftree-vectorize
ARCHFLAGS := ARCHFLAGS :=
CXXFLAGS := -std=c++98 $(ARCHFLAGS) $(OPTFLAGS) -I. -Isrc -Irubberband -DHAVE_LIBSAMPLERATE -DUSE_KISSFFT -DNO_THREAD_CHECKS -DUSE_PTHREADS -DNO_TIMING -DHAVE_POSIX_MEMALIGN -DNDEBUG CXXFLAGS := -std=c++98 $(ARCHFLAGS) $(OPTFLAGS) -I. -Isrc -Irubberband -DHAVE_LIBSAMPLERATE -DUSE_BUILTIN_FFT -DNO_THREAD_CHECKS -DUSE_PTHREADS -DNO_TIMING -DHAVE_POSIX_MEMALIGN -DNDEBUG
CFLAGS := $(ARCHFLAGS) $(OPTFLAGS) CFLAGS := $(ARCHFLAGS) $(OPTFLAGS)
@@ -69,10 +69,8 @@ LIBRARY_SOURCES := \
src/system/sysutils.cpp \ src/system/sysutils.cpp \
src/system/Thread.cpp \ src/system/Thread.cpp \
src/StretcherChannelData.cpp \ src/StretcherChannelData.cpp \
src/StretcherImpl.cpp \ src/StretcherImpl.cpp
src/kissfft/kiss_fft.c \
src/kissfft/kiss_fftr.c
LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o) LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o)
LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o) LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o)

View File

@@ -77,7 +77,7 @@
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild> <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -91,7 +91,7 @@
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;_DEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;USE_SPEEX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<PrecompiledHeader> <PrecompiledHeader>
@@ -109,7 +109,7 @@
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers> <OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
@@ -127,7 +127,7 @@
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers> <OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_KISSFFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>__MSVC__;WIN32;NDEBUG;_LIB;NOMINMAX;_USE_MATH_DEFINES;USE_BUILTIN_FFT;NO_TIMING;USE_SPEEX;NO_THREAD_CHECKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck> <BufferSecurityCheck>false</BufferSecurityCheck>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
@@ -178,8 +178,6 @@
<ClCompile Include="..\src\dsp\AudioCurveCalculator.cpp" /> <ClCompile Include="..\src\dsp\AudioCurveCalculator.cpp" />
<ClCompile Include="..\src\dsp\FFT.cpp" /> <ClCompile Include="..\src\dsp\FFT.cpp" />
<ClCompile Include="..\src\dsp\Resampler.cpp" /> <ClCompile Include="..\src\dsp\Resampler.cpp" />
<ClCompile Include="..\src\kissfft\kiss_fft.c" />
<ClCompile Include="..\src\kissfft\kiss_fftr.c" />
<ClCompile Include="..\src\rubberband-c.cpp" /> <ClCompile Include="..\src\rubberband-c.cpp" />
<ClCompile Include="..\src\RubberBandStretcher.cpp" /> <ClCompile Include="..\src\RubberBandStretcher.cpp" />
<ClCompile Include="..\src\speex\resample.c" /> <ClCompile Include="..\src\speex\resample.c" />

File diff suppressed because it is too large Load Diff

View File

@@ -64,6 +64,8 @@ public:
FFT(int size, int debugLevel = 0); // may throw InvalidSize FFT(int size, int debugLevel = 0); // may throw InvalidSize
~FFT(); ~FFT();
int getSize() const;
void forward(const double *R__ realIn, double *R__ realOut, double *R__ imagOut); void forward(const double *R__ realIn, double *R__ realOut, double *R__ imagOut);
void forwardInterleaved(const double *R__ realIn, double *R__ complexOut); void forwardInterleaved(const double *R__ realIn, double *R__ complexOut);
void forwardPolar(const double *R__ realIn, double *R__ magOut, double *R__ phaseOut); void forwardPolar(const double *R__ realIn, double *R__ magOut, double *R__ phaseOut);
@@ -121,6 +123,10 @@ protected:
FFTImpl *d; FFTImpl *d;
static std::string m_implementation; static std::string m_implementation;
static void pickDefaultImplementation(); static void pickDefaultImplementation();
private:
FFT(const FFT &); // not provided
FFT &operator=(const FFT &); // not provided
}; };
} }

View File

@@ -366,32 +366,32 @@ inline void v_scale(double *const R__ dst,
} }
#endif #endif
template<typename T> template<typename T, typename S>
inline void v_multiply(T *const R__ dst, inline void v_multiply(T *const R__ srcdst,
const T *const R__ src, const S *const R__ src,
const int count) const int count)
{ {
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
dst[i] *= src[i]; srcdst[i] *= src[i];
} }
} }
#if defined HAVE_IPP #if defined HAVE_IPP
template<> template<>
inline void v_multiply(float *const R__ dst, inline void v_multiply(float *const R__ srcdst,
const float *const R__ src, const float *const R__ src,
const int count) const int count)
{ {
ippsMul_32f_I(src, dst, count); ippsMul_32f_I(src, srcdst, count);
} }
template<> template<>
inline void v_multiply(double *const R__ dst, inline void v_multiply(double *const R__ srcdst,
const double *const R__ src, const double *const R__ src,
const int count) const int count)
{ {
ippsMul_64f_I(src, dst, count); ippsMul_64f_I(src, srcdst, count);
} }
#endif #endif // HAVE_IPP
template<typename T> template<typename T>
inline void v_multiply(T *const R__ dst, inline void v_multiply(T *const R__ dst,