A test for a digital envelope detector using a rectifier and a low-pass filter. The program first creates sample vectors for sinusoidal waves of 2Hz and 20Hz (considering 1kHz sampling frequency). Then, every 10ms it generates a new sample for a modulated wave (multiply both waves), and passes it through a full-wave rectifier and a Chebyshev low-pass filter with cutoff frequency of 5Hz. Then it sends the original wave and the recovered envelope through serial port in CSV format. I used 10ms interval instead of 1ms because otherwise the serial speed would have to be too high.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
quevedo
Date:
Tue Aug 26 17:02:29 2014 +0000
Commit message:
Original program;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 1ba9469c839f main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Aug 26 17:02:29 2014 +0000
@@ -0,0 +1,76 @@
+#include "mbed.h"
+#include "math.h"
+#define PI 3.1415926536
+//#define GAIN 2.661812926e+05 // For Buttherworth
+#define GAIN 3.676489487e+05 // For Chebyshev
+
+// Pin  and timer setup
+DigitalIn b0(PTA4);
+Serial pc(USBTX, USBRX);
+Ticker samp;
+
+double in, rect, out;
+double xv[4], yv[4];
+double s2[500], s20[50];
+int i, i2, i20;
+
+// ISR for periodical interrupt
+void newsample(void) {
+    in = s2[i2] * s20[i20];
+    i2++;
+    if(i2 > 499) {
+        i2 = 0;
+    }
+    i20++;
+    if(i20 > 49) i20 = 0;
+    i++;
+    
+    rect = abs(in); // Full-wave rectification
+    // The filter is low-pass IIR 3rd-order -0.5dB Chebyshev, cutoff frequency 5Hz for 1kHz samples.
+    // Design was made through the website: http://www-users.cs.york.ac.uk/~fisher/mkfilter/
+    xv[0] = xv[1];
+    xv[1] = xv[2];
+    xv[2] = xv[3]; 
+    xv[3] = rect / GAIN;
+    yv[0] = yv[1];
+    yv[1] = yv[2];
+    yv[2] = yv[3]; 
+    //yv[3] = xv[0] + xv[3] + 3 * (xv[1] + xv[2]) + (0.9390989403 * yv[0]) + (-2.8762997235 * yv[1]) + (2.9371707284 * yv[2]); // For Butterworth
+    yv[3] = xv[0] + xv[3] + 3 * (xv[1] + xv[2]) + (0.9614041736 * yv[0]) + (-2.9213338983 * yv[1]) + (2.9599079648 * yv[2]); // For Chebyshev
+    out = yv[3];
+  
+    printf("%f,%f\r\n", in, out);
+}
+
+void initfilter(void) {
+    char k;
+    for(k = 0; k < 4; k++) {
+        xv[k] = 0;
+        yv[k] = 0;
+    }
+}
+
+// Main function
+int main() {
+    initfilter();
+    pc.baud(57600);
+    
+    for(i = 0; i < 50; i++) {
+        s20[i] = sin(i*PI/25);
+    }
+    for(i = 0; i < 500; i++) {
+        s2[i] = sin(i*PI/250);;
+    }
+    i2 = 0;
+    i20 = 0;
+    i = 0;
+    while(b0); // waits for PB0 push
+    samp.attach(&newsample, 0.01); // periodical interrupt every 10ms
+    while(i < 5000) {
+        //
+    }
+    samp.detach();
+    
+    while(1) {
+    }
+}
diff -r 000000000000 -r 1ba9469c839f mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Aug 26 17:02:29 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9327015d4013
\ No newline at end of file