VISR  0.11.1
Versatile Interactive Scene Renderer
core_convolver_uniform.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_LIBRBBL_CORE_CONVOLVER_UNIFORM_HPP_INCLUDED
4 #define VISR_LIBRBBL_CORE_CONVOLVER_UNIFORM_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
10 
13 
14 #include <cassert>
15 #include <complex>
16 #include <initializer_list>
17 #include <map>
18 #include <memory>
19 #include <vector>
20 
21 namespace visr
22 {
23 namespace rbbl
24 {
25 
32 template< typename SampleType >
33 class VISR_RBBL_LIBRARY_SYMBOL CoreConvolverUniform
34 {
35 public:
44 
58  explicit CoreConvolverUniform( std::size_t numberOfInputs,
59  std::size_t numberOfOutputs,
60  std::size_t blockLength,
61  std::size_t maxFilterLength,
62  std::size_t maxFilterEntries,
64  std::size_t alignment = 0,
65  char const * fftImplementation = "default" );
66 
71 
75  std::size_t numberOfInputs() const { return mNumberOfInputs; }
76 
77  std::size_t numberOfOutputs() const { return mNumberOfOutputs; }
78 
79  std::size_t blockLength() const { return mBlockLength; }
80 
85  std::size_t dftBlockRepresentationSize() const { return mDftRepresentationSizePadded; }
86 
87  std::size_t numberOfFilterPartitions() const { return mNumberOfFilterPartitions; }
88 
92  std::size_t dftFilterRepresentationSize() const { return dftBlockRepresentationSize() * numberOfFilterPartitions(); }
93 
94  std::size_t maxNumberOfFilterEntries() const { return mFilterPartitionsFrequencyDomain.numberOfRows(); }
95 
96  std::size_t maxFilterLength() const { return mMaxFilterLength; }
97 
105  void clearFilters( );
106 
116  void initFilters( efl::BasicMatrix<SampleType> const & newFilters );
117 
118  void setImpulseResponse( SampleType const * ir, std::size_t filterLength, std::size_t filterIdx, std::size_t alignment = 0 );
119 
120  void processInputs( SampleType const * const input, std::size_t channelStride, std::size_t alignment );
121 
125  void processFilter( std::size_t inputIndex, std::size_t filterIndex, SampleType gain,
126  FrequencyDomainType * result, bool add );
127 
128  void transformOutput( FrequencyDomainType const * fdBlock, SampleType * tdResult );
129 
137  static std::size_t calculateNumberOfPartitions( std::size_t filterLength, std::size_t blockLength );
138 
142  static std::size_t calculateDftSize( std::size_t blockLength );
143 
149  static std::size_t calculateDftRepresentationSizePadded( std::size_t blockLength, std::size_t alignment );
150 
157  SampleType calculateFilterScalingFactor() const;
159 
160  inline FrequencyDomainType * getFdlBlock( std::size_t inputIdx, std::size_t blockIdx );
161 
162  inline FrequencyDomainType const * getFdlBlock( std::size_t inputIdx, std::size_t blockIdx ) const;
163 
164  inline FrequencyDomainType * getFdFilterPartition( std::size_t filterIdx, std::size_t blockIdx );
165 
166  inline FrequencyDomainType const * getFdFilterPartition( std::size_t filterIdx, std::size_t blockIdx ) const;
167 
168  std::size_t alignment() const { return mAlignment; }
169 
170  std::size_t complexAlignment() const { return mComplexAlignment; }
171 
176  void advanceFDL();
177 
184  void setFilter( FrequencyDomainType const * transformedFilter, std::size_t filterIdx, std::size_t alignment = 0 );
186 
194  void transformImpulseResponse( SampleType const * ir, std::size_t irLength, FrequencyDomainType * result, std::size_t alignment = 0 ) const;
195 private:
196 
201  static std::size_t calculateDftRepresentationSize( std::size_t blockLength );
202 
208  std::size_t const mAlignment;
209 
210  std::size_t const mComplexAlignment;
211 
212  std::size_t const mNumberOfInputs;
213 
214  std::size_t const mNumberOfOutputs;
215 
216  std::size_t const mBlockLength;
217 
218  std::size_t const mMaxFilterLength;
219 
220  std::size_t const mNumberOfFilterPartitions;
221 
225  std::size_t const mDftSize;
226 
227 // std::size_t const mDftRepresentationSize;
228 
229  std::size_t const mDftRepresentationSizePadded;
230 
231  rbbl::CircularBuffer<SampleType> mInputBuffers;
232 
234 
239  std::size_t mFdlCycleOffset;
240 
245  mutable efl::BasicVector<SampleType> mTimeDomainTransformBuffer;
246 
247 
248  efl::BasicMatrix<std::complex<SampleType> > mFilterPartitionsFrequencyDomain;
249 
253  efl::BasicVector<std::complex<SampleType> > mFrequencyDomainAccumulator;
254 
255  std::unique_ptr<rbbl::FftWrapperBase<SampleType> > mFftRepresentation;
256 
261  SampleType const mFilterScalingFactor;
262 };
263 
264 template<typename SampleType>
266 CoreConvolverUniform<SampleType>::getFdlBlock( std::size_t inputIdx, std::size_t blockIdx )
267 {
268  assert( inputIdx < mNumberOfInputs );
269  assert( blockIdx < mNumberOfFilterPartitions );
270  std::size_t const columnIdx = ((mFdlCycleOffset + blockIdx) % mNumberOfFilterPartitions) * mDftRepresentationSizePadded;
271  return mInputFDL.row( inputIdx ) + columnIdx;
272 }
273 
274 template<typename SampleType>
276 CoreConvolverUniform<SampleType>::getFdlBlock( std::size_t inputIdx, std::size_t blockIdx ) const
277 {
278  assert( inputIdx < mNumberOfInputs );
279  assert( blockIdx < mNumberOfFilterPartitions );
280  std::size_t const columnIdx = ((mFdlCycleOffset + blockIdx) % mNumberOfFilterPartitions) * mDftRepresentationSizePadded;
281  return mInputFDL.row( inputIdx) + columnIdx;
282 }
283 
284 template<typename SampleType>
287 getFdFilterPartition( std::size_t filterIdx, std::size_t blockIdx )
288 {
289  assert( filterIdx < maxNumberOfFilterEntries() );
290  assert( blockIdx < mNumberOfFilterPartitions );
291  std::size_t const columnIdx = blockIdx * mDftRepresentationSizePadded;
292  return mFilterPartitionsFrequencyDomain.row( filterIdx ) + columnIdx;
293 }
294 
295 template<typename SampleType>
297 CoreConvolverUniform<SampleType>::getFdFilterPartition( std::size_t filterIdx, std::size_t blockIdx ) const
298 {
299  assert( filterIdx < maxNumberOfFilterEntries( ) );
300  assert( blockIdx < mNumberOfFilterPartitions );
301  std::size_t const columnIdx = blockIdx * mDftRepresentationSizePadded;
302  return mFilterPartitionsFrequencyDomain.row( filterIdx ) + columnIdx;
303 }
304 
305 } // namespace rbbl
306 } // namespace visr
307 
308 #endif // #ifndef VISR_LIBRBBL_CORE_CONVOLVER_UNIFORM_HPP_INCLUDED
std::size_t dftBlockRepresentationSize() const
Definition: core_convolver_uniform.hpp:85
std::size_t blockLength() const
Definition: core_convolver_uniform.hpp:79
std::size_t numberOfFilterPartitions() const
Definition: core_convolver_uniform.hpp:87
FrequencyDomainType * getFdlBlock(std::size_t inputIdx, std::size_t blockIdx)
Definition: core_convolver_uniform.hpp:266
std::size_t complexAlignment() const
Definition: core_convolver_uniform.hpp:170
Definition: options.cpp:10
typename FftWrapperBase< SampleType >::FrequencyDomainType FrequencyDomainType
Definition: core_convolver_uniform.hpp:43
std::size_t maxNumberOfFilterEntries() const
Definition: core_convolver_uniform.hpp:94
std::size_t alignment() const
Definition: core_convolver_uniform.hpp:168
std::complex< DataType > FrequencyDomainType
Definition: fft_wrapper_base.hpp:22
std::size_t dftFilterRepresentationSize() const
Definition: core_convolver_uniform.hpp:92
std::size_t numberOfOutputs() const
Definition: core_convolver_uniform.hpp:77
FrequencyDomainType * getFdFilterPartition(std::size_t filterIdx, std::size_t blockIdx)
Definition: core_convolver_uniform.hpp:287
std::size_t maxFilterLength() const
Definition: core_convolver_uniform.hpp:96
float SampleType
Definition: constants.hpp:14
Definition: core_convolver_uniform.hpp:33
std::size_t numberOfInputs() const
Definition: core_convolver_uniform.hpp:75