ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
MicrophoneFourier_MAX9814.cpp
Go to the documentation of this file.
2
5
7
12
13
15 int inputSample = analogRead(pin);
16
17 inputSamp[samples++] = (float)inputSample;
18 inputSamp[samples++] = 0.0f;
19
20 inputStorage[samplesStorage++] = inputSample;
21
22 if (samples >= FFTSize * 2) {
23 sampleTimer.end();
24 samplesReady = true;
25 }
26}
27
29 samplesReady = false;
30 samples = 0;
32 sampleTimer.begin(SamplerCallback, 1000000 / sampleRate);
33}
34
35void MicrophoneFourier::Initialize(uint8_t pin, uint16_t sampleRate, float minDB, float maxDB, float refreshRate) {
40
41 pinMode(pin, INPUT);
42 analogReadResolution(12);
43
47
48 float windowRange = float(sampleRate) / 2.0f / float(OutputBins);
49
51
52 for (uint8_t i = 0; i < OutputBins; i++) {
53 float frequency = (float(i) * windowRange);
54 frequencyBins[i] = uint16_t(frequency / float(sampleRate / FFTSize));
55 }
56
58 isInitialized = true;
59}
60
62 for (int i = 0; i < FFTSize * 2; i++) {
63 inputSamp[i] = 0.0f;
64 }
65}
66
68 if (!samplesReady && timeStep.IsReady()) return;
69
72
73 float averageMagnitude = 0.0f;
74
75 for (uint8_t i = 0; i < OutputBins - 1; i++) {
76 float intensity = 20.0f * log10f(AverageMagnitude(i, i + 1));
77
78 intensity = map(intensity, minDB, maxDB, 0.0f, 1.0f);
79
80 outputData[i] = intensity;
81 outputDataFilt[i] = fftFilters[i].Filter(intensity);
82 if (i % 12 == 0) averageMagnitude = peakFilterRate.Filter(inputStorage[i] / 4096.0f);
83 }
84
85 averageMagnitude *= 10.0f;
86 threshold = powf(averageMagnitude, 2.0f);
87 threshold = threshold > 0.2f ? (threshold * 5.0f > 1.0f ? 1.0f : threshold * 5.0f) : 0.0f;
88
89 Reset();
91}
Extends the MicrophoneFourierBase class for real-time FFT microphone analysis.
float Filter(float value)
Filters the derivative of the input value and normalizes the output.
float Filter(float value)
Filters and normalizes the input value for FFT data processing.
Definition FFTFilter.cpp:9
static void Radix2FFT(float *data)
Performs a Radix-2 FFT on the provided data.
static void ComplexMagnitude(float *complexData, float *magnitude)
Computes the magnitude of complex numbers from interleaved real and imaginary components.
static bool isInitialized
Flag indicating if the system is initialized.
static float inputSamp[FFTSize *2]
Raw input samples for FFT.
static const uint16_t FFTSize
Size of the FFT (number of samples).
static FFT< FFTSize > fft
FFT processor instance.
static FFTFilter fftFilters[OutputBins]
Array of FFT filters for post-processing.
static float threshold
Threshold value for processing.
static float outputData[OutputBins]
Processed FFT data for output bins.
static const uint16_t OutputBins
Number of output bins from FFT processing.
static DerivativeFilter peakFilterRate
Filter for peak rate detection.
static float outputMagn[FFTSize]
Magnitude output from FFT.
static float maxDB
Maximum decibel value for normalization.
static float inputStorage[FFTSize]
Storage for processed input samples.
static uint8_t pin
Pin number for microphone input.
static float outputDataFilt[OutputBins]
Filtered FFT data for output bins.
static float AverageMagnitude(uint16_t binL, uint16_t binH)
Calculates the average magnitude of the specified FFT bins.
static uint16_t sampleRate
Sampling rate in Hz.
static float minDB
Minimum decibel value for normalization.
static void Reset()
Resets the microphone system and clears stored data.
static void StartSampler()
Starts the sampling process using the IntervalTimer.
static uint16_t samples
Number of samples collected in the current cycle.
static TimeStep timeStep
Time step utility for controlling updates.
static uint16_t frequencyBins[OutputBins]
Array for storing frequency bin data.
static float refreshRate
Refresh rate for processing in Hz.
static IntervalTimer sampleTimer
Timer for managing sampling intervals.
static void Initialize(uint8_t pin, uint32_t sampleRate, float minDB, float maxDB)
Initializes the microphone and FFT system with basic parameters.
static uint16_t samplesStorage
Total number of samples stored.
static bool samplesReady
Flag indicating if samples are ready for processing.
static void SamplerCallback()
Callback function for the sampling timer.
static void Update()
Updates the microphone system, processing new samples and performing FFT.
Provides a mechanism to trigger actions at a specified frequency.
Definition TimeStep.h:18
bool IsReady()
Checks if the specified time interval has elapsed.
Definition TimeStep.cpp:11
void SetFrequency(float frequency)
Sets the frequency for the TimeStep.
Definition TimeStep.cpp:7