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-02-21
- Branch:
- 35e9675a
- Revision:
- 9:80a5ef57af11
- Parent:
- 8:1f88fb3a4c57
File content as of revision 9:80a5ef57af11:
/** 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 * arg_carrier = new PulseTrain(), /// Initial AM Signal expression AMSignal * arg_signal = new AMSignal() ); /// Carrier Pulse Train PulseTrain * Carrier; /// AM Signal AMSignal * Signal; /// register callback called every clock (not carrier pulse edges) void attachCallback_asClock( Callback<void(bool, AMPulseTrain*)> arg_callback ); /// register callback called every carrier pulse edges void attachCallback_asPulseEdge( Callback<void(bool, AMPulseTrain*)> arg_callback ); /// register callback as AMSignalExpression void attachAMSignalExpression( Callback<uint16_t(AMPulseTrain*)> arg_callback ); void setFrequency_Carrier( uint32_t const arg_freq ) { Carrier->setFrequency(arg_freq); RecalcPulsebaseParameter(); } void setFrequency_Signal( uint32_t const arg_freq ) { Signal->setFrequency(arg_freq); RecalcPulsebaseParameter(); } 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; void RecalcPulsebaseParameter() { m_AMSIGNAL_PERIOD_PER_PULSE = Signal->getPeriod_us() / Carrier->getPeriod_us(); m_AMSIGNAL_PWIDTH_PER_PULSE = 500 / Carrier->getPeriod_us(); } }; #endif