Skip to content

Commit

Permalink
[resampling] fix decimator build
Browse files Browse the repository at this point in the history
  • Loading branch information
AchimTuran committed Dec 18, 2019
1 parent a553572 commit 25c4e8d
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,27 @@
*
*/



#include "Resampling/Decimator/asplib_Decimator.hpp"

// math includes should be the first as includes to STL override the _USE_MATH_DEFINES define...
#if defined(TARGET_WINDOWS)
#define _USE_MATH_DEFINES
#endif
#include <cmath>

// resampling includes
#include "Resampling/Decimator/asplib_Decimator.hpp"



namespace asplib
{
CDecimator::CDecimator()
CDecimator::CDecimator() :
m_inputFrameSize(0),
m_outputFrameSize(0),
m_filterLength(0),
m_sampleFrequency(0),
m_decimationFactor(0),
m_cutOffFrequency(0.0f)
{
m_FrameSize = 0;
m_FilterLength = 0;
m_SampleFrequency = 0;
m_DecimationFactor = 0;
m_CutOffFrequency = 0.0f;
}


Expand All @@ -48,18 +50,18 @@ CDecimator::~CDecimator()
}


ASPLIB_ERR CDecimator::Create(uint32_t FrameSize, uint32_t SampleFrequency, void *Options/* = nullptr*/)
ASPLIB_ERR CDecimator::Create(const uint32_t InputFrameSize, const uint32_t OutputFrameSize, const uint32_t SampleFrequency, const void *Options/* = nullptr*/)
{
DecimatorOptions options;
if (Options)
{
CExtendedStructs *extendedStruct = static_cast<CExtendedStructs*>(Options);
const CExtendedStructs *extendedStruct = static_cast<const CExtendedStructs*>(Options);
if (extendedStruct->ID != ASPLIB_EXTENDED_STRUCT_DecimatorOptions)
{
return ASPLIB_ERR_FFT_INVALID_OPTIONS_STRUCT;
}

DecimatorOptions *pOptions = static_cast<DecimatorOptions*>(Options);
const DecimatorOptions *pOptions = static_cast<const DecimatorOptions*>(Options);
if (pOptions->decimationFactor <= 1.0)
{
return ASPLIB_ERR_INVALID_INPUT;
Expand All @@ -70,51 +72,50 @@ ASPLIB_ERR CDecimator::Create(uint32_t FrameSize, uint32_t SampleFrequency, void
options.cutoffFrequency = pOptions->cutoffFrequency;
}

if (FrameSize <= 0 || SampleFrequency <= 0)
if (InputFrameSize <= 0 || SampleFrequency <= 0)
{
return ASPLIB_ERR_INVALID_INPUT;
}
m_FrameSize = FrameSize;
m_SampleFrequency = SampleFrequency;

float val = 0.0f;
float normFrequency = m_CutOffFrequency / m_SampleFrequency;
uint32_t filterOrder = m_FilterLength - 1;

for (size_t ii = 0; ii < m_FilterLength; ii++)
m_inputFrameSize = InputFrameSize;
m_sampleFrequency = SampleFrequency;
m_cutOffFrequency = options.cutoffFrequency;
m_filterLength = options.filterLength;

const float normFrequency = m_cutOffFrequency / m_sampleFrequency;
const uint32_t filterOrder = m_filterLength - 1;

for (size_t ii = 0; ii < m_filterLength; ii++)
{
val = sinf(2.0f*M_PI*normFrequency*(ii - filterOrder*0.5f)) / (M_PI * (ii - filterOrder*0.5f));
m_FilterCoeff[ii] = val*(0.54 - 0.46*cos(2 * M_PI*ii / filterOrder));
float val = ::sinf(2.0f*static_cast<float>(M_PI)*normFrequency*(ii - filterOrder*0.5f)) / (static_cast<float>(M_PI) * (ii - filterOrder*0.5f));
m_filterCoeff[ii] = val*(0.54f - 0.46f*::cos(2.0f * static_cast<float>(M_PI)*ii / filterOrder));
}
m_FilterCoeff[filterOrder / 2] = 2.0f * normFrequency;
m_filterCoeff[filterOrder / 2] = 2.0f * normFrequency;

m_convolutionBuffer.resize(m_inputFrameSize + m_filterLength - 1, 0.0f);

return ASPLIB_ERR_NO_ERROR;
}


ASPLIB_ERR CDecimator::Process(void *In, void *Out)
ASPLIB_ERR CDecimator::Process(const void *In, void *Out)
{
float *in = static_cast<float*>(In);
const float *in = static_cast<const float*>(In);
float *out = static_cast<float*>(Out);

// Die Laenge des Ausgangspuffers ist ja kleiner als des Eingangspuffers. Wie komme ich an diese Länge?
uint32_t convolutionLength = m_FrameSizeInput + m_FilterLength - 1;
float outTemp[convolutionLength];

for (uint32_t ii = 0; ii < convolutionLength; ii++)
for (uint32_t ii = 0; ii < m_convolutionBuffer.size(); ii++)
{
outTemp[ii] = 0.0;
for (size_t jj = 0; jj < m_FilterLength; jj++)
m_convolutionBuffer[ii] = 0.0;
for (size_t jj = 0; jj < m_filterLength; jj++)
{
if ((ii - jj) <= 1 && (ii - jj) <= m_FrameSizeInput)// Input Größe
if ((ii - jj) <= 1 && (ii - jj) <= m_inputFrameSize)// Input Größe
{
outTemp[ii] += outTemp[ii] + m_FilterCoeff[jj] * in[ii - jj];
m_convolutionBuffer[ii] += m_convolutionBuffer[ii] + m_filterCoeff[jj] * in[ii - jj];
}
}

for (size_t kk = 0; kk < m_FrameSizeTemp; kk++) // Ausgangsgröße
for (size_t kk = 0; kk < m_outputFrameSize; kk++) // Ausgangsgröße
{
out[ii] = m_DecimationFactor*outTemp[kk * m_DecimationFactor];
out[ii] = m_decimationFactor* m_convolutionBuffer[kk * m_decimationFactor];
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,17 @@



// core includes
#include "Core/os/asplib_os.h"
#include "Core/Constants_Typedefs/asplib_Typedefs.h"

// resampling includes
#include "Resampling/Decimator/asplib_DecimatorOptions.hpp"

#include "Resampling/Interfaces/asplib_IResampling.hpp"

// STL includes
#include <vector>


namespace asplib
{
Expand All @@ -39,19 +43,21 @@ namespace asplib
CDecimator();
~CDecimator();

virtual ASPLIB_ERR Create(uint32_t FrameSize, uint32_t SampleFrequency, void *Options = nullptr);
virtual ASPLIB_ERR Process(void *In, void *Out);
virtual ASPLIB_ERR Destroy();
ASPLIB_ERR Create(const uint32_t InputFrameSize, const uint32_t OutputFrameSize, const uint32_t SampleFrequency, const void *Options = nullptr) override;
ASPLIB_ERR Process(const void *In, void *Out) override;
ASPLIB_ERR Destroy() override;

private:
uint32_t m_FrameSize;
uint32_t m_SampleFrequency;
float m_CutOffFrequency;
uint32_t m_inputFrameSize;
uint32_t m_outputFrameSize;
uint32_t m_sampleFrequency;
float m_cutOffFrequency;

uint32_t m_DecimationFactor;
uint32_t m_FilterLength;
float *m_FilterCoeff;
uint32_t m_decimationFactor;
uint32_t m_filterLength;
float *m_filterCoeff;

std::vector<float> m_convolutionBuffer;
};
}
#pragma once
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ namespace asplib
{
class IResampling
{
virtual ASPLIB_ERR Create(uint32_t FrameSize, uint32_t SampleFrequency, void *Options = nullptr) = 0;
virtual ASPLIB_ERR Process(void *In, void *Out) = 0;
virtual ASPLIB_ERR Create(const uint32_t FrameSize, const uint32_t OutputFrameSize, const uint32_t SampleFrequency, const void *Options = nullptr) = 0;
virtual ASPLIB_ERR Process(const void *In, void *Out) = 0;
virtual ASPLIB_ERR Destroy() = 0;
};
}

0 comments on commit 25c4e8d

Please sign in to comment.