UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UniformPartitionConvolution.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"
8#include "DSP/FFTAlgorithm.h"
9
10namespace Audio
11{
27
43 {
44 public:
47
54
57
59 virtual int32 GetNumSamplesInBlock() const override;
60
62 virtual int32 GetNumAudioInputs() const override;
63
65 virtual int32 GetNumAudioOutputs() const override;
66
75 virtual void ProcessAudioBlock(const float* const InSamples[], float* const OutSamples[]) override;
76
78 virtual void ResetAudioHistory() override;
79
81 virtual int32 GetMaxNumImpulseResponseSamples() const override;
82
84 virtual int32 GetNumImpulseResponses() const override;
85
88
90 virtual void SetImpulseResponse(int32 InImpulseResponseIndex, const float* InSamples, int32 InNumSamples) override;
91
97
103
104 private:
105
106 // Bit mask to determine how many values to apply SIMD optimization.
107 static const int32 NumSimdMask;
108
109 // Triple index into 3D mixing matrix.
110 struct FInputTransformOutputGroup : public TTuple<int32, int32, int32>
111 {
112 FInputTransformOutputGroup(int32 InInputIndex, int32 InTransformIndex, int32 InOutputIndex)
114 {}
115
116 int32 GetInputIndex() const
117 {
118 return Get<0>();
119 }
120
121 int32 GetTransformIndex() const
122 {
123 return Get<1>();
124 }
125
126 int32 GetOutputIndex() const
127 {
128 return Get<2>();
129 }
130 };
131
132 // Vector optimized complex multiply add
133 void VectorComplexMultiplyAdd(const FAlignedFloatBuffer& InA, const FAlignedFloatBuffer& InB, FAlignedFloatBuffer& Out) const;
134
135 // Vector optimized multiply
136 void VectorMultiplyByConstant(const FAlignedFloatBuffer& InBuffer, float InConstant, FAlignedFloatBuffer& OutBuffer) const;
137
138 // Contains a single input channel.
139 //
140 // The input channel holds the FFT of the latest input block.
141 struct FInput
142 {
143 //
145
146 // Add one block of audio samples.
147 void PushBlock(const float* InSamples);
148
149 // Reference to latest transformed block.
150 const FAlignedFloatBuffer& GetTransformedBlock() const;
151
152 // Clears the transformed block
153 void Reset();
154
155 // Number of samples in a block
156 const int32 BlockSize;
157
158 private:
159
160 FSharedFFTRef FFTAlgorithm;
162 FAlignedFloatBuffer OutputBuffer;
163 };
164
165 // Contains a single output channel
166 //
167 // The output channel holds a running history of fourier transformed output blocks.
168 // When a block is popped, it converts it from the fourier domain to the time domain.
169 struct FOutput
170 {
171 // Construct an output
172 //
173 // @param InNumBlocks - Number of running history blocks
174 // @param InFFTAlgorithm - FFT algorithm for performing inverse FFT.
176
177 ~FOutput();
178
179 // Returns the history block at the given index.
180 FAlignedFloatBuffer& GetTransformedBlock(int32 InBlockIndex);
181
182 // Pop the latest block without performing inverse FFT
183 void PopBlock();
184
185 // Pop the latest block and perform inverse fft.
186 // Out samples should hold InFFTAlgorithm->Size() / 2 floats.
187 void PopBlock(float* OutSamples);
188
189 // Reset history of output blocks.
190 void Reset();
191
192 const int32 NumBlocks;
193 const int32 BlockSize;
194 const int32 NumFFTOutputFloats;
195 private:
196
197 FSharedFFTRef FFTAlgorithm;
198 FAlignedFloatBuffer OutputBuffer;
199
200 int32 HeadBlockIndex;
202
203 };
204
205 // Contains a single impulse response
206 //
207 // The impulse response is broken into blocks and transformed to the fourier domain.
208 struct FImpulseResponse
209 {
210 // Constructor
211 //
212 // @params InNumBlocks - Maximum number of FFT blocks
213 // @param InFFTAlgorithm - FFT algorithm to convert samples to fourier.
215
216 ~FImpulseResponse();
217
218 // Sets the impulse response.
219 void SetImpulseResponse(const float* InSamples, int32 InNum);
220
221 // Returns a block of the transformed impulse response.
222 const FAlignedFloatBuffer& GetTransformedBlock(int32 InBlockIndex) const;
223
224 // Returns the number of active blocks. This may be less than the maximum
225 // number of blocks if the impulse response is shorter than the maximum
226 // number of impulse response samples.
227 int32 GetNumActiveBlocks() const;
228
229 // Returns the number of samples in the impulse response.
230 int32 GetNumImpulseResponseSamples() const;
231
232 const int32 NumBlocks;
233 const int32 BlockSize;
234 private:
235
236 FSharedFFTRef FFTAlgorithm;
237 int32 NumFFTOutputFloats;
238 int32 NumActiveBlocks;
239 int32 NumImpulseResponseSamples;
240 FAlignedFloatBuffer FFTInput;
242 };
243
244 FUniformPartitionConvolutionSettings Settings;
245
246 int32 BlockSize;
247 int32 NumFFTOutputFloats;
248 int32 NumBlocks;
249 FAlignedFloatBuffer TransformedAndScaledInput;
250 TSharedRef<IFFTAlgorithm> FFTAlgorithm;
251
252 TArray<FInput> Inputs;
253 TArray<FOutput> Outputs;
254 TArray<FImpulseResponse> ImpulseResponses;
255
257 TArray<bool> IsOutputZero;
258 };
259
262 {
263 public:
265
267 virtual const FName GetFactoryName() const override;
268
270 virtual bool IsHardwareAccelerated() const override;
271
273 virtual bool AreConvolutionSettingsSupported(const FConvolutionSettings& InSettings) const override;
274
277
278 private:
279
280 // Convert the convolution settings into FFTAlgorithm settings.
281 static FFFTSettings FFTSettingsFromConvolutionSettings(const FConvolutionSettings& InConvolutionSettings);
282 };
283}
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
char const * InputBuffer
Definition binka_ue_decode_test.cpp:29
Definition UniformPartitionConvolution.h:262
virtual bool IsHardwareAccelerated() const override
Definition UniformPartitionConvolution.cpp:486
virtual const FName GetFactoryName() const override
Definition UniformPartitionConvolution.cpp:479
virtual ~FUniformPartitionConvolutionFactory()
Definition UniformPartitionConvolution.cpp:474
virtual bool AreConvolutionSettingsSupported(const FConvolutionSettings &InSettings) const override
Definition UniformPartitionConvolution.cpp:492
virtual TUniquePtr< IConvolutionAlgorithm > NewConvolutionAlgorithm(const FConvolutionSettings &InSettings) override
Definition UniformPartitionConvolution.cpp:516
Definition UniformPartitionConvolution.h:43
virtual int32 GetNumImpulseResponses() const override
Definition UniformPartitionConvolution.cpp:179
virtual void ProcessAudioBlock(const float *const InSamples[], float *const OutSamples[]) override
Definition UniformPartitionConvolution.cpp:101
virtual int32 GetNumImpulseResponseSamples(int32 InImpulseResponseIndex) const override
Definition UniformPartitionConvolution.cpp:185
virtual ~FUniformPartitionConvolution()
Definition UniformPartitionConvolution.cpp:71
virtual void SetMatrixGain(int32 InAudioInputIndex, int32 InImpulseResponseIndex, int32 InAudioOutputIndex, float InGain) override
Definition UniformPartitionConvolution.cpp:201
virtual float GetMatrixGain(int32 InAudioInputIndex, int32 InImpulseResponseIndex, int32 InAudioOutputIndex) const override
Definition UniformPartitionConvolution.cpp:236
virtual int32 GetNumSamplesInBlock() const override
Definition UniformPartitionConvolution.cpp:76
virtual void SetImpulseResponse(int32 InImpulseResponseIndex, const float *InSamples, int32 InNumSamples) override
Definition UniformPartitionConvolution.cpp:191
virtual int32 GetNumAudioInputs() const override
Definition UniformPartitionConvolution.cpp:82
virtual void ResetAudioHistory() override
Definition UniformPartitionConvolution.cpp:159
virtual int32 GetNumAudioOutputs() const override
Definition UniformPartitionConvolution.cpp:88
virtual int32 GetMaxNumImpulseResponseSamples() const override
Definition UniformPartitionConvolution.cpp:173
TSharedRef< IFFTAlgorithm > FSharedFFTRef
Definition UniformPartitionConvolution.h:46
Definition ConvolutionAlgorithm.h:115
Definition ConvolutionAlgorithm.h:56
Definition NameTypes.h:617
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
NO_LOGGING.
Definition AudioMixerPlatformAndroid.cpp:53
TArray< float, FAudioBufferAlignedAllocator > FAlignedFloatBuffer
Definition AlignedBuffer.h:22
Definition ConvolutionAlgorithm.h:15
Definition FFTAlgorithm.h:40
Definition UniformPartitionConvolution.h:14
int32 NumInputChannels
Definition UniformPartitionConvolution.h:16
int32 NumImpulseResponses
Definition UniformPartitionConvolution.h:22
int32 NumOutputChannels
Definition UniformPartitionConvolution.h:19
int32 MaxNumImpulseResponseSamples
Definition UniformPartitionConvolution.h:25
Definition Tuple.h:652