This makes Amplitude Modulated Pulse Train, which can be regarded as the discretized wave of the signal. Pulse Train can be defined by frequency and duty cycle, which can be temporarily changed, referring to PWM.

Dependents:   Interference_Simple

AMPulseTrain.h

Committer:
aktk
Date:
2020-01-06
Branch:
35e9675a
Revision:
5:77ac0df7c3a1
Parent:
1:19c3a52c80c3
Child:
8:1f88fb3a4c57

File content as of revision 5:77ac0df7c3a1:

/** Defining Amplide Modulated Pulse Train Model
 *
 *  \file   AMPulseTrain.h
 *  \author Akifumi Takahashi
 *  \date   2019/12/02 -
 *  \version 1.0.2019.Dec
 */

#ifndef AM_PULSE_TRAIN_H
#define AM_PULSE_TRAIN_H


#include "mbed.h"
#include "AMSignal.h"
#include "PulseTrain.h"

/** \Class Amplide Modulated Pulse Train Model
 *
 *  Pulse Train Model which clock is defined in scale of us;
 *  the model pulses' height can be modulated as a product with m_ampl and any function
 *  returning a int as the coefficeincy.
 *  You can define the carrier pulse train's freq and duty cycle like PWM.
 *
 */
class AMPulseTrain
{
public:
    /** Constractor
     */
    AMPulseTrain(
        /// Carrier Pulse Train
        PulseTrain  * const arg_carrier = new PulseTrain(),
        /// Initial AM Signal expression
        AMSignal  * const arg_signal = new AMSignal()
    );

    /// Carrier Pulse Train
    PulseTrain  * const Carrier;

    /// AM Signal
    AMSignal  * const Signal;


    void attachCallback_asClock(
        Callback<void(bool,  AMPulseTrain*)> arg_callback
    );

    void attachCallback_asPulseEdge(
        Callback<void(bool,  AMPulseTrain*)> arg_callback
    );

    void attachAMSignalExpression(
        Callback<uint16_t(AMPulseTrain*)> arg_callback
    );

    void setFrequency_Carrier( uint32_t const arg_freq )
    {
        Carrier->setFrequency(arg_freq);
        m_AMSIGNAL_PERIOD_PER_PULSE = Signal->getPeriod_us() / Carrier->getPeriod_us();
        m_AMSIGNAL_PWIDTH_PER_PULSE = 500 / Carrier->getPeriod_us();
    }
    
    uint32_t getFrequency_Carrier(){return Carrier->getFrequency();}
    
    uint16_t getClockperiod_us();
    
    void incrementClock();
    
    uint16_t getPeriod_pPulse_Signal(){return m_AMSIGNAL_PERIOD_PER_PULSE;}
    
    uint16_t getPWidth_pPulse_Signal(){return m_AMSIGNAL_PWIDTH_PER_PULSE;}
    
private:

    Callback<void(bool,  AMPulseTrain*)> m_callback_asClock;
    void CallbackWrapper_asClock(bool arg_pulsestate);

    Callback<void(bool,  AMPulseTrain*)> m_callback_asPulseEdge;
    void CallbackWrapper_asPulseEdge(bool arg_pulsestate);

    Callback<uint16_t(AMPulseTrain*)>  m_AMSignalExpression;
    uint16_t CallbackWrapper_AMSignalExpression(AMSignal* arg_signal);

    uint16_t m_AMSIGNAL_PERIOD_PER_PULSE;
    uint16_t m_AMSIGNAL_PWIDTH_PER_PULSE;
};

#endif