ITAHDFTSpectrum.h 7.03 KB
Newer Older
Jonas Stienen's avatar
Jonas Stienen committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* ----------------------------------------------------------------
*
*		ITA core libs
*		(c) Copyright Institute of Technical Acoustics (ITA)
*		RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
*				    ____  __________  _______
*				   //  / //__   ___/ //  _   |
*				  //  /    //  /    //  /_|  |
*				 //  /    //  /    //  ___   |
*				//__/    //__/    //__/   |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITAHDFTSpectrum.h 3913 2015-01-06 12:42:15Z stienen $

#ifndef __ITA_HDFT_SPECTRUM_H__
#define __ITA_HDFT_SPECTRUM_H__

#include <ITABaseDefinitions.h>

#include <string>

/**
 * 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 
 * gespeichert werden.
 *
 * 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.
 *
 */

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 iDFTSize DFT-Spektrum-Gre
	  * \param bZeroInit Setzt den Speicher bei wahr auf Null
	  */
	explicit ITAHDFTSpectrum(double dSampleRate, int iDFTSize, bool bZeroInit);	

	//! Kopierkonstruktor (Zeiger)
	/**
	 * 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);

	//! Kopierkonstruktor (Referenz)
	/**
	 * 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);
	
	//! Destruktor
	virtual ~ITAHDFTSpectrum();

	// Initialisieren
	/**
	 * init(0) gibt belegten Speicher frei
	 * vorherige Werte werden grundstzlich verworfen!
	 */
	ITAHDFTSpectrum& init(int iDFTSize, bool bZeroinit=true);

	// Gre des Spektrums (Anzahl Koeffizienten insgesamt) zurckgeben
	// Hinweis: Symmetrische Koeffizienten werden hier nicht mitgezhlt.
	int getSize() const;

	// Lnge des korrespondieren Zeitsignals zurckgeben (Gre der DFT)
	int getDFTSize() const;

	// Abtastrate des korrespondieren Zeitsignals zurckgeben
	double getSamplerate() const;

	// Abtastrate des korrespondieren Zeitsignals setzen
	void setSamplerate(double dSamplerate);

	// Frequenzauflsung des Spektrums [Hz] zurckgeben
	double getFrequencyResolution() const;

	// Datenzeiger abrufen
	float* data() 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 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
126
	void setMagnitudePreservePhase( int iIndex, float fMagnitude );
Jonas Stienen's avatar
Jonas Stienen committed
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
	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);

	// Konstante addieren
	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* );
	void sub(const ITAHDFTSpectrum& s);
	void sub( const ITAHDFTSpectrum* );
	void mul( const ITAHDFTSpectrum& s );
	void mul( const float fFactor );
	void mul( const ITAHDFTSpectrum* );

	//! Multiplies the conjugate of the given spectrum without data copy
	void mul_conj( const ITAHDFTSpectrum* );

	//! Devide spectrum
	void div( const ITAHDFTSpectrum& s );
	void div( const ITAHDFTSpectrum* );

	//! Betragsspektrum berechnen und in gegebenes Array speichern
	// Zeiger drfen Null sein
157
158
159
160
	void calcMagnitudes( float* pfMagnitudes ) const;
	
	//! Calculates magnitude from real and imaginary part for a given frequency bin
	float calcMagnitude( int iIndex ) const;
Jonas Stienen's avatar
Jonas Stienen committed
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

	//! Phasenspektrum berechnen und in gegebenes Array speichern
	// Zeiger drfen Null sein
	void calcPhases(float* pfPhasess);

	//! Betragsgrten Koeffizienten ermitteln
	float findMax() const;
	float findMax(int& iMaxIndex) const;

	//! Negieren (Multiplikation mit -1 bzw. Phasendrehungum 180)
	void negate();

	//! Konjugiert das Spectrum
	void conjugate();

	//! Set unity DFT coeffs (re == 1, im == 0)
	void SetUnity();

	//! 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);
	
	//! Komplexe bzw. reelle Exponentialfunktion berechnen
	/** 
	  * Intern wird std::exp verwendet, so dass groe Betrge +-HUGE_VAL zurckgeben
	  */
	void exp(bool bComplex=true);

	//! Alle Filterkoeffizienten eines anderen Spektrums in dieses kopieren
	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);

	//! Zuweisungsoperator
	/**
	 * Dieser Operator weist dem Spektrum eines anderen Spektrums zu.
	 * Hierzu wird zunchst die Gre des Spektrums angepasst.
	 * Anschlieend werden alle Koeffizienten kopiert.
	 */
	ITAHDFTSpectrum& operator=(const ITAHDFTSpectrum& rhs);

	//! Zeichenkette mit den Werten zurckgeben
	std::string toString();
Michael Kohnen's avatar
Michael Kohnen committed
213
214
215
216
217
218
219
220

	//! Calculates the energy of the spectrum
	/**
	* Returns the energy of a HDFTSpectrum as a float
	*/
	float getEnergy() const;


Jonas Stienen's avatar
Jonas Stienen committed
221
222
223
224
225
226
227
228
229
private:
	int m_iSize;
	int m_iDFTSize;			
	double m_dSamplerate;

	float* m_pfData;
};

#endif // __ITA_HDFT_SPECTRUM_H__