#include "cinder/audio/audio.h" | |
//class for getting individual channel data | |
typedef std::shared_ptr<class MultiChannelSpectralNode> MultiChannelSpectralNodeRef; | |
class MultiChannelSpectralNode : public cinder::audio::MonitorNode { | |
public: | |
struct Format : public ci::audio::MonitorNode::Format { | |
Format() : ci::audio::MonitorNode::Format(), mFftSize( 0 ), mWindowType( ci::audio::dsp::WindowType::BLACKMAN ) {} | |
Format& fftSize( size_t size ) { mFftSize = size; return *this; } | |
Format& windowType( ci::audio::dsp::WindowType type ) { mWindowType = type; return *this; } | |
Format& windowSize( size_t size ) { ci::audio::MonitorNode::Format::windowSize( size ); return *this; } | |
size_t getFftSize() const { return mFftSize; } | |
ci::audio::dsp::WindowType getWindowType() const { return mWindowType; } | |
Format& channels( size_t ch ) { ci::audio::Node::Format::channels( ch ); return *this; } | |
Format& channelMode( ChannelMode mode ) { ci::audio::Node::Format::channelMode( mode ); return *this; } | |
Format& autoEnable( bool autoEnable = true ) { ci::audio::Node::Format::autoEnable( autoEnable ); return *this; } | |
protected: | |
size_t mFftSize; | |
ci::audio::dsp::WindowType mWindowType; | |
}; | |
MultiChannelSpectralNode( const Format &format = Format() ); | |
virtual ~MultiChannelSpectralNode(); | |
void prepareProcessing(); | |
const std::vector<float>& getMagSpectrum(size_t channel); | |
float getSpectralCentroid(size_t channel); | |
size_t getNumBins() const { return mFftSize / 2; } | |
size_t getFftSize() const { return mFftSize; } | |
float getFreqForBin( size_t bin ); | |
float getSmoothingFactor() const { return mSmoothingFactor; } | |
void setSmoothingFactor( float factor ); | |
protected: | |
void initialize() override; | |
private: | |
std::unique_ptr<ci::audio::dsp::Fft> mFft; | |
ci::audio::Buffer mFftBuffer; // windowed samples before transform | |
ci::audio::BufferSpectral mBufferSpectral; // transformed samples | |
std::vector<std::vector<float>> mMagSpectrum; // computed magnitude spectrum from frequency-domain samples | |
ci::audio::AlignedArrayPtr mWindowingTable; | |
size_t mFftSize; | |
ci::audio::dsp::WindowType mWindowType; | |
float mSmoothingFactor; | |
uint64_t mLastFrameMagSpectrumComputed; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment