UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Filter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "DSP/Dsp.h"
8
9
10namespace Audio
11{
12 // Enumeration of filter types
29
30 // Biquad filter class which wraps a biquad filter struct
31 // Handles multi-channel audio to avoid calculating filter coefficients for multiple channels of audio.
33 {
34 public:
35 // Constructor
37 // Destructor
39
40 // Initialize the filter
41 SIGNALPROCESSING_API void Init(const float InSampleRate, const int32 InNumChannels, const EBiquadFilter::Type InType, const float InCutoffFrequency = 20000.0f, const float InBandwidth = 2.0f, const float InGain = 0.0f);
42
43 // Returns number of channels initialized with
45
46 // Resets the filter state
48
49 // Processes a single frame of audio
50 SIGNALPROCESSING_API void ProcessAudioFrame(const float* InFrame, float* OutFrame);
51
52 // Process a mono buffer or an interleaved buffer of multichannel audio
53 SIGNALPROCESSING_API void ProcessAudio(const float* InBuffer, const int32 InNumSamples, float* OutBuffer);
54
55 // Process a non-interleaved buffer of multichannel audio
56 SIGNALPROCESSING_API void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples, float* const* OutBuffers);
57
58 // Sets all filter parameters with one function
60
61 // Sets the type of the filter to use
63
64 // Sets the filter frequency
66
67 // Sets the bandwidth (octaves) of the filter
69
70 // Sets the gain of the filter in decibels
71 SIGNALPROCESSING_API void SetGainDB(const float InGainDB);
72
73 // Sets whether or no this filter is enabled (if disabled audio is passed through)
75
76 // Apply the filter transfer function to each z-domain value in the given array (complex numbers given as interleaved floats). Passing in z-domain values on the complex unit circle will give the frequency response.
78
79 protected:
80 struct FBiquadCoeff;
81
82 // Function computes biquad coefficients based on current filter settings
84
85 // Function used to clamp the cutoff frequency.
87
88 // What kind of filter to use when computing coefficients
90
91 // Biquad filter objects for each channel
93
94 // The sample rate of the filter
96
97 // Number of channels in the filter
99
100 // Current frequency of the filter
102
103 // Current bandwidth/resonance of the filter
105
106 // The gain of the filter in DB (for filters that use gain)
107 float GainDB;
108
109 // Whether or not this filter is enabled (will bypass otherwise)
111 };
112
113 namespace EFilter
114 {
124 }
125
126 static const int32 MaxFilterChannels = 8;
127
128 // Base class for filters usable in synthesis
130 {
131 public:
135
136 // Initialize the filter
137 SIGNALPROCESSING_API virtual void Init(const float InSampleRate, const int32 InNumChannels, const int32 InVoiceId, FModulationMatrix* InModMatrix = nullptr);
138
139 // Sets the cutoff frequency of the filter.
140 SIGNALPROCESSING_API virtual void SetFrequency(const float InCutoffFrequency);
141
142 // Sets an external modulated frequency
143 SIGNALPROCESSING_API virtual void SetFrequencyMod(const float InModFrequency);
144
145 // Sets the quality/resonance of the filter
146 SIGNALPROCESSING_API virtual void SetQ(const float InQ);
147
148 // Sets an external modulated quality/resonance of the filter
149 SIGNALPROCESSING_API virtual void SetQMod(const float InModQ);
150
151 // Sets the filter saturation (not used on all filters)
152 virtual void SetSaturation(const float InSaturation) {}
153
154 // Sets the band stop control param (not used on all filters)
155 virtual void SetBandStopControl(const float InBandStop) {}
156
157 // Sets the band pass gain compensation (not used on all filters)
159
160 // Sets the filter type
162
163 // Reset the filter
164 SIGNALPROCESSING_API virtual void Reset();
165
166 // Updates the filter
167 SIGNALPROCESSING_API virtual void Update();
168
169 // Processes a single frame of audio. Number of channels MUST be what was used during filter initialization.
170 virtual void ProcessAudioFrame(const float* InFrame, float* OutFrame)
171 {
173 }
174
175 // Process a mono buffer or an interleaved buffer of multichannel audio
176 virtual void ProcessAudio(const float* InBuffer, const int32 InNumSamples, float* OutBuffer) = 0;
177
178 // Process a non-interleaved buffer of multichannel audio
179 virtual void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples, float* const* OutBuffers) = 0;
180
181 // Filter patch destinations
184
185 protected:
186
187 inline float GetGCoefficient() const
188 {
189 const float OmegaDigital = 2.0f * PI * Frequency;
190 const float OmegaAnalog = 2.0f * SampleRate * Audio::FastTan(0.5f * OmegaDigital / SampleRate);
191 const float G = 0.5f * OmegaAnalog / SampleRate;
192 return G;
193 }
194
195 // The voice id of the owner of the filter (for use with mod matrix)
197
198 // Sample rate of the filter
200
201 // Number of channels of the sound
203
204 // The cutoff frequency currently used by the filter (can be modulated)
206
207 // The base filter cutoff frequency
209
210 // A modulated frequency
212
213 // A modulatied frequency driven externally
215
216 // The current Q
217 float Q;
218
219 // The modulated Q
220 float ModQ;
221
222 // The base
223 float BaseQ;
224
225 // An external modulation of Q
227
228 // The filter type of the filter
230
232
233 // Mod matrix patchable destinations
236
238 };
239
240 // A virtual analog one-pole filter.
241 // Defaults to a low-pass mode, but can be switched to high-pass
242 class FOnePoleFilter : public IFilter
243 {
244 public:
247
248 SIGNALPROCESSING_API virtual void Init(const float InSampleRate, const int32 InNumChannels, const int32 InVoiceId = 0, FModulationMatrix* InModMatrix = nullptr) override;
249 SIGNALPROCESSING_API virtual void Reset() override;
250 SIGNALPROCESSING_API virtual void Update() override;
251 SIGNALPROCESSING_API virtual void ProcessAudioFrame(const float* InFrame, float* OutFrame) override;
252 // Process a mono buffer or an interleaved buffer of multichannel audio
253 SIGNALPROCESSING_API virtual void ProcessAudio(const float* InSamples, const int32 InNumSamples, float* OutSamples) override;
254 // Process a non-interleaved buffer of multichannel audio
255 SIGNALPROCESSING_API virtual void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples, float* const* OutBuffers) override;
256
258 float GetCoefficient() const { return A0; }
259
260 float GetState(const int32 InChannel) const { return Z1[InChannel]; }
261
262 // Apply the filter transfer function to each z-domain value in the given array (complex numbers given as interleaved floats). Passing in z-domain values on the complex unit circle will give the frequency response.
264
265 protected:
266 float A0;
267 float* Z1;
268 };
269
271 {
272 public:
275
276 SIGNALPROCESSING_API virtual void Init(const float InSampleRate, const int32 InNumChannels, const int32 InVoiceId = 0, FModulationMatrix* InModMatrix = nullptr) override;
277 SIGNALPROCESSING_API virtual void SetBandStopControl(const float InBandStop) override;
278 SIGNALPROCESSING_API virtual void Reset() override;
279 SIGNALPROCESSING_API virtual void Update() override;
280 // Process a mono buffer or an interleaved buffer of multichannel audio
281 SIGNALPROCESSING_API virtual void ProcessAudio(const float* InSamples, const int32 InNumSamples, float* OutSamples) override;
282 // Process a non-interleaved buffer of multichannel audio
283 SIGNALPROCESSING_API virtual void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples, float* const* OutBuffers) override;
284
285 // Process a mono buffer or an interleaved buffer of multichannel audio
287 float* LpfOutput, float* HpfOutput, float* BpfOutput, float* BsfOutput);
288 // Process a non-interleaved buffer of multichannel audio
289 SIGNALPROCESSING_API void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples,
290 float* const* LpfOutBuffers, float* const* HpfOutBuffers, float* const* BpfOutBuffers, float* const* BsfOutBuffers);
291
292 // Apply the filter transfer function to each z-domain value in the given array (complex numbers given as interleaved floats). Passing in z-domain values on the complex unit circle will give the frequency response.
293 // The transfer function utilized here represents the behavior of the filter if the non-linearity were removed.
295
296 protected:
298 float A0;
299 float Feedback;
301
303 {
304 float Z1_1;
305 float Z1_2;
306
308 : Z1_1(0.0f)
309 , Z1_2(0.0f)
310 {}
311 };
312
314 };
315
316 class FLadderFilter : public IFilter
317 {
318 public:
321
322 SIGNALPROCESSING_API virtual void Init(const float InSampleRate, const int32 InNumChannels, const int32 InVoiceId = 0, FModulationMatrix* InModMatrix = nullptr) override;
323 SIGNALPROCESSING_API virtual void Reset() override;
324 SIGNALPROCESSING_API virtual void Update() override;
325 SIGNALPROCESSING_API virtual void SetQ(const float InQ) override;
327
328 // Process a mono buffer or an interleaved buffer of multichannel audio
329 SIGNALPROCESSING_API virtual void ProcessAudio(const float* InSamples, const int32 InNumSamples, float* OutSamples) override;
330
331 // Process a non-interleaved buffer of multichannel audio
332 SIGNALPROCESSING_API virtual void ProcessAudio(const float* const* InBuffers, const int32 InNumSamples, float* const* OutBuffers) override;
333
334 // Apply the filter transfer function to each z-domain value in the given array (complex numbers given as interleaved floats). Passing in z-domain values on the complex unit circle will give the frequency response.
335 // The transfer function utilized here represents the behavior of the filter if the non-linearity were removed.
337
338 protected:
339
340 // Ladder filter is made of 4 LPF filters
342 float Beta[4];
343 float K;
344 float Gamma;
345 float Alpha;
346 float Factors[5];
348 };
349
350}
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
#define PI
Definition UnrealMathUtility.h:65
Definition Filter.h:33
SIGNALPROCESSING_API FBiquadFilter()
Definition Filter.cpp:69
SIGNALPROCESSING_API void SetType(const EBiquadFilter::Type InType)
Definition Filter.cpp:210
SIGNALPROCESSING_API float ClampCutoffFrequency(float InCutoffFrequency)
Definition Filter.cpp:64
bool bEnabled
Definition Filter.h:110
float SampleRate
Definition Filter.h:95
SIGNALPROCESSING_API void CalculateBiquadCoefficients()
Definition Filter.cpp:281
SIGNALPROCESSING_API void ArrayCalculateResponseInPlace(TArrayView< float > InOutComplexValues) const
Definition Filter.cpp:257
int32 NumChannels
Definition Filter.h:98
float Frequency
Definition Filter.h:101
float Bandwidth
Definition Filter.h:104
FBiquadCoeff * Biquad
Definition Filter.h:92
SIGNALPROCESSING_API int32 GetNumChannels() const
Definition Filter.cpp:108
SIGNALPROCESSING_API void SetFrequency(const float InCutoffFrequency)
Definition Filter.cpp:219
SIGNALPROCESSING_API void SetParams(const EBiquadFilter::Type InFilterType, const float InCutoffFrequency, const float InBandwidth, const float InGainDB)
Definition Filter.cpp:193
SIGNALPROCESSING_API void ProcessAudio(const float *InBuffer, const int32 InNumSamples, float *OutBuffer)
Definition Filter.cpp:121
float GainDB
Definition Filter.h:107
SIGNALPROCESSING_API void Reset()
Definition Filter.cpp:185
EBiquadFilter::Type FilterType
Definition Filter.h:89
SIGNALPROCESSING_API void SetBandwidth(const float InBandwidth)
Definition Filter.cpp:229
SIGNALPROCESSING_API void SetEnabled(const bool bInEnabled)
Definition Filter.cpp:252
SIGNALPROCESSING_API void SetGainDB(const float InGainDB)
Definition Filter.cpp:238
SIGNALPROCESSING_API void ProcessAudioFrame(const float *InFrame, float *OutFrame)
Definition Filter.cpp:113
virtual SIGNALPROCESSING_API ~FBiquadFilter()
Definition Filter.cpp:81
Definition Filter.h:317
float Beta[4]
Definition Filter.h:342
virtual SIGNALPROCESSING_API void SetPassBandGainCompensation(const float InPassBandGainCompensation) override
Definition Filter.cpp:1086
float Factors[5]
Definition Filter.h:346
float K
Definition Filter.h:343
SIGNALPROCESSING_API void ArrayCalculateResponseInPlace(TArrayView< float > InOutComplexValues) const
Definition Filter.cpp:1179
virtual SIGNALPROCESSING_API void Update() override
Definition Filter.cpp:1027
virtual SIGNALPROCESSING_API void Reset() override
Definition Filter.cpp:1016
virtual SIGNALPROCESSING_API ~FLadderFilter()
Definition Filter.cpp:1000
float Alpha
Definition Filter.h:345
virtual SIGNALPROCESSING_API void SetQ(const float InQ) override
Definition Filter.cpp:1080
float Gamma
Definition Filter.h:344
virtual SIGNALPROCESSING_API void ProcessAudio(const float *InSamples, const int32 InNumSamples, float *OutSamples) override
Definition Filter.cpp:1091
SIGNALPROCESSING_API FLadderFilter()
Definition Filter.cpp:990
float PassBandGainCompensation
Definition Filter.h:347
FOnePoleFilter OnePoleFilters[4]
Definition Filter.h:341
Definition ModulationMatrix.h:102
Definition Filter.h:243
virtual SIGNALPROCESSING_API ~FOnePoleFilter()
Definition Filter.cpp:584
virtual SIGNALPROCESSING_API void Update() override
Definition Filter.cpp:611
void SetCoefficient(const float InCoefficient)
Definition Filter.h:257
virtual SIGNALPROCESSING_API void ProcessAudioFrame(const float *InFrame, float *OutFrame) override
Definition Filter.cpp:620
virtual SIGNALPROCESSING_API void Reset() override
Definition Filter.cpp:604
SIGNALPROCESSING_API FOnePoleFilter()
Definition Filter.cpp:577
float A0
Definition Filter.h:266
SIGNALPROCESSING_API void ArrayCalculateResponseInPlace(TArrayView< float > InOutComplexValues) const
Definition Filter.cpp:716
virtual SIGNALPROCESSING_API void ProcessAudio(const float *InSamples, const int32 InNumSamples, float *OutSamples) override
Definition Filter.cpp:646
float GetState(const int32 InChannel) const
Definition Filter.h:260
float GetCoefficient() const
Definition Filter.h:258
float * Z1
Definition Filter.h:267
Definition Filter.h:271
float BandStopParam
Definition Filter.h:300
SIGNALPROCESSING_API void ArrayCalculateResponseInPlace(TArrayView< float > InOutComplexValues) const
Definition Filter.cpp:935
float Feedback
Definition Filter.h:299
virtual SIGNALPROCESSING_API void ProcessAudio(const float *InSamples, const int32 InNumSamples, float *OutSamples) override
Definition Filter.cpp:803
virtual SIGNALPROCESSING_API void Update() override
Definition Filter.cpp:788
virtual SIGNALPROCESSING_API ~FStateVariableFilter()
Definition Filter.cpp:763
virtual SIGNALPROCESSING_API void SetBandStopControl(const float InBandStop) override
Definition Filter.cpp:776
float InputScale
Definition Filter.h:297
virtual SIGNALPROCESSING_API void Reset() override
Definition Filter.cpp:781
SIGNALPROCESSING_API FStateVariableFilter()
Definition Filter.cpp:755
TArray< FFilterState > FilterState
Definition Filter.h:313
float A0
Definition Filter.h:298
Definition Filter.h:130
float ModFrequency
Definition Filter.h:211
float Frequency
Definition Filter.h:205
int32 NumChannels
Definition Filter.h:202
virtual void ProcessAudioFrame(const float *InFrame, float *OutFrame)
Definition Filter.h:170
FPatchDestination ModCutoffFrequencyDest
Definition Filter.h:234
FPatchDestination ModQDest
Definition Filter.h:235
EFilter::Type FilterType
Definition Filter.h:229
virtual SIGNALPROCESSING_API void SetQ(const float InQ)
Definition Filter.cpp:535
float Q
Definition Filter.h:217
FPatchDestination GetModDestQ() const
Definition Filter.h:183
virtual SIGNALPROCESSING_API void Reset()
Definition Filter.cpp:508
float ModQ
Definition Filter.h:220
virtual SIGNALPROCESSING_API void SetFrequencyMod(const float InModFrequency)
Definition Filter.cpp:526
virtual SIGNALPROCESSING_API void SetFilterType(const EFilter::Type InFilterType)
Definition Filter.cpp:553
virtual SIGNALPROCESSING_API ~IFilter()
virtual void SetSaturation(const float InSaturation)
Definition Filter.h:152
SIGNALPROCESSING_API IFilter(const IFilter &)
SIGNALPROCESSING_API IFilter()
Definition Filter.cpp:467
FPatchDestination GetModDestCutoffFrequency() const
Definition Filter.h:182
float SampleRate
Definition Filter.h:199
float ExternalModQ
Definition Filter.h:226
virtual SIGNALPROCESSING_API void SetFrequency(const float InCutoffFrequency)
Definition Filter.cpp:517
float BaseFrequency
Definition Filter.h:208
virtual void SetPassBandGainCompensation(const float InPassBandGainCompensation)
Definition Filter.h:158
int32 VoiceId
Definition Filter.h:196
float ExternalModFrequency
Definition Filter.h:214
float GetGCoefficient() const
Definition Filter.h:187
FModulationMatrix * ModMatrix
Definition Filter.h:231
bool bChanged
Definition Filter.h:237
float BaseQ
Definition Filter.h:223
virtual void SetBandStopControl(const float InBandStop)
Definition Filter.h:155
virtual void ProcessAudio(const float *const *InBuffers, const int32 InNumSamples, float *const *OutBuffers)=0
virtual SIGNALPROCESSING_API void Update()
Definition Filter.cpp:558
virtual SIGNALPROCESSING_API void SetQMod(const float InModQ)
Definition Filter.cpp:544
virtual void ProcessAudio(const float *InBuffer, const int32 InNumSamples, float *OutBuffer)=0
Definition ArrayView.h:139
Definition Array.h:670
Type
Definition Filter.h:16
@ ParametricEQ
Definition Filter.h:21
@ HighShelf
Definition Filter.h:23
@ ButterworthLowPass
Definition Filter.h:25
@ Bandpass
Definition Filter.h:19
@ ButterworthHighPass
Definition Filter.h:26
@ LowShelf
Definition Filter.h:22
@ Highpass
Definition Filter.h:18
@ Notch
Definition Filter.h:20
@ AllPass
Definition Filter.h:24
@ Lowpass
Definition Filter.h:17
Type
Definition Filter.h:116
@ BandPass
Definition Filter.h:119
@ HighPass
Definition Filter.h:118
@ LowPass
Definition Filter.h:117
@ NumFilterTypes
Definition Filter.h:122
@ BandStop
Definition Filter.h:120
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
float FastTan(float X)
Definition Dsp.h:251
Definition Filter.cpp:15
Definition ModulationMatrix.h:37
float Z1_2
Definition Filter.h:305
FFilterState()
Definition Filter.h:307
float Z1_1
Definition Filter.h:304