Akifumi Takahashi / AMPulseTrain

Dependents:   Interference_Simple

Files at this revision

API Documentation at this revision

Comitter:
aktk
Date:
Wed Nov 27 23:03:42 2019 +0000
Child:
1:19c3a52c80c3
Child:
2:b01e84ce3ae0
Commit message:
nyaan

Changed in this revision

DSinGenerator.cpp Show annotated file Show diff for this revision Revisions of this file
DSinGenerator.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DSinGenerator.cpp	Wed Nov 27 23:03:42 2019 +0000
@@ -0,0 +1,79 @@
+#include "DSinGenerator.h"
+
+DSinGenerator::DSinGenerator(
+    uint16_t const arg_resolution_ofsin
+):
+    ampl_max(10),
+    freq_max(5000),
+    resolution_ofsin(arg_resolution_ofsin)
+{
+    init();
+    setParam(0, 4000);
+}
+
+DSinGenerator::DSinGenerator(
+    float const arg_ampl,
+    uint16_t const arg_freq,
+    uint16_t const arg_resolution_ofsin
+): 
+    ampl_max(10),
+    freq_max(5000),
+    resolution_ofsin(arg_resolution_ofsin)
+{
+    init();
+    setParam(arg_ampl, arg_freq);
+}
+
+void DSinGenerator::setParam(
+    float const arg_ampl,
+    uint16_t const arg_freq
+)
+{
+    setAmplitude(arg_ampl);
+    setFrequency(arg_freq);
+}
+
+void DSinGenerator::setAmplitude(
+    float const arg_ampl
+)
+{
+    ampl = arg_ampl;
+    for(int i = 0; i < resolution_ofsin; i++){
+        discretized_sin_p16m16[i] = static_cast<int32_t>(4095.0 / ampl_max * ampl * discretized_sin[i] );
+    }
+}
+
+void DSinGenerator::setFrequency(
+    uint16_t const arg_freq
+)
+{
+    freq = arg_freq;
+    pwth = 1000000 / freq / resolution_ofsin;
+}
+
+void DSinGenerator::init()
+{
+    discretized_sin = new float[resolution_ofsin];
+    discretized_sin_p16m16 = new int32_t[resolution_ofsin];
+    
+    for(int i = 0; i < resolution_ofsin; i++){
+        discretized_sin[i] = sin( 2.0 * M_PI * static_cast<float>(i) / static_cast<float>(resolution_ofsin));
+    }
+}
+
+float DSinGenerator::getValue()
+{
+    static int itr = 0;
+    return ampl * discretized_sin[itr++ % resolution_ofsin];
+}
+
+int32_t DSinGenerator::getValue_p16m16()
+{
+    static int itr = 0;
+    return discretized_sin_p16m16[itr++ % resolution_ofsin];
+}
+
+void DSinGenerator::getValueofSamplePoints(float arg_dsin[])
+{
+    memcpy(arg_dsin, discretized_sin, sizeof(float) * resolution_ofsin);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DSinGenerator.h	Wed Nov 27 23:03:42 2019 +0000
@@ -0,0 +1,96 @@
+/** Defining Discretized Sinusoidal Wave Generator 
+ *
+ *  \file   DSinGenerator.h
+ *  \author Akifumi Takahashi
+ *  \date   2019/Nov/28 ver.1 publish
+ *  \version 1.0.2019.Nov
+ */
+ 
+#ifndef DISCRETIZED_SINUSOIDAL_WAVE_GENERATOR_H
+#define DISCRETIZED_SINUSOIDAL_WAVE_GENERATOR_H
+#define _USE_MATH_DEFINES
+#include <cmath>
+
+#ifndef M_PI
+#define M_PI 3.141592
+#endif
+
+#include "mbed.h"
+/** \Class DISCRETIZED SINUSOIDAL WAVE GENERATOR
+ *
+ *  Generate a discretized sinusoidal wave whose value type is float, 
+ *  and the range is from (-1.0f * ampl) to (1.0f * ampl).
+ *
+ */
+class DSinGenerator
+{
+private:
+    /// Amplitude of sinusoidal wave (mA)
+    float ampl;
+    
+    /// Frequency of the wave (Hz)
+    uint16_t freq;
+    
+    /// Pulse width fineness of dicretization (us) 
+    /// pwth = 1000000 / freq / resolution_ofsin;
+    uint16_t pwth;
+    
+    float*      discretized_sin;
+    int32_t*    discretized_sin_p16m16;
+    
+    void init();
+
+public:
+    float const ampl_max;
+    uint16_t const freq_max;
+    uint16_t const resolution_ofsin; // = arg_resolution_ofsin below
+    
+    DSinGenerator(
+        uint16_t const arg_resolution_ofsin = 20
+    );
+    DSinGenerator(
+        float const arg_ampl,
+        uint16_t const arg_freq,
+        uint16_t const arg_resolution_ofsin = 20
+    );
+    
+    void setParam(
+        float const arg_ampl,
+        uint16_t const arg_freq
+    );
+    
+    void setAmplitude(
+        float const arg_ampl
+    );
+    
+    void setFrequency(
+        uint16_t const arg_freq
+    );
+    
+    float getValue();
+    int32_t getValue_p16m16();
+    
+    void getValueofSamplePoints(float[]);
+    
+    float    getAmplitude();    //inline
+    uint16_t getFrequency();    //inline
+    uint16_t getPulseWidth(); //inline
+    
+};
+
+
+inline float DSinGenerator::getAmplitude()
+{
+    return ampl;
+}
+
+inline uint16_t DSinGenerator::getFrequency()
+{
+    return freq;
+}
+
+inline uint16_t DSinGenerator::getPulseWidth()
+{
+    return pwth;
+}
+#endif
\ No newline at end of file