VJ Master 1.0
Real-time audio analysis and visualisation.
Loading...
Searching...
No Matches
ST_FFTThread.h
1// Copyright (c) 2025 Aaron Trotter (ShaderTech). All Rights Reserved.
2
3#pragma once
4#include "CoreMinimal.h"
5#include "HAL/ThreadSafeBool.h"
6#include "HAL/RunnableThread.h"
7#include "HAL/Runnable.h"
8#include "HAL/Event.h"
9
10#if WITH_KISSFFT
11#include "kiss_fft.h"
12#include "tools/kiss_fftr.h"
13#endif
14#include "Main/ST_AudioProcessingSettings.h"
15
19class ST_AUDIOPROCESSING_API FST_FFTThread : public FRunnable
20{
21public:
30 FString InName,
31 FFFTIOData InFFTIOData,
32 FFFTConfig InFFTConfig,
33 class UST_AudioIOBase* InAnalyserBase);
34
37
43 virtual bool CreateThread(bool bStartPaused);
44
46 virtual void PauseThread();
47
49 virtual void ContinueThread();
50
52 virtual void Main();
53
58 virtual bool IsThreadPaused() const;
59
64 virtual void EnsureCompletion();
65
66protected:
68 virtual bool Init() override;
69
71 virtual uint32 Run() override;
72
74 virtual void Stop() override;
75
77 virtual void Exit() override;
78
79private:
81 bool Compute_FFT();
82
84 void Compute_FrequencyBands(uint32 ChannelIndex);
85
87 void Compute_Amplitude(uint32 ChannelIndex);
88
90 void Compute_Pitch(uint32 ChannelIndex);
91
93 bool Compute_Beat(uint32 ChannelIndex);
94
101 float PerformChecksum(const float* buffer, uint32 size);
102
108 void Filter(FFFTFilterConfig InFilterConfig, TArray<float>& FilteredMagnitudes, uint32 ChannelIndex);
109
111 void Filter_Butterworth(FFFTFilterConfig InFilterConfig, TArray<float>& FilteredMagnitudes, uint32 ChannelIndex);
112
114 void Filter_ChebyshevTypeI(FFFTFilterConfig InFilterConfig, TArray<float>& FilteredMagnitudes, uint32 ChannelIndex);
115
117 bool Windowing_Hann(uint32 ChannelIndex);
118
120 bool Windowing_Hamming(uint32 ChannelIndex);
121
123 bool Windowing_BlackmanHarris(uint32 ChannelIndex);
124
126 bool Windowing_Gaussian(uint32 ChannelIndex);
127
129 void SpectrumSpacing_Log();
130
132 void SpectrumSpacing_OctaveSubdivision();
133
135 void SpectrumSpacing_Linear();
136
138 void SpectrumSpacing_Quadratic();
139
140private:
142 TUniquePtr<FRunnableThread> Thread = nullptr;
143
145 FEvent* m_semaphore = nullptr;
146
148 FThreadSafeBool m_Kill;
149
151 FThreadSafeBool m_Pause;
152
154 FString m_name = "";
155
157 FCriticalSection FFTLock;
158
160 FFFTIOData FFTIOData;
161
163 FFFTConfig FFTConfig;
164
166 TFunction<void(const TArray<float>&)> m_OnProcessedAudioReady;
167
168#if WITH_KISSFFT
170 kiss_fft_cpx* fftOutputBuffer = nullptr;
171
173 kiss_fftr_cfg cfg = NULL;
174#endif
175
177 TArray<float> RawMagnitudes;
178
180 TArray<float> RawMagnitudesHistory;
181
183 TArray<float> FrequencyBandsHistory;
184
186 TArray<float> FrequencyBands;
187
189 TArray<float> FrequencyBandEdges;
190
192 TArray<uint32> FrequencyBinsByBand;
193
195 TArray<float> AmplitudeHistory;
196
198 TArray<float> PitchHistory;
199
201 TArray<float> BeatHistory;
202
204 TArray<float> BeatRawMagnitudes;
205
207 TArray<bool> BeatDetectedForChannel;
208
210 TArray<bool> ProcessedChannel;
211
213 class UST_AudioIOBase* cachedAnalyserBase = nullptr;
214
216 TArray<float*> PaddedFFTInputBuffer;
217
219 TArray<float> LastBufferChecksum;
220
222 uint32 ChannelMultiplier = 1;
223};
224
226{
227 return (bool)m_Pause;
228}
229
231{
232 m_Pause = true;
233}
FST_FFTThread(FString InName, FFFTIOData InFFTIOData, FFFTConfig InFFTConfig, class UST_AudioIOBase *InAnalyserBase)
Constructor.
Definition ST_FFTThread.cpp:16
virtual void Exit() override
Clean up after thread has stopped.
Definition ST_FFTThread.cpp:144
virtual void EnsureCompletion()
Use this method to kill the thread! Safely ensures thread completion.
Definition ST_FFTThread.cpp:63
virtual bool CreateThread(bool bStartPaused)
Use this method to create the thread!
Definition ST_FFTThread.cpp:34
virtual bool Init() override
Initialize the thread. Called once before Run().
Definition ST_FFTThread.cpp:81
virtual void Main()
The main processing method.
Definition ST_FFTThread.cpp:230
virtual void PauseThread()
Pause the thread.
Definition ST_FFTThread.h:230
virtual void ContinueThread()
Continue/unpause the thread.
Definition ST_FFTThread.cpp:52
virtual bool IsThreadPaused() const
Check if the thread is currently paused.
Definition ST_FFTThread.h:225
virtual void Stop() override
Request the thread to stop.
Definition ST_FFTThread.cpp:210
virtual uint32 Run() override
Main loop where work is performed.
Definition ST_FFTThread.cpp:182
Base class for Audio IO functionality in ShaderTech.
Definition ST_AudioIOBase.h:38
Structure that holds configuration settings for FFT.
Definition ST_AudioProcessingSettings.h:631
Configuration structure for FFT filter settings. Contains various filter settings including the filte...
Definition ST_AudioProcessingSettings.h:300
Structure that holds the miniaudio playback and capture settings.
Definition ST_AudioProcessingSettings.h:714