const PolyphaseFilter *MakePolyphaseFilter( int iUpFactor, float fCutoffFrequency )
	{
		PolyphaseFiltersLock.Lock();
		pair<int,float> params( make_pair(iUpFactor, fCutoffFrequency) );
		FilterMap::const_iterator it = g_mapPolyphaseFilters.find(params);
		if( it != g_mapPolyphaseFilters.end() )
		{
			/* We already have a filter for this upsampling factor and cutoff; use it. */
			PolyphaseFilter *pPolyphase = it->second;
			PolyphaseFiltersLock.Unlock();
			return pPolyphase;
		}
		int iWinSize = L*iUpFactor;
		float *pFIR = new float[iWinSize];
		GenerateSincLowPassFilter( pFIR, iWinSize, fCutoffFrequency );
		ApplyKaiserWindow( pFIR, iWinSize, 8 );
		NormalizeVector( pFIR, iWinSize );
		MultiplyVector( &pFIR[0], &pFIR[iWinSize], (float) iUpFactor );

		PolyphaseFilter *pPolyphase = new PolyphaseFilter( iUpFactor );
		pPolyphase->Generate( pFIR );
		delete [] pFIR;

		g_mapPolyphaseFilters[params] = pPolyphase;
		PolyphaseFiltersLock.Unlock();
		return pPolyphase;
	}
Пример #2
0
 // Just checks whether style can be created without constructing actual style.
 void check(const std::vector<Tag>& tags, const FilterMap& filters)
 {
     FilterMap::const_iterator iter = filters.find(levelOfDetails_);
     if (iter != filters.end()) {
         for (const Filter& filter : iter->second) {
             bool isMatched = true;
             for (auto it = filter.conditions.cbegin(); it != filter.conditions.cend() && isMatched; ++it) {
                 isMatched &= match_tags(tags.cbegin(), tags.cend(), *it);
             }
             if (isMatched) {
                 canBuild_ = true;
                 return;
             }
         }
     }
 }
Пример #3
0
 // Builds style object. More expensive to call than check.
 void build(const std::vector<Tag>& tags, const FilterMap& filters)
 {
     FilterMap::const_iterator iter = filters.find(levelOfDetails_);
     if (iter != filters.end()) {
         for (const Filter &filter : iter->second) {
             bool isMatched = true;
             for (auto it = filter.conditions.cbegin(); it != filter.conditions.cend() && isMatched; ++it) {
                 isMatched &= match_tags(tags.cbegin(), tags.cend(), *it);
             }
             // merge declarations to style
             if (isMatched) {
                 canBuild_ = true;
                 for (const auto &d : filter.declarations) {
                     style_.put(d.second);
                 }
             }
         }
     }
 }