You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OpenAudio_ArduinoLibrary/synth_sine_f32.cpp

43 lines
1.4 KiB

/*
* 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);
}