Transform real signal to analytic signal using Hilbert transform filter for ST Nucleo F401RE.

Dependencies:   UIT_ADDA mbed

Committer:
MikamiUitOpen
Date:
Thu Oct 23 00:37:00 2014 +0000
Revision:
0:3d6eb7cd2ee1
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:3d6eb7cd2ee1 1 //--------------------------------------------------------------
MikamiUitOpen 0:3d6eb7cd2ee1 2 // Hilbert transform filter
MikamiUitOpen 0:3d6eb7cd2ee1 3 // Copyright (c) 2014 MIKAMI, Naoki, 2014/06/23
MikamiUitOpen 0:3d6eb7cd2ee1 4 //--------------------------------------------------------------
MikamiUitOpen 0:3d6eb7cd2ee1 5
MikamiUitOpen 0:3d6eb7cd2ee1 6 #ifndef HILBERT_TRANSFORM_HPP
MikamiUitOpen 0:3d6eb7cd2ee1 7 #define HILBERT_TRANSFORM_HPP
MikamiUitOpen 0:3d6eb7cd2ee1 8
MikamiUitOpen 0:3d6eb7cd2ee1 9 #include "mbed.h"
MikamiUitOpen 0:3d6eb7cd2ee1 10
MikamiUitOpen 0:3d6eb7cd2ee1 11 namespace Mikami
MikamiUitOpen 0:3d6eb7cd2ee1 12 {
MikamiUitOpen 0:3d6eb7cd2ee1 13 // order must be 4K+2, K: integer
MikamiUitOpen 0:3d6eb7cd2ee1 14 template<int order> class Hilbert
MikamiUitOpen 0:3d6eb7cd2ee1 15 {
MikamiUitOpen 0:3d6eb7cd2ee1 16 private:
MikamiUitOpen 0:3d6eb7cd2ee1 17 const float *const hm_; // pointer for filter coefficients
MikamiUitOpen 0:3d6eb7cd2ee1 18 float xn_[order+1]; // buffer for inputs
MikamiUitOpen 0:3d6eb7cd2ee1 19
MikamiUitOpen 0:3d6eb7cd2ee1 20 Hilbert(const Hilbert&);
MikamiUitOpen 0:3d6eb7cd2ee1 21 Hilbert& operator=(const Hilbert&);
MikamiUitOpen 0:3d6eb7cd2ee1 22 public:
MikamiUitOpen 0:3d6eb7cd2ee1 23 Hilbert(const float hk[]) : hm_(hk)
MikamiUitOpen 0:3d6eb7cd2ee1 24 {
MikamiUitOpen 0:3d6eb7cd2ee1 25 if ( ((order-2) % 4) != 0)
MikamiUitOpen 0:3d6eb7cd2ee1 26 fprintf(stderr, "order must be 4*K+2, K: integer\r\n");
MikamiUitOpen 0:3d6eb7cd2ee1 27 Clear();
MikamiUitOpen 0:3d6eb7cd2ee1 28 }
MikamiUitOpen 0:3d6eb7cd2ee1 29
MikamiUitOpen 0:3d6eb7cd2ee1 30 // yI: in-phase signal
MikamiUitOpen 0:3d6eb7cd2ee1 31 // yQ: quadrature signal
MikamiUitOpen 0:3d6eb7cd2ee1 32 void Execute(float xin, float& yI, float& yQ)
MikamiUitOpen 0:3d6eb7cd2ee1 33 {
MikamiUitOpen 0:3d6eb7cd2ee1 34 yQ = 0.0;
MikamiUitOpen 0:3d6eb7cd2ee1 35 xn_[0] = xin;
MikamiUitOpen 0:3d6eb7cd2ee1 36
MikamiUitOpen 0:3d6eb7cd2ee1 37 for (int k=0; k<=order/4; k++)
MikamiUitOpen 0:3d6eb7cd2ee1 38 yQ = yQ + hm_[k]*(xn_[2*k] - xn_[order-2*k]);
MikamiUitOpen 0:3d6eb7cd2ee1 39 yI = xn_[order/2]; // in-phase signal
MikamiUitOpen 0:3d6eb7cd2ee1 40
MikamiUitOpen 0:3d6eb7cd2ee1 41 for (int k=order; k>0; k--)
MikamiUitOpen 0:3d6eb7cd2ee1 42 xn_[k] = xn_[k-1]; // move input signals
MikamiUitOpen 0:3d6eb7cd2ee1 43 }
MikamiUitOpen 0:3d6eb7cd2ee1 44
MikamiUitOpen 0:3d6eb7cd2ee1 45 void Clear()
MikamiUitOpen 0:3d6eb7cd2ee1 46 { for (int k=0; k<=order; k++) xn_[k] = 0.0f; }
MikamiUitOpen 0:3d6eb7cd2ee1 47 };
MikamiUitOpen 0:3d6eb7cd2ee1 48 }
MikamiUitOpen 0:3d6eb7cd2ee1 49 #endif // HILBERT_TRANSFORM_HPP
MikamiUitOpen 0:3d6eb7cd2ee1 50
MikamiUitOpen 0:3d6eb7cd2ee1 51