Refactoring ITA HDFT spectrum and spectra, now uses std::vector instead of...

Refactoring ITA HDFT spectrum and spectra, now uses std::vector instead of malloc/free. And ITA-style BigCaps methods.
parent 6a571ffb
......@@ -42,7 +42,7 @@ class ITA_BASE_API ITAHDFTSpectra
public:
//! Constructor that initializes the
ITAHDFTSpectra( const double dSampleRate, const int iNumChannels, const int iDFTSize, const bool bZeroInit=true );
ITAHDFTSpectra( const float fSampleRate, const int iNumChannels, const int iDFTSize, const bool bZeroInit=true );
//! Constructor that uses a non-empty HDFTSpectrum vector
ITAHDFTSpectra( const std::vector< ITAHDFTSpectrum* >& vpSpectrumVec );
......
......@@ -22,16 +22,17 @@
#include <ITABaseDefinitions.h>
#include <string>
#include <vector>
/**
* Diese Klasse realisiert half-size DFT-Spektren. Dies sind die DFT-Spektren
* rein reellwertiger Signale, wie sie in der Akustik/Audiosignalverarbeitung
* blich sind. Das DFT-Spektrum solcher Signale erfllt die Hermitische Symetrie.
* Daher mssen von n komplexwertigen diskreten Fourierkoeffizienten eines
* vollstndigen DFT-Spektrums nur n/2+1 komplexwertigen Koeffizienten
* vollstndigen DFT-Spektrums nur n/2+1 komplexwertigen Koeffizienten
* gespeichert werden.
*
* Grundstzlich werden die komplexwertigen Fourierkoeffizienten im
* Grundstzlich werden die komplexwertigen Fourierkoeffizienten im
* interleaved Speicherlayout abgelegt, d.h. Re(0), Im(0), Re(1), Im(1), ...
*
* Die Klasse stellt Methoden fr die Arbeit mit solchen Spektren bereit.
......@@ -43,46 +44,37 @@ class ITA_BASE_API ITAHDFTSpectrum
public:
//! Standard-Konstruktor
ITAHDFTSpectrum();
//! Konstruktor
/**
* Erzeugt ein Spektrum mit vorgegebener Gre und optional zu Null gesetztem Puffer
*
* \param iDFTSize DFT-Spektrum-Gre
* \param bZeroinit Setzt den Speicher bei wahr auf Null
*/
explicit ITAHDFTSpectrum(int iDFTSize, bool bZeroinit=true);
//! Constructor
/**
* Erzeugt ein Spektrum mit vorgegebener Gre und optional zu Null gesetztem Puffer
*
* \param dSampleRate Sampling rate
*
* \param fSampleRate Sampling rate
* \param iDFTSize DFT-Spektrum-Gre
* \param bZeroInit Setzt den Speicher bei wahr auf Null
*/
explicit ITAHDFTSpectrum(double dSampleRate, int iDFTSize, bool bZeroInit);
explicit ITAHDFTSpectrum( const float fSampleRate, const int iDFTSize, const bool bZeroInit );
//! Kopierkonstruktor (Zeiger)
/**
* Erzeugt einen unabhngiges Spektrum als Kopie des gegebenen Spektrums.
* Erzeugt einen unabhngiges Spektrum als Kopie des gegebenen Spektrums.
* Das neue Spektrum hat die selbe Lnge und enthlt die gleichen Werte
* wie das Quellspektrum.
*
* \param pSource Zeiger auf das Quellspektrum
*/
explicit ITAHDFTSpectrum(const ITAHDFTSpectrum* pSource);
explicit ITAHDFTSpectrum( const ITAHDFTSpectrum* pSource );
//! Kopierkonstruktor (Referenz)
/**
* Erzeugt einen unabhngiges Spektrum als Kopie des gegebenen Spektrums.
* Erzeugt einen unabhngiges Spektrum als Kopie des gegebenen Spektrums.
* Das neue Spektrum hat die selbe Lnge und enthlt die gleichen Werte
* wie das Quellspektrum.
*
* \param oSource Zeiger auf das Quellspektrum
*/
explicit ITAHDFTSpectrum(const ITAHDFTSpectrum& oSource);
explicit ITAHDFTSpectrum( const ITAHDFTSpectrum& oSource );
//! Destruktor
virtual ~ITAHDFTSpectrum();
......@@ -91,54 +83,54 @@ public:
* init(0) gibt belegten Speicher frei
* vorherige Werte werden grundstzlich verworfen!
*/
ITAHDFTSpectrum& init(int iDFTSize, bool bZeroinit=true);
void Init( const int iDFTSize, const bool bZeroinit = true );
// Gre des Spektrums (Anzahl Koeffizienten insgesamt) zurckgeben
// Hinweis: Symmetrische Koeffizienten werden hier nicht mitgezhlt.
int getSize() const;
int GetSize() const;
// Lnge des korrespondieren Zeitsignals zurckgeben (Gre der DFT)
int getDFTSize() const;
int GetDFTSize() const;
// Abtastrate des korrespondieren Zeitsignals zurckgeben
double getSamplerate() const;
float GetSampleRate() const;
// Abtastrate des korrespondieren Zeitsignals setzen
void setSamplerate(double dSamplerate);
void SetSampleRate( const float fSampleRate );
// Frequenzauflsung des Spektrums [Hz] zurckgeben
double getFrequencyResolution() const;
float GetFrequencyResolution() const;
// Datenzeiger abrufen
float* data() const;
float* GetData() const;
// DFT Koeffizient(en) setzen (Real-/Imaginrteil bzw. Betrag/Phase)
void setCoeffRI(int iIndex, float fReal, float fImag=0);
void setCoeffsRI(float fReal, float fImag=0);
void setCoeffsRI(int iOffset, int iCount, float fReal, float fImag=0);
void setCoeffRI( int iIndex, float fReal, float fImag = 0 );
void setCoeffsRI( float fReal, float fImag = 0 );
void setCoeffsRI( int iOffset, int iCount, float fReal, float fImag = 0 );
void setCoeffMP(int iIndex, float fMagnitude, float fPhase);
void setCoeffsMP(float fMagnitude, float fPhase);
void setCoeffsMP(int iOffset, int iCount, float fMagnitude, float fPhase);
void setCoeffMP( int iIndex, float fMagnitude, float fPhase );
void setCoeffsMP( float fMagnitude, float fPhase );
void setCoeffsMP( int iOffset, int iCount, float fMagnitude, float fPhase );
//! Betragswert setzen, vorhandene Phasen erhalten
void setMagnitudePreservePhase( int iIndex, float fMagnitude );
void setMagnitudesPreservePhases(float fMagnitude);
void setMagnitudesPreservePhases(int iOffset, int iCount, float fMagnitude);
void setMagnitudesPreservePhases( float fMagnitude );
void setMagnitudesPreservePhases( int iOffset, int iCount, float fMagnitude );
//! Phase setzen, vorhandene Betrge erhalten
void setPhasePreserveMagnitude(int iIndex, float fPhase);
void setPhasesPreserveMagnitudes(float fPhase);
void setPhasesPreserveMagnitudes(int iOffset, int iCount, float fPhase);
void setPhasePreserveMagnitude( int iIndex, float fPhase );
void setPhasesPreserveMagnitudes( float fPhase );
void setPhasesPreserveMagnitudes( int iOffset, int iCount, float fPhase );
// Konstante addieren
void add(float fReal, float fImag=0);
void sub(float fReal, float fImag=0);
void add( float fReal, float fImag = 0 );
void sub( float fReal, float fImag = 0 );
// Spektrum addieren
void add(const ITAHDFTSpectrum& s);
void add( const ITAHDFTSpectrum& s );
void add( const ITAHDFTSpectrum* );
void sub(const ITAHDFTSpectrum& s);
void sub( const ITAHDFTSpectrum& s );
void sub( const ITAHDFTSpectrum* );
void mul( const ITAHDFTSpectrum& s );
void mul( const float fFactor );
......@@ -154,17 +146,17 @@ public:
//! Betragsspektrum berechnen und in gegebenes Array speichern
// Zeiger drfen Null sein
void calcMagnitudes( float* pfMagnitudes ) const;
//! Calculates magnitude from real and imaginary part for a given frequency bin
float calcMagnitude( int iIndex ) const;
//! Phasenspektrum berechnen und in gegebenes Array speichern
// Zeiger drfen Null sein
void calcPhases(float* pfPhasess);
void calcPhases( float* pfPhasess );
//! Betragsgrten Koeffizienten ermitteln
float findMax() const;
float findMax(int& iMaxIndex) const;
float findMax( int& iMaxIndex ) const;
//! Negieren (Multiplikation mit -1 bzw. Phasendrehungum 180)
void negate();
......@@ -177,27 +169,27 @@ public:
//! Set unity DFT coeffs (re == 1, im == 0)
void SetZero();
//! Komplexen bzw. rellen natrlichen Logarithmus berechnen
/**
/**
* Reller log entspricht dem Betrag des komplexen log.
* Intern wird std::logf verwendet, so dass Betrag 0 den Wert -HUGE_VAL und der relle
* Logarithmus fr negative Werte den Wert NAN zurckgibt
*/
void log(bool bComplex=true);
void log( bool bComplex = true );
//! Komplexe bzw. reelle Exponentialfunktion berechnen
/**
/**
* Intern wird std::exp verwendet, so dass groe Betrge +-HUGE_VAL zurckgeben
*/
void exp(bool bComplex=true);
void exp( bool bComplex = true );
//! Alle Filterkoeffizienten eines anderen Spektrums in dieses kopieren
void copyFrom(const ITAHDFTSpectrum& s);
void copyFrom( const ITAHDFTSpectrum& s );
void copy( const ITAHDFTSpectrum* );
//! Einen Teil der Filterkoeffizienten eines anderen Spektrums in dieses kopieren
void copyFrom(const ITAHDFTSpectrum& s, int iOffset, int iCount);
void copyFrom( const ITAHDFTSpectrum& s, int iOffset, int iCount );
//! Zuweisungsoperator
/**
......@@ -205,7 +197,7 @@ public:
* Hierzu wird zunchst die Gre des Spektrums angepasst.
* Anschlieend werden alle Koeffizienten kopiert.
*/
ITAHDFTSpectrum& operator=(const ITAHDFTSpectrum& rhs);
ITAHDFTSpectrum& operator=( const ITAHDFTSpectrum& rhs );
//! Zeichenkette mit den Werten zurckgeben
std::string toString();
......@@ -219,10 +211,10 @@ public:
private:
int m_iSize;
int m_iDFTSize;
double m_dSamplerate;
int m_iDFTSize;
float m_fSampleRate;
float* m_pfData;
mutable std::vector< float > m_vfData;
};
#endif // __ITA_HDFT_SPECTRUM_H__
......@@ -7,7 +7,7 @@
#include <ITASampleFrame.h>
#include <ITAStringUtils.h>
ITAHDFTSpectra::ITAHDFTSpectra( const double dSampleRate, const int iNumChannels, const int iDFTSize, const bool bZeroInit/*=true*/ )
ITAHDFTSpectra::ITAHDFTSpectra( const float fSampleRate, const int iNumChannels, const int iDFTSize, const bool bZeroInit/*=true*/ )
{
if( iNumChannels < 1 )
ITA_EXCEPT1( INVALID_PARAMETER, "At least one DFT channel must be used" );
......@@ -15,7 +15,7 @@ ITAHDFTSpectra::ITAHDFTSpectra( const double dSampleRate, const int iNumChannels
ITA_EXCEPT1( INVALID_PARAMETER, "Invalid DFT size" );
for( int i = 0; i < iNumChannels; i++ )
m_vpSpectra.push_back( new ITAHDFTSpectrum( dSampleRate, iDFTSize, bZeroInit ) );
m_vpSpectra.push_back( new ITAHDFTSpectrum( fSampleRate, iDFTSize, bZeroInit ) );
}
ITAHDFTSpectra::ITAHDFTSpectra( const std::vector< ITAHDFTSpectrum* >& vpSpectrumVec )
......@@ -26,10 +26,10 @@ ITAHDFTSpectra::ITAHDFTSpectra( const std::vector< ITAHDFTSpectrum* >& vpSpectru
for( size_t i = 0; i < vpSpectrumVec.size(); i++ )
{
const ITAHDFTSpectrum* pSpectrum( vpSpectrumVec[ i ] );
if( pSpectrum->getDFTSize() <= 0 )
if( pSpectrum->GetDFTSize() <= 0 )
ITA_EXCEPT1( INVALID_PARAMETER, "Invalid DFT size in spectrum number " + IntToString( int( i ) ) );
if( pSpectrum->getSamplerate() <= 0 )
if( pSpectrum->GetSampleRate() <= 0 )
ITA_EXCEPT1( INVALID_PARAMETER, "Invalid sampling rate in spectrum number " + IntToString( int( i ) ) );
m_vpSpectra.push_back( new ITAHDFTSpectrum( pSpectrum ) ); // copy
......@@ -99,12 +99,12 @@ int ITAHDFTSpectra::GetNumChannels() const
int ITAHDFTSpectra::GetDFTSize() const
{
return m_vpSpectra[ 0 ]->getDFTSize();
return m_vpSpectra[ 0 ]->GetDFTSize();
}
double ITAHDFTSpectra::GetSampleRate() const
{
return m_vpSpectra[ 0 ]->getSamplerate();
return m_vpSpectra[ 0 ]->GetSampleRate();
}
void ITAHDFTSpectra::add( const ITAHDFTSpectra* pSource )
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment