diff --git a/include/ITAHDFTSpectra.h b/include/ITAHDFTSpectra.h index 9a0d95135c7dcf6076f6aae46cc289dda65ce8cd..56ce494f3c67121ef3c3b1cf09e1756f8a1bf704 100644 --- a/include/ITAHDFTSpectra.h +++ b/include/ITAHDFTSpectra.h @@ -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 ); diff --git a/include/ITAHDFTSpectrum.h b/include/ITAHDFTSpectrum.h index f2e7c9ab868e3a9f6f182ce9a2c9fdd65cb76965..fd501a165363458a833bc21efecf129c81a4624f 100644 --- a/include/ITAHDFTSpectrum.h +++ b/include/ITAHDFTSpectrum.h @@ -22,16 +22,17 @@ #include #include +#include /** * 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 erfüllt die Hermitische Symetrie. * Daher müssen von n komplexwertigen diskreten Fourierkoeffizienten eines - * vollständigen DFT-Spektrums nur n/2+1 komplexwertigen Koeffizienten + * vollständigen DFT-Spektrums nur n/2+1 komplexwertigen Koeffizienten * gespeichert werden. * - * Grundsätzlich werden die komplexwertigen Fourierkoeffizienten im + * Grundsätzlich werden die komplexwertigen Fourierkoeffizienten im * interleaved Speicherlayout abgelegt, d.h. Re(0), Im(0), Re(1), Im(1), ... * * Die Klasse stellt Methoden für 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 Größe und optional zu Null gesetztem Puffer - * - * \param iDFTSize DFT-Spektrum-Größe - * \param bZeroinit Setzt den Speicher bei wahr auf Null - */ - explicit ITAHDFTSpectrum(int iDFTSize, bool bZeroinit=true); //! Constructor /** * Erzeugt ein Spektrum mit vorgegebener Größe und optional zu Null gesetztem Puffer - * - * \param dSampleRate Sampling rate + * + * \param fSampleRate Sampling rate * \param iDFTSize DFT-Spektrum-Größe * \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 unabhängiges Spektrum als Kopie des gegebenen Spektrums. + * Erzeugt einen unabhängiges Spektrum als Kopie des gegebenen Spektrums. * Das neue Spektrum hat die selbe Länge und enthält 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 unabhängiges Spektrum als Kopie des gegebenen Spektrums. + * Erzeugt einen unabhängiges Spektrum als Kopie des gegebenen Spektrums. * Das neue Spektrum hat die selbe Länge und enthält 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 grundsätzlich verworfen! */ - ITAHDFTSpectrum& init(int iDFTSize, bool bZeroinit=true); + void Init( const int iDFTSize, const bool bZeroinit = true ); // Größe des Spektrums (Anzahl Koeffizienten insgesamt) zurückgeben // Hinweis: Symmetrische Koeffizienten werden hier nicht mitgezählt. - int getSize() const; + int GetSize() const; // Länge des korrespondieren Zeitsignals zurückgeben (Größe der DFT) - int getDFTSize() const; + int GetDFTSize() const; // Abtastrate des korrespondieren Zeitsignals zurückgeben - double getSamplerate() const; + float GetSampleRate() const; // Abtastrate des korrespondieren Zeitsignals setzen - void setSamplerate(double dSamplerate); + void SetSampleRate( const float fSampleRate ); // Frequenzauflösung des Spektrums [Hz] zurückgeben - double getFrequencyResolution() const; + float GetFrequencyResolution() const; // Datenzeiger abrufen - float* data() const; + float* GetData() const; // DFT Koeffizient(en) setzen (Real-/Imaginärteil 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 Beträge 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 dürfen 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 dürfen Null sein - void calcPhases(float* pfPhasess); + void calcPhases( float* pfPhasess ); //! Betragsgrößten 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 natürlichen 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 für negative Werte den Wert NAN zurückgibt */ - void log(bool bComplex=true); - + void log( bool bComplex = true ); + //! Komplexe bzw. reelle Exponentialfunktion berechnen - /** + /** * Intern wird std::exp verwendet, so dass große Beträge +-HUGE_VAL zurückgeben */ - 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 zunächst die Größe des Spektrums angepasst. * Anschließend werden alle Koeffizienten kopiert. */ - ITAHDFTSpectrum& operator=(const ITAHDFTSpectrum& rhs); + ITAHDFTSpectrum& operator=( const ITAHDFTSpectrum& rhs ); //! Zeichenkette mit den Werten zurückgeben 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__ diff --git a/src/ITAHDFTSpectra.cpp b/src/ITAHDFTSpectra.cpp index 8422cc77ad253fb554ca5118edf86fc50550c6da..bef1115a091e2573da85febb26b8ae391aba6d54 100644 --- a/src/ITAHDFTSpectra.cpp +++ b/src/ITAHDFTSpectra.cpp @@ -7,7 +7,7 @@ #include #include -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 ) diff --git a/src/ITAHDFTSpectrum.cpp b/src/ITAHDFTSpectrum.cpp index 9b821d6b34c6a3a73147872a2faf02f5743450f5..eb1b73a90d4cf63edc1ec28ee7967437c5d927f1 100644 --- a/src/ITAHDFTSpectrum.cpp +++ b/src/ITAHDFTSpectrum.cpp @@ -13,97 +13,91 @@ ITAHDFTSpectrum::ITAHDFTSpectrum() : m_iSize( 0 ) , m_iDFTSize( 0 ) - , m_dSamplerate( 0 ) - , m_pfData( NULL ) + , m_fSampleRate( 0 ) { } -ITAHDFTSpectrum::ITAHDFTSpectrum( int iDFTSize, bool bZeroinit ) - : m_iSize( 0 ) - , m_iDFTSize( 0 ) - , m_dSamplerate( 0 ) - , m_pfData( NULL ) -{ - init( iDFTSize, bZeroinit ); -} - -ITAHDFTSpectrum::ITAHDFTSpectrum( double dSampleRate, int iDFTSize, bool bZeroInit ) +ITAHDFTSpectrum::ITAHDFTSpectrum( const float fSampleRate, const int iDFTSize, const bool bZeroInit ) : m_iSize( -1 ) , m_iDFTSize( iDFTSize ) - , m_dSamplerate( dSampleRate ) - , m_pfData( NULL ) + , m_fSampleRate( fSampleRate ) + , m_vfData( NULL ) { - setSamplerate( dSampleRate ); - init( iDFTSize, bZeroInit ); // sets size and resolution + SetSampleRate( fSampleRate ); + Init( iDFTSize, bZeroInit ); // sets size and resolution } -ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum* pSource ) +ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum* pSource ) : m_iSize( 0 ) , m_iDFTSize( 0 ) - , m_dSamplerate( 0 ) - , m_pfData( NULL ) + , m_fSampleRate( 0 ) + , m_vfData( NULL ) { - init( pSource->getDFTSize() ); - setSamplerate( pSource->getSamplerate() ); + Init( pSource->GetDFTSize() ); + SetSampleRate( pSource->GetSampleRate() ); copyFrom( *pSource ); } -ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum& oSource ) +ITAHDFTSpectrum::ITAHDFTSpectrum( const ITAHDFTSpectrum& oSource ) : m_iSize( 0 ) , m_iDFTSize( 0 ) - , m_dSamplerate( 0 ) - , m_pfData( NULL ) + , m_fSampleRate( 0 ) + , m_vfData( NULL ) { - init( oSource.getDFTSize() ); - setSamplerate( oSource.getSamplerate() ); + Init( oSource.GetDFTSize() ); + SetSampleRate( oSource.GetSampleRate() ); copyFrom( oSource ); } ITAHDFTSpectrum::~ITAHDFTSpectrum() { - fm_free( m_pfData ); } -ITAHDFTSpectrum& ITAHDFTSpectrum::init( int iDFTSize, bool bZeroinit ) +void ITAHDFTSpectrum::Init( const int iDFTSize, const bool bZeroinit ) { - // Bereits allozierten Speicher freigeben - if( m_pfData ) { - fm_free( m_pfData ); - m_pfData = NULL; - } - m_iDFTSize = iDFTSize; m_iSize = ( int ) floor( ( float ) m_iDFTSize / 2.0 ) + 1; // +2 wegen 4-Byte Ausrichtung - if( m_iSize > 0 ) m_pfData = fm_falloc( m_iSize * 2 + 2, bZeroinit ); + if( m_iSize > 0 ) + m_vfData.resize( m_iSize * 2 + 2 ); - return *this; + if( bZeroinit ) + for( size_t i = 0; i < m_vfData.size(); i++ ) + m_vfData[ i ] = 0.0f; } -int ITAHDFTSpectrum::getSize() const { +int ITAHDFTSpectrum::GetSize() const +{ return m_iSize; } -int ITAHDFTSpectrum::getDFTSize() const { +int ITAHDFTSpectrum::GetDFTSize() const +{ return m_iDFTSize; } -double ITAHDFTSpectrum::getSamplerate() const { - return m_dSamplerate; +float ITAHDFTSpectrum::GetSampleRate() const +{ + return m_fSampleRate; } -void ITAHDFTSpectrum::setSamplerate( double dSamplerate ) { - m_dSamplerate = dSamplerate; - +void ITAHDFTSpectrum::SetSampleRate( const float fSampleRate ) +{ + m_fSampleRate = fSampleRate; } -double ITAHDFTSpectrum::getFrequencyResolution() const { - return ( m_iDFTSize == 0 ? 0 : ( m_dSamplerate / ( double ) m_iDFTSize ) ); +float ITAHDFTSpectrum::GetFrequencyResolution() const +{ + if( m_iDFTSize == 0 || m_fSampleRate <= 0.0f ) + ITA_EXCEPT_INVALID_PARAMETER( "DFT size or sampling rate invalid" ); + + return ( m_iDFTSize == 0 ? 0 : ( m_fSampleRate / ( float ) m_iDFTSize ) ); } -float* ITAHDFTSpectrum::data() const { - return m_pfData; +float* ITAHDFTSpectrum::GetData() const +{ + return &m_vfData[ 0 ]; } void ITAHDFTSpectrum::SetUnity() @@ -112,8 +106,8 @@ void ITAHDFTSpectrum::SetUnity() { int iRe = 2 * i; int iIm = iRe + 1; - m_pfData[ iRe ] = 1.0f; - m_pfData[ iIm ] = 0.0f; + m_vfData[ iRe ] = 1.0f; + m_vfData[ iIm ] = 0.0f; } return; @@ -125,8 +119,8 @@ void ITAHDFTSpectrum::SetZero() { int iRe = 2 * i; int iIm = iRe + 1; - m_pfData[ iRe ] = 0.0f; - m_pfData[ iIm ] = 0.0f; + m_vfData[ iRe ] = 0.0f; + m_vfData[ iIm ] = 0.0f; } return; @@ -134,8 +128,8 @@ void ITAHDFTSpectrum::SetZero() void ITAHDFTSpectrum::add( float fReal, float fImag ) { for( int i = 0; i < 2 * m_iSize; i += 2 ) { - m_pfData[ i ] += fReal; - m_pfData[ i + 1 ] += fImag; + m_vfData[ i ] += fReal; + m_vfData[ i + 1 ] += fImag; } } @@ -152,8 +146,8 @@ void ITAHDFTSpectrum::setCoeffsRI( int iOffset, int iCount, float fReal, float f ITA_EXCEPT1( INVALID_PARAMETER, "Index/count out of bounds" ); for( int i = iOffset; i < iOffset + iCount; i++ ) { - m_pfData[ 2 * i ] = fReal; - m_pfData[ 2 * i + 1 ] = fImag; + m_vfData[ 2 * i ] = fReal; + m_vfData[ 2 * i + 1 ] = fImag; } } @@ -185,7 +179,7 @@ void ITAHDFTSpectrum::setMagnitudesPreservePhases( int iOffset, int iCount, floa ITA_EXCEPT1( INVALID_PARAMETER, "Index/count out of bounds" ); for( int i = iOffset; i < iOffset + iCount; i++ ) - csabsparg( m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ], fMagnitude, m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ] ); + csabsparg( m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ], fMagnitude, m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ] ); } void ITAHDFTSpectrum::setPhasePreserveMagnitude( int iIndex, float fPhase ) { @@ -201,67 +195,67 @@ void ITAHDFTSpectrum::setPhasesPreserveMagnitudes( int iOffset, int iCount, floa ITA_EXCEPT1( INVALID_PARAMETER, "Index/count out of bounds" ); for( int i = iOffset; i < iOffset + iCount; i++ ) - csargpabs( m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ], fPhase, m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ] ); + csargpabs( m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ], fPhase, m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ] ); } void ITAHDFTSpectrum::sub( float fReal, float fImag ) { for( int i = 0; i < 2 * m_iSize; i += 2 ) { - m_pfData[ i ] -= fReal; - m_pfData[ i + 1 ] -= fImag; + m_vfData[ i ] -= fReal; + m_vfData[ i + 1 ] -= fImag; } } void ITAHDFTSpectrum::add( const ITAHDFTSpectrum& s ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - fm_add( m_pfData, s.data(), 2 * m_iSize ); + fm_add( GetData(), s.GetData(), 2 * m_iSize ); } void ITAHDFTSpectrum::add( const ITAHDFTSpectrum* pSource ) { - if( pSource->getSize() != m_iSize ) + if( pSource->GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Source spectrum must be of same size" ); - fm_add( m_pfData, pSource->data(), 2 * m_iSize ); + fm_add( GetData(), pSource->GetData(), 2 * m_iSize ); return; } void ITAHDFTSpectrum::sub( const ITAHDFTSpectrum& s ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - fm_sub( m_pfData, s.data(), 2 * m_iSize ); + fm_sub( GetData(), s.GetData(), 2 * m_iSize ); } void ITAHDFTSpectrum::sub( const ITAHDFTSpectrum* pSource ) { - if( pSource->getSize() != m_iSize ) + if( pSource->GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Source spectrum must be of same size" ); - fm_sub( m_pfData, pSource->data(), 2 * m_iSize ); + fm_sub( GetData(), pSource->GetData(), 2 * m_iSize ); return; } void ITAHDFTSpectrum::mul( const ITAHDFTSpectrum& s ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - fm_cmul( m_pfData, s.data(), m_iSize ); + fm_cmul( GetData(), s.GetData(), m_iSize ); return; } void ITAHDFTSpectrum::mul( const ITAHDFTSpectrum* pSource ) { - if( pSource->getSize() != m_iSize ) + if( pSource->GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - const float* fS( pSource->data() ); - float* fD( m_pfData ); + const float* fS( pSource->GetData() ); + float* fD( GetData() ); float fR1, fR2, fI1, fI2; for( int i = 0; i < m_iSize; i++ ) @@ -285,11 +279,11 @@ void ITAHDFTSpectrum::mul( const ITAHDFTSpectrum* pSource ) void ITAHDFTSpectrum::mul_conj( const ITAHDFTSpectrum* pSource ) { - if( pSource->getSize() != m_iSize ) + if( pSource->GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Source spectrum must be of same size" ); - const float* fS( pSource->data() ); - float* fD( m_pfData ); + const float* fS( pSource->GetData() ); + float* fD( GetData() ); float fR1, fR2, fI1, fI2; for( int i = 0; i < m_iSize; i++ ) @@ -313,26 +307,26 @@ void ITAHDFTSpectrum::mul_conj( const ITAHDFTSpectrum* pSource ) void ITAHDFTSpectrum::mul( const float fFactor ) { - fm_mul( m_pfData, fFactor, m_iSize * 2 ); + fm_mul( GetData(), fFactor, m_iSize * 2 ); return; } void ITAHDFTSpectrum::div( const ITAHDFTSpectrum& s ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - fm_cdiv( m_pfData, s.data(), m_iSize ); + fm_cdiv( GetData(), s.GetData(), m_iSize ); return; } void ITAHDFTSpectrum::div( const ITAHDFTSpectrum* pSource ) { - if( pSource->getSize() != m_iSize ) + if( pSource->GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Source spectrum must be of same size" ); - fm_cdiv( m_pfData, pSource->data(), m_iSize ); + fm_cdiv( GetData(), pSource->GetData(), m_iSize ); return; } @@ -342,7 +336,7 @@ float ITAHDFTSpectrum::calcMagnitude( int iIndex ) const if( iIndex >= m_iDFTSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Index out of range" ); - return cabsf( m_pfData[ 2 * iIndex ], m_pfData[ 2 * iIndex + 1 ] ); + return cabsf( m_vfData[ 2 * iIndex ], m_vfData[ 2 * iIndex + 1 ] ); } void ITAHDFTSpectrum::calcMagnitudes( float* pfMagnitudes ) const @@ -355,7 +349,7 @@ void ITAHDFTSpectrum::calcMagnitudes( float* pfMagnitudes ) const void ITAHDFTSpectrum::calcPhases( float* pfPhases ) { if( pfPhases ) for( int i = 0; i < m_iSize; i++ ) - pfPhases[ i ] = canglef( m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ] ); + pfPhases[ i ] = canglef( m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ] ); } void ITAHDFTSpectrum::log( bool bComplex ) { @@ -363,13 +357,13 @@ void ITAHDFTSpectrum::log( bool bComplex ) { // TODO: Check for (magnitude < eps, -HUGE_VAL), negative value on real log if( bComplex ) { // z = x+i*y returns log(z) = log(abs(z)) + i*atan2(y,x); cp. http://www.mathworks.de/help/techdoc/ref/log.html - float x = m_pfData[ 2 * i ]; - m_pfData[ 2 * i ] = logf( cabsf( x, m_pfData[ 2 * i + 1 ] ) ); - m_pfData[ 2 * i + 1 ] = atan2f( m_pfData[ 2 * i + 1 ], x ); + float x = m_vfData[ 2 * i ]; + m_vfData[ 2 * i ] = logf( cabsf( x, m_vfData[ 2 * i + 1 ] ) ); + m_vfData[ 2 * i + 1 ] = atan2f( m_vfData[ 2 * i + 1 ], x ); } else { - m_pfData[ 2 * i ] = logf( cabsf( m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ] ) ); - m_pfData[ 2 * i + 1 ] = 0.0f; + m_vfData[ 2 * i ] = logf( cabsf( m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ] ) ); + m_vfData[ 2 * i + 1 ] = 0.0f; } } } @@ -379,25 +373,25 @@ void ITAHDFTSpectrum::exp( bool bComplex ) { // TODO: Check for (magnitude > thresh, HUGE_VAL) if( bComplex ) { // z = x+i*y returns e^z = e^x * (cos(y) + i*sin(y)); cp. http://www.mathworks.de/help/techdoc/ref/exp.html - float expMag = std::exp( m_pfData[ 2 * i ] ); - m_pfData[ 2 * i ] = expMag * cosf( m_pfData[ 2 * i + 1 ] ); - m_pfData[ 2 * i + 1 ] = expMag * sinf( m_pfData[ 2 * i + 1 ] ); + float expMag = std::exp( m_vfData[ 2 * i ] ); + m_vfData[ 2 * i ] = expMag * cosf( m_vfData[ 2 * i + 1 ] ); + m_vfData[ 2 * i + 1 ] = expMag * sinf( m_vfData[ 2 * i + 1 ] ); } else { - m_pfData[ 2 * i ] = std::exp( m_pfData[ 2 * i ] ); - m_pfData[ 2 * i + 1 ] = 0.0f; + m_vfData[ 2 * i ] = std::exp( m_vfData[ 2 * i ] ); + m_vfData[ 2 * i + 1 ] = 0.0f; } } } void ITAHDFTSpectrum::negate() { for( int i = 0; i < 2 * m_iSize; i++ ) - m_pfData[ i ] = -m_pfData[ i ]; + m_vfData[ i ] = -m_vfData[ i ]; } void ITAHDFTSpectrum::conjugate() { for( int i = 0; i < m_iSize; i++ ) - m_pfData[ 2 * i + 1 ] *= -1; + m_vfData[ 2 * i + 1 ] *= -1; } float ITAHDFTSpectrum::findMax() const { @@ -410,7 +404,7 @@ float ITAHDFTSpectrum::findMax( int& iMaxIndex ) const { float x = 0; for( int j = 0; j < m_iSize; j++ ) { - float y = cabsf( m_pfData[ 2 * j ], m_pfData[ 2 * j + 1 ] ); + float y = cabsf( m_vfData[ 2 * j ], m_vfData[ 2 * j + 1 ] ); if( y > x ) { x = y; i = j; @@ -422,19 +416,19 @@ float ITAHDFTSpectrum::findMax( int& iMaxIndex ) const { } void ITAHDFTSpectrum::copyFrom( const ITAHDFTSpectrum& s ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); - fm_copy( m_pfData, s.data(), m_iSize * 2 ); + fm_copy( GetData(), s.GetData(), m_iSize * 2 ); } void ITAHDFTSpectrum::copyFrom( const ITAHDFTSpectrum& s, int iOffset, int iCount ) { - if( s.getSize() != m_iSize ) + if( s.GetSize() != m_iSize ) ITA_EXCEPT1( INVALID_PARAMETER, "Spectra must have the same size" ); // TODO: FastMath? Jetzt gibt es Probleme mit SIMD-Alignment? for( int i = iOffset * 2; i < ( iOffset + iCount ) * 2; i++ ) - m_pfData[ i ] = s.data()[ i ]; + m_vfData[ i ] = s.GetData()[ i ]; } ITAHDFTSpectrum& ITAHDFTSpectrum::operator=( const ITAHDFTSpectrum& rhs ) { @@ -442,11 +436,11 @@ ITAHDFTSpectrum& ITAHDFTSpectrum::operator=( const ITAHDFTSpectrum& rhs ) { if( &rhs == this ) return *this; // Neu allozieren - init( rhs.getDFTSize(), false ); - setSamplerate( rhs.getSamplerate() ); + Init( rhs.GetDFTSize(), false ); + SetSampleRate( rhs.GetSampleRate() ); // Samples kopieren (+2 für 16 Byte alignment) - fm_copy( m_pfData, rhs.data(), m_iDFTSize * 2 + 2 ); + fm_copy( GetData(), rhs.GetData(), m_iDFTSize * 2 + 2 ); return *this; } @@ -455,7 +449,7 @@ std::string ITAHDFTSpectrum::toString() { std::string s = "("; for( int i = 0; i < 2 * m_iSize; i += 2 ) { if( i>0 ) s += ", "; - s += FloatToString( m_pfData[ i ], 3 ) + ( m_pfData[ i + 1 ] >= 0 ? "+" : "" ) + FloatToString( m_pfData[ i + 1 ], 3 ) + "i"; + s += FloatToString( m_vfData[ i ], 3 ) + ( m_vfData[ i + 1 ] >= 0 ? "+" : "" ) + FloatToString( m_vfData[ i + 1 ], 3 ) + "i"; } s += ")"; return s; @@ -465,7 +459,7 @@ float ITAHDFTSpectrum::getEnergy() const { float energy = 0; for( int i = 0; i < m_iSize; i++ ) { - float mags = cabsf( m_pfData[ 2 * i ], m_pfData[ 2 * i + 1 ] ); + float mags = cabsf( m_vfData[ 2 * i ], m_vfData[ 2 * i + 1 ] ); energy += mags*mags; } return energy / ( ( float ) m_iSize ); @@ -475,5 +469,5 @@ void ITAHDFTSpectrum::copy( const ITAHDFTSpectrum* pSource ) { // TODO: FastMath? Jetzt gibt es Probleme mit SIMD-Alignment? for( int i = 0; i < 2 * m_iSize; i++ ) - m_pfData[ i ] = pSource->data()[ i ]; + m_vfData[ i ] = pSource->GetData()[ i ]; }