Experimental implementation of the adaptive filter of "Interface" magazine in 2016-2017
Dependencies: amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746
Fork of skeleton_unzen_nucleo_f746 by
ハードウェアおよびソフトウェアはskelton_unzen_nucleo_f746を基本にしています。
vfo.cpp
- Committer:
- shorie
- Date:
- 2017-01-31
- Revision:
- 17:728ffc633179
- Parent:
- 16:d4ea3e6a0bce
- Child:
- 18:b9b1116f8768
File content as of revision 17:728ffc633179:
#include "signal_processing.h" // Modify this constructor to initialize your audio algorithm. VFO::VFO( void ) { // initial parameter setting. this->style = triangle; this->Fs = 48000; this->frequency = 440; this->duty_cycle = 0.5; this->update_parameters(); } // End of constructor() // Modify this method to implement your audio algorithm. 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->style == square ) { if ( this->current_phase < this->half_way ) out_buffer[i] = 1.0; else out_buffer[i] = 0.0; } else // style == 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_style( wave_style style ) { this->style = style; } // 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 ); }