180 lines
3.8 KiB
C++
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
|