2121#include < vector>
2222#include " server_shm.hpp"
2323
24- #include " kiss_fft .h"
24+ #include " kiss_fftr .h"
2525
2626#include " api/sonicpi_api.h"
2727
@@ -43,6 +43,7 @@ class AudioProcessor
4343 void Enable (bool start);
4444 void SetConsumed (bool consumed);
4545 void SetMaxBuckets (int maxBuckets);
46+ void SetSampleRate (int sampleRate);
4647 void Quit ();
4748 // Force re-attach to the scope shared memory — public so callers can
4849 // invoke after a cold-swap device change to refresh the stale reader.
@@ -73,8 +74,7 @@ class AudioProcessor
7374 native_stats GetNativeStats (); // synthdef count, allocated buffers + bytes
7475
7576private:
76- void GenLogSpace (uint32_t limit, uint32_t n);
77- void GenLinSpace (uint32_t limit, uint32_t n);
77+ void GenFreqPartitions (uint32_t buckets, int sampleRate);
7878 void SetupFFT ();
7979 void CalculateFFT (ProcessedAudio& audio);
8080
@@ -92,16 +92,26 @@ class AudioProcessor
9292 std::atomic<int > m_maxBuckets = { 0 };
9393 std::atomic<bool > m_quit = { false };
9494 std::atomic<bool > m_consumed = { false };
95+ std::atomic<int > m_sampleRate = { 48000 };
9596
96- // FFT
97- kiss_fft_cfg m_cfg;
98- std::vector<std:: complex < float > > m_fftIn[2 ];
97+ // FFT (real-input: N real samples in, N/2+1 complex bins out)
98+ kiss_fftr_cfg m_cfg;
99+ std::vector<kiss_fft_scalar > m_fftIn[2 ];
99100 std::vector<std::complex <float >> m_fftOut[2 ];
100- std::vector<float > m_fftMag[2 ];
101+ // Per-bin power (|X|^2 amplitude-corrected), bucket-averaged in the
102+ // power domain before conversion to dB
103+ std::vector<float > m_fftPower[2 ];
101104 std::vector<float > m_window;
102- std::vector<float > m_spectrumPartitions;
105+ // Bucket edges in bin space (buckets+1 entries), log-spaced in frequency
106+ std::vector<uint32_t > m_spectrumPartitions;
103107 std::pair<uint32_t , uint32_t > m_lastSpectrumPartitions = { 0 , 0 };
104108
109+ // Display ballistics: instant attack / timed release per bucket, plus
110+ // slowly-falling peak-hold markers
111+ std::vector<float > m_bucketSmoothed[2 ];
112+ std::vector<float > m_bucketPeak[2 ];
113+ std::vector<int > m_bucketPeakAge[2 ];
114+
105115 // Output data, double buffered
106116 ProcessedAudio m_processedAudio;
107117
0 commit comments