Files

180 lines
3.8 KiB
C++

/***************************************************************************
* Copyright (C) 2011 by gempa GmbH
*
* Author: Jan Becker
* Email: jabe@gempa.de
***************************************************************************/
#ifndef GEMPA_SPECTROGRAM_SPECTROGRAM_H
#define GEMPA_SPECTROGRAM_SPECTROGRAM_H
#include <seiscomp/core/typedarray.h>
#include <seiscomp/core/record.h>
#include <seiscomp/core/version.h>
#include <seiscomp/math/filter.h>
namespace Gempa {
namespace Gui {
template <typename T> class Spectrogram;
template <typename T> class RecordSpectrogram;
typedef Spectrogram<float> SpectrogramF;
TYPEDEF_SMARTPOINTER(SpectrogramF);
TYPEDEF_CONST_SMARTPOINTER(SpectrogramF);
typedef Spectrogram<double> SpectrogramD;
TYPEDEF_SMARTPOINTER(SpectrogramD);
TYPEDEF_CONST_SMARTPOINTER(SpectrogramD);
struct SpectrogramSettings {
enum Unit {
Hz,
Seconds
};
SpectrogramSettings();
bool fromString(const std::string &def);
double bandStart; // Start of (freq or period) band
double bandEnd; // End of (freq or period) band
Unit bandUnit; // Unit of start/end (frequenz or period)
int ranges; // Number of ranges to subdivide the band
int bands; // Number of overlapping bands
bool logarithmic; // logarithmic ranges
};
template <typename T>
class Spectrogram : public Seiscomp::Core::BaseObject {
public:
typedef Seiscomp::TypedArray<T> DataArray;
#if SC_API_VERSION < SC_API_VERSION_CHECK(17,0,0)
typedef typename Seiscomp::Core::SmartPointer<DataArray>::Impl DataArrayPtr;
#else
typedef Seiscomp::Core::SmartPointer<DataArray> DataArrayPtr;
#endif
public:
Spectrogram();
Spectrogram(const SpectrogramSettings &settings);
~Spectrogram();
public:
void init(const SpectrogramSettings &settings);
void initFrom(const Spectrogram<T> &other);
void setMaximumSeconds(double secs);
void setSamplingFrequency(double fsamp);
double samplingFrequency() const;
void pushData(int n, const T *data);
void reset();
virtual void trimData(int start, int end, int *cutOffset = NULL);
const T *data() const;
int columns() const;
int rows() const;
double minimum() const;
double maximum() const;
bool isNull() const;
protected:
virtual void resetted();
private:
void resetData();
void clearData();
void initFilters();
void addFilter(double loFreq, double hiFreq, double maxPeriod);
protected:
typedef SpectrogramSettings Settings;
typedef Seiscomp::Math::Filtering::InPlaceFilter<T> Filter;
std::vector<Filter*> _filters;
T *_data;
int _maxColumns;
int _columns;
int _startColumn;
int _endColumn;
int _rows;
double _fsamp;
double _maxSeconds;
double _min, _max;
Settings _settings;
};
typedef RecordSpectrogram<float> RecordSpectrogramF;
TYPEDEF_SMARTPOINTER(RecordSpectrogramF);
TYPEDEF_CONST_SMARTPOINTER(RecordSpectrogramF);
typedef RecordSpectrogram<double> RecordSpectrogramD;
TYPEDEF_SMARTPOINTER(RecordSpectrogramD);
TYPEDEF_CONST_SMARTPOINTER(RecordSpectrogramD);
template <typename T>
class RecordSpectrogram : public Spectrogram<T> {
public:
typedef Spectrogram<T> Base;
RecordSpectrogram();
RecordSpectrogram(const SpectrogramSettings &settings);
public:
const Seiscomp::Core::Time &startTime() const;
const Seiscomp::Core::Time &endTime() const;
int mapTime(const Seiscomp::Core::Time &t) const;
void feed(const Seiscomp::Record *rec);
virtual void trimData(int start, int end, int *cutOffset = NULL);
void trim(const Seiscomp::Core::Time &start, const Seiscomp::Core::Time &end);
protected:
virtual void resetted();
private:
bool _initialized;
Seiscomp::Core::Time _startTime;
Seiscomp::Core::Time _endTime;
};
#include <gempa/gui/spectrogram/spectrogram.ipp>
}
}
#endif