Signal::OperationDesc::ptr EllipseModel:: updateFilter() { if (centre.time == centrePlusRadius.time || centre.scale == centrePlusRadius.scale) return Signal::OperationDesc::ptr(); Filters::Ellipse* e; Tfr::ChunkFilterDesc::ptr filter( e = new Filters::Ellipse( 0,0,0,0, true ) ); e->_centre_t = centre.time; e->_centre_plus_radius_t = centrePlusRadius.time; e->_centre_f = freqAxis().getFrequency( centre.scale ); e->_centre_plus_radius_f = freqAxis().getFrequency( centrePlusRadius.scale ); return Signal::OperationDesc::ptr(new Tfr::TransformOperationDesc(filter)); }
void EllipseModel:: tryFilter(Signal::OperationDesc::ptr filterp) { auto filter = filterp.read (); const Filters::Ellipse* e = dynamic_cast<const Filters::Ellipse*>(filter.get()); if (!e) { centrePlusRadius.time = centre.time; centrePlusRadius.scale = centre.scale; return; } centre.time = e->_centre_t; centrePlusRadius.time = e->_centre_plus_radius_t; centre.scale = freqAxis().getFrequencyScalar( e->_centre_f ); centrePlusRadius.scale = freqAxis().getFrequencyScalar( e->_centre_plus_radius_f ); }
Signal::OperationDesc::ptr SplineModel:: updateFilter() { if (v.size() < 3) { v.clear(); return Signal::OperationDesc::ptr(); } std::vector<Support::SplineFilter::SplineVertex> ev; ev.resize( v.size() ); for (unsigned i=0; i<v.size(); ++i) { Support::SplineFilter::SplineVertex s; s.t = v[i].time; s.f = freqAxis().getFrequency( v[i].scale ); ev[i] = s; } Tfr::CwtChunkFilterDesc::ptr filter( new Support::SplineFilterDesc( true, ev ) ); return Signal::OperationDesc::ptr(new Tfr::TransformOperationDesc(filter)); }
scalarField equidistantFrequencyAxis::freqAxis(const label& N) const { scalarField dummy(0); return freqAxis(dummy, dummy, N); }
pChunk DrawnWaveform:: operator()( Signal::pMonoBuffer b ) { float blobsize = blob(b->sample_rate()); unsigned w = ((unsigned)(b->number_of_samples() / blobsize / drawWaveform_BLOCK_SIZE)) *drawWaveform_BLOCK_SIZE; if (0 == w) throw std::logic_error("DrawnWaveform::operator() Not enough data"); size_t free = availableMemoryForSingleAllocation(); free /= 2; // Don't even try to get close to use all memory // never use more than 64 MB if (free > 64<<20) free = 64<<20; unsigned wmax = free/(drawWaveform_YRESOLUTION*sizeof(Tfr::ChunkElement)*drawWaveform_BLOCK_SIZE ) * drawWaveform_BLOCK_SIZE; if (0==wmax) wmax = free/(drawWaveform_YRESOLUTION*sizeof(Tfr::ChunkElement)); if (0==wmax) wmax = 1; if (wmax < w) w = wmax; updateMaxValue(b); pChunk c(new DrawnWaveformChunk(this->block_fs)); c->transform_data.reset( new ChunkData(w, drawWaveform_YRESOLUTION, 1)); unsigned readstop = b->number_of_samples(); if (b->getInterval().last > signal_length) { if (b->getInterval().first > signal_length) readstop = 0; else readstop = signal_length - b->getInterval().first; } float writeposoffs = ((b->sample_offset() / blobsize) - floorf((b->sample_offset() / blobsize).asFloat())).asFloat(); ::drawWaveform( b->waveform_data(), c->transform_data, blobsize, readstop, maxValue, writeposoffs); this->block_fs = 0; c->chunk_offset = b->sample_offset() / blobsize + writeposoffs; c->freqAxis = freqAxis( b->sample_rate() ); c->first_valid_sample = 0; c->n_valid_samples = c->nSamples(); c->original_sample_rate = b->sample_rate(); c->sample_rate = b->sample_rate() / blobsize; return c; }