Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746
Fork of skeleton_unzen_nucleo_f746 by
Revision 20:699e209fd19a, committed 2017-02-03
- Comitter:
- shorie
- Date:
- Fri Feb 03 14:41:40 2017 +0000
- Parent:
- 19:f5e785fe50b1
- Commit message:
- Rewind the faulty commit.
Changed in this revision
--- a/dcblocker.cpp Fri Feb 03 14:35:46 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#include "signal_processing.h"
-
-/*
-* Related Link
-* https://www.dsprelated.com/freebooks/filters/DC_Blocker.html
-* https://ccrma.stanford.edu/~jos/fp/DC_Blocker.html
-*/
-
-DCBlocker::DCBlocker( uint32_t blockSize ) : amakusa::AbstractFilter ( blockSize )
-{
- this->x_last = 0;
- this->y_last = 0;
-}
-
-void DCBlocker::run( float32_t *pSrc, float32_t *pDst, uint32_t blockSize )
-{
- // if the parameter is non-zero, take it. If the parameter is zero, use default.
- if ( blockSize == 0 )
- blockSize = this->blockSize;
-
- for ( int i = 0; i < blockSize; i++ )
- {
- // y = x - x * z^-1 + 0.995 * y * z^-1
- pDst[ i ] = pSrc[ i ] - this->x_last + 0.995f * this->y_last;
- this->x_last = pSrc[ i ];
- this->y_last = pDst[ i ];
- }
-
-}
--- a/main.cpp Fri Feb 03 14:35:46 2017 +0000
+++ b/main.cpp Fri Feb 03 14:41:40 2017 +0000
@@ -42,47 +42,33 @@
int main()
{
uint32_t pushing, releasing, holding;
-
- // VFO form
- wave_form form = triangle;
// start audio. Do not touch
initialize_system();
-
- process->set_vfo_frequency( 440 );
- process->set_vfo_wave_form( form );
- ukifune::turn_led_off( ukifune::led1_1 );
- ukifune::turn_led_on( ukifune::led1_2 );
// main loop. Signal processing is done in background.
while(1)
{ // place your foreground program here.
// get volume from UI panel, then apply it to signal processing.
- process->set_volume( ukifune::get_volume(0) );
- process->set_vfo_duty_cycle( ukifune::get_volume(1) );
+ process->set_volume( ukifune::get_volume(0) );
// sample usage of button switch detection
ukifune::get_button_state( pushing, releasing, holding);
// pushing detection demo
if ( pushing & (1 << ukifune::swm1 ) ) // is SWM1 switch pusshing down?
- if ( form == triangle )
- {
- form = square;
- process->set_vfo_wave_form( form );
- ukifune::turn_led_on( ukifune::led1_1 );
- ukifune::turn_led_off( ukifune::led1_2 );
- }
- else
- {
- form = triangle;
- process->set_vfo_wave_form( form );
- ukifune::turn_led_off( ukifune::led1_1 );
- ukifune::turn_led_on( ukifune::led1_2 );
- }
-
+ ukifune::toggle_led( ukifune::led1_1 ); // then, toggle LED1_1
+ // releasing detection demo
+ if ( releasing & (1 << ukifune::swm2 ) ) // is SWM2 switch releasing?
+ ukifune::toggle_led( ukifune::led2_1 ); // then toggle LED2_1
+
+ // holding detection demo
+ if ( holding & (1 << ukifune::swm3 ) ) // is SWM3 switch holding?
+ ukifune::turn_led_on( ukifune::led3_1 ); // then turn LED3_1 on
+ else
+ ukifune::turn_led_off( ukifune::led3_1 ); // else off
// you have to call tick() every 20mS-50mS if you need get_volume()
--- a/monophonic.cpp Fri Feb 03 14:35:46 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-#include "signal_processing.h"
-
-
- // constructor.
-Monophonic::Monophonic( unsigned int block_size )
-{
- // initializing the subm-odules.
- this->vfo = new VFO(); // allocate VFO
-} // End of constructor()
-
-Monophonic::~Monophonic( void )
-{
- // initializing the subm-odules.
- delete this->vfo;
-} // End of constructor()
-
-
-
- // Run all signal processing.
-void Monophonic::run(
- float out_buffer[], // place to write the right output samples
- unsigned int block_size // block size [sample]
- )
-{
- // place the signal processing coce here
-
- // VFO
- this->vfo->run( out_buffer, block_size);
-
-} // End of run()
-
-
- // Sampling Frequency
-void Monophonic::set_Fs( int Fs )
-{
- this->vfo->set_Fs( Fs );
-}
-
- // Oscillation Frequency
-void Monophonic::set_vfo_frequency( int freq )
-{
- this->vfo->set_frequency( freq );
-}
-
- // Duty Cycle of VFO
-void Monophonic::set_vfo_duty_cycle( float duty )
-{
- this->vfo->set_duty_cycle( duty );
-}
-
- // VFO wave form
-void Monophonic::set_vfo_wave_form( wave_form form )
-{
- this->vfo->set_wave_form( form );
-}
--- a/signal_processing.cpp Fri Feb 03 14:35:46 2017 +0000
+++ b/signal_processing.cpp Fri Feb 03 14:41:40 2017 +0000
@@ -6,10 +6,6 @@
{
// place the signal processing initializing code here.
this->volume_level = 0.0; // sample initializaiton
- this->note = new Monophonic(block_size); // allocate VFO
- note->set_Fs( SAMPLING_FREQUENCY );
- note->set_vfo_frequency( 440 );
- note->set_vfo_wave_form( triangle );
} // End of constructor()
@@ -23,52 +19,15 @@
)
{
// place the signal processing coce here
-
- // VFO
- this->note->run( tx_left_buffer, block_size);
-
- // apply gain and copy to right ch.
for ( int i= 0; i< block_size; i++ )
{
- tx_right_buffer[i] = tx_left_buffer[i] *= this->volume_level;
+ tx_left_buffer[i] = rx_left_buffer[i] * this->volume_level;
+ tx_right_buffer[i] = rx_right_buffer[i] * this->volume_level;
}
} // End of run()
-
- // Sampling Frequency
-void SignalProcessing::set_Fs( int Fs )
-{
- this->enter_critical_section(); // forbidden interrrupt.
- this->note->set_Fs( Fs );
- this->leave_critical_section(); // now, ok to accept interrupt.
-}
-
- // Oscillation Frequency
-void SignalProcessing::set_vfo_frequency( int freq )
-{
- this->enter_critical_section(); // forbidden interrrupt.
- this->note->set_vfo_frequency( freq );
- this->leave_critical_section(); // now, ok to accept interrupt.
-}
-
- // Duty Cycle of VFO
-void SignalProcessing::set_vfo_duty_cycle( float duty )
-{
- this->enter_critical_section(); // forbidden interrrupt.
- this->note->set_vfo_duty_cycle( duty );
- this->leave_critical_section(); // now, ok to accept interrupt.
-}
-
- // VFO wave form
-void SignalProcessing::set_vfo_wave_form( wave_form form )
-{
- this->enter_critical_section(); // forbidden interrrupt.
- this->note->set_vfo_wave_form( form );
- this->leave_critical_section(); // now, ok to accept interrupt.
-}
-
- // Set the volume level to the object.
+ // Sample method. Set the volume level to the object.
void SignalProcessing::set_volume( float vol )
{
this->enter_critical_section(); // forbidden interrrupt.
--- a/signal_processing.h Fri Feb 03 14:35:46 2017 +0000
+++ b/signal_processing.h Fri Feb 03 14:41:40 2017 +0000
@@ -3,70 +3,6 @@
#include "amakusa.h"
-#define SAMPLING_FREQUENCY 48000
-
-enum wave_form { triangle, square };
-
- // Variable Frequency Oscillator. Only square and triangle
-class VFO {
-public:
- VFO( void );
- virtual ~VFO(void);
- void run(
- float out_buffer[], // place to write the right output samples
- unsigned int block_size // block size [sample]
- );
-
- // parameter settings
- void set_frequency( int freq ); // unit is Hz.
- void set_Fs( int Fs ); // unit is Hz.
- void set_duty_cycle( float duty ); // 0 ... 0.5
- void set_wave_form( wave_form form );
-private:
-
- // control variables.
- int frequency; // VFO frequency [Hz]
- int Fs; // sampling Frequency [Hz]
- float duty_cycle; // VFO duty cycle. 0 ... 0.5
- wave_form form; // form of the wave form.
-
- // internal variable.
- int current_phase; // internal variable of VFO.
- int half_way; // change point by duty cycle. ( period * duty_cycle ).
- float rising_rate;
- float falling_rate;
-
- void update_parameters(void); // call one of the parameter is changed.
-};
-
- // Blocking DC
-class DCBlocker : public amakusa::AbstractFilter {
-public:
- DCBlocker( uint32_t blockSize );
- virtual void run( float32_t *pSrc, float32_t *pDst, uint32_t blockSize = 0 );
-private:
- float x_last;
- float y_last;
-};
-
- // Monophonic synthsizer class
-class Monophonic {
-public:
- Monophonic( unsigned int block_size );
- virtual ~Monophonic(void);
- void run(
- float out_buffer[], // place to write the right output samples
- unsigned int block_size // block size [sample]
- );
- void set_Fs( int Fs ); // unit is Hz.
- void set_vfo_frequency( int freq ); // unit is Hz.
- void set_vfo_duty_cycle( float duty ); // 0 ... 0.5
- void set_vfo_wave_form( wave_form form );
-private:
- VFO *vfo;
-};
-
-
// User Signal processing Class
class SignalProcessing {
public:
@@ -82,18 +18,13 @@
// project depenedent members.
void set_volume( float vol );
- void set_Fs( int Fs ); // unit is Hz.
- void set_vfo_frequency( int freq ); // unit is Hz.
- void set_vfo_duty_cycle( float duty ); // 0 ... 0.5
- void set_vfo_wave_form( wave_form form );
private:
// essential members. Do not touch.
void enter_critical_section(void);
void leave_critical_section(void);
// project dependent members.
- float volume_level; // 0 ... 1.0
- Monophonic * note;
+ float volume_level;
};
#endif
--- a/vfo.cpp Fri Feb 03 14:35:46 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-#include "signal_processing.h"
-
-
-VFO::VFO( void )
-{
- // initial parameter setting.
- this->form = triangle;
- this->Fs = 48000;
- this->frequency = 440;
- this->duty_cycle = 0.5;
-
- this->update_parameters();
-} // End of constructor()
-
-VFO::~VFO( void )
-{
- // do nothing
-}
-
-
-
-void VFO::run(
- float out_buffer[], // vfo output buffer
- unsigned int block_size // block size [sample]
- )
-{
- // place the signal processing coce here
- for ( int i= 0; i< block_size; i++ )
- {
- // 1 : if phase < half_way; 0 : others.
- if ( this->form == square )
- {
- if ( this->current_phase < this->half_way )
- out_buffer[i] = 1.0;
- else
- out_buffer[i] = 0.0;
- }
- else // form == triangle
- {
- if ( this->current_phase < this->half_way )
- out_buffer[i] = this->rising_rate * this->current_phase;
- else
- out_buffer[i] = 1 + this->falling_rate * ( this->current_phase - this->half_way );
- }
-
- // update phase
- this->current_phase += this->frequency;
- // limit the range of the phase.
- if ( this->current_phase >= this->Fs )
- this->current_phase -= this->Fs;
- }
-} // End of run()
-
-
-void VFO::set_Fs( int Fs )
-{
- // regulate the Fs.
- if ( Fs != 32000 && Fs != 44100 && Fs != 96000 && Fs != 48000 )
- Fs = 48000;
- this->Fs = Fs;
-
- this->update_parameters();
-}
-
-void VFO::set_frequency( int freq )
-{
- if ( freq > this->Fs / 4 )
- freq = Fs / 4;
- this->frequency = freq;
-
- this->update_parameters();
-}
-
-void VFO::set_duty_cycle( float duty )
-{
- if ( duty > 0.5f ) // high limit
- duty = 0.5f;
- if ( duty < 0.0f ) // low limit
- duty = 0.0f;
- this->duty_cycle = duty;
-
- this->update_parameters();
-}
-
-void VFO::set_wave_form( wave_form form )
-{
- this->form = form;
-}
-
-
- // update the internal parameter by given parameters
-void VFO::update_parameters(void)
-{
- // calc the half_way;
- this-> half_way = this->Fs * this-> duty_cycle;
-
- // forbid to be zero.
- if ( this-> half_way < this->frequency )
- half_way = this->frequency;
-
- // for triangle wave;
- this->rising_rate = 1.0 / this->half_way;
-
- this->falling_rate = - 1.0 / ( this->Fs - this->half_way );
-}
-
