|
|
|
/*
|
|
|
|
* AudioSynthWaveformSine_F32
|
|
|
|
*
|
|
|
|
* Created: Chip Audette (OpenAudio) Feb 2017
|
|
|
|
* Modeled on: AudioSynthWaveformSine from Teensy Audio Library
|
|
|
|
*
|
|
|
|
* Purpose: Create sine wave of given amplitude and frequency
|
|
|
|
*
|
|
|
|
* License: MIT License. Use at your own risk.
|
|
|
|
*
|
|
|
|
* Revised per synth_sine_f32.h. 7 Feb 2022 Bob.
|
|
|
|
*/
|
|
|
|
#include "synth_sine_f32.h"
|
|
|
|
#include "utility/dspinst.h"
|
|
|
|
// 513 values of the sine wave in a float array:
|
|
|
|
#include "sinTable512_f32.h"
|
|
|
|
|
|
|
|
void AudioSynthWaveformSine_F32::update(void) {
|
|
|
|
audio_block_f32_t *blockS;
|
|
|
|
uint16_t index, i;
|
|
|
|
float32_t a, b;
|
|
|
|
|
|
|
|
blockS = AudioStream_F32::allocate_f32(); // Output blocks
|
|
|
|
if (!blockS) return;
|
|
|
|
|
|
|
|
for (i=0; i < blockS->length; i++) {
|
|
|
|
phaseS += phaseIncrement;
|
|
|
|
if (phaseS > 512.0f) phaseS -= 512.0f;
|
|
|
|
index = (uint16_t) phaseS;
|
|
|
|
float32_t deltaPhase = phaseS - (float32_t)index;
|
|
|
|
/* Read two nearest values of input value from the sin table */
|
|
|
|
a = sinTable512_f32[index];
|
|
|
|
b = sinTable512_f32[index+1];
|
|
|
|
blockS->data[i] = magnitude*(a+(b-a)*deltaPhase); // Linear interpolation
|
|
|
|
}
|
|
|
|
// For higher frequencies, an optional bandpass filter the output
|
|
|
|
// This does a pass through for lower frequencies
|
|
|
|
if(doPureSpectrum)
|
|
|
|
arm_biquad_cascade_df1_f32(&bq_inst, blockS->data, blockS->data, 128);
|
|
|
|
AudioStream_F32::transmit(blockS);
|
|
|
|
AudioStream_F32::release (blockS);
|
|
|
|
}
|