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

Dependencies:   UIT_ADDA mbed

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
+
+