![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Transform real signal to analytic signal using Hilbert transform filter for ST Nucleo F401RE.
Diff: HilbertTransform.hpp
- Revision:
- 0:3d6eb7cd2ee1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HilbertTransform.hpp Thu Oct 23 00:37:00 2014 +0000 @@ -0,0 +1,51 @@ +//-------------------------------------------------------------- +// Hilbert transform filter +// Copyright (c) 2014 MIKAMI, Naoki, 2014/06/23 +//-------------------------------------------------------------- + +#ifndef HILBERT_TRANSFORM_HPP +#define HILBERT_TRANSFORM_HPP + +#include "mbed.h" + +namespace Mikami +{ + // order must be 4K+2, K: integer + template<int order> class Hilbert + { + private: + const float *const hm_; // pointer for filter coefficients + float xn_[order+1]; // buffer for inputs + + Hilbert(const Hilbert&); + Hilbert& operator=(const Hilbert&); + public: + Hilbert(const float hk[]) : hm_(hk) + { + if ( ((order-2) % 4) != 0) + fprintf(stderr, "order must be 4*K+2, K: integer\r\n"); + Clear(); + } + + // yI: in-phase signal + // yQ: quadrature signal + void Execute(float xin, float& yI, float& yQ) + { + yQ = 0.0; + xn_[0] = xin; + + for (int k=0; k<=order/4; k++) + yQ = yQ + hm_[k]*(xn_[2*k] - xn_[order-2*k]); + yI = xn_[order/2]; // in-phase signal + + for (int k=order; k>0; k--) + xn_[k] = xn_[k-1]; // move input signals + } + + void Clear() + { for (int k=0; k<=order; k++) xn_[k] = 0.0f; } + }; +} +#endif // HILBERT_TRANSFORM_HPP + +