227 lines
8.7 KiB
C++
227 lines
8.7 KiB
C++
// ================================================================================================
|
||
// Audio Backend - SIMD音频处理函数
|
||
// ================================================================================================
|
||
// 描述: 使用SIMD优化的音频处理函数集合
|
||
// 功能: 音频混合、音量控制、格式转换、基础数学运算
|
||
// ================================================================================================
|
||
|
||
#pragma once
|
||
|
||
#include "function_dispatcher.h"
|
||
#include "aligned_allocator.h"
|
||
#include <cstddef>
|
||
#include <cstdint>
|
||
|
||
namespace audio_backend::simd {
|
||
|
||
// ================================================================================================
|
||
// 音频格式定义
|
||
// ================================================================================================
|
||
enum class AudioFormat {
|
||
INT16, // 16位有符号整数
|
||
INT24, // 24位有符号整数(通常打包在int32中)
|
||
INT32, // 32位有符号整数
|
||
FLOAT32, // 32位浮点数
|
||
FLOAT64 // 64位浮点数
|
||
};
|
||
|
||
// ================================================================================================
|
||
// 音频混合函数
|
||
// ================================================================================================
|
||
|
||
// 混合两个浮点音频缓冲区
|
||
void mix_audio_f32(const float* input1, const float* input2, float* output, size_t samples);
|
||
|
||
// 混合多个浮点音频缓冲区
|
||
void mix_audio_multi_f32(const float* const* inputs, size_t num_inputs, float* output, size_t samples);
|
||
|
||
// 带权重的音频混合
|
||
void mix_audio_weighted_f32(const float* input1, float weight1,
|
||
const float* input2, float weight2,
|
||
float* output, size_t samples);
|
||
|
||
// ================================================================================================
|
||
// 音量控制函数
|
||
// ================================================================================================
|
||
|
||
// 应用恒定音量倍数
|
||
void apply_gain_f32(const float* input, float gain, float* output, size_t samples);
|
||
|
||
// 应用渐变音量(线性插值)
|
||
void apply_gain_ramp_f32(const float* input, float start_gain, float end_gain,
|
||
float* output, size_t samples);
|
||
|
||
// 应用每个样本不同的音量
|
||
void apply_gain_per_sample_f32(const float* input, const float* gains,
|
||
float* output, size_t samples);
|
||
|
||
// ================================================================================================
|
||
// 音频格式转换函数
|
||
// ================================================================================================
|
||
|
||
// 16位整数转32位浮点数
|
||
void convert_i16_to_f32(const int16_t* input, float* output, size_t samples);
|
||
|
||
// 32位浮点数转16位整数
|
||
void convert_f32_to_i16(const float* input, int16_t* output, size_t samples);
|
||
|
||
// 32位整数转32位浮点数
|
||
void convert_i32_to_f32(const int32_t* input, float* output, size_t samples);
|
||
|
||
// 32位浮点数转32位整数
|
||
void convert_f32_to_i32(const float* input, int32_t* output, size_t samples);
|
||
|
||
// 单声道转立体声(复制)
|
||
void mono_to_stereo_f32(const float* input, float* output, size_t samples);
|
||
|
||
// 立体声转单声道(平均)
|
||
void stereo_to_mono_f32(const float* input, float* output, size_t samples);
|
||
|
||
// ================================================================================================
|
||
// 数学运算函数
|
||
// ================================================================================================
|
||
|
||
// 向量加法
|
||
void vector_add_f32(const float* a, const float* b, float* result, size_t samples);
|
||
|
||
// 向量减法
|
||
void vector_subtract_f32(const float* a, const float* b, float* result, size_t samples);
|
||
|
||
// 向量乘法
|
||
void vector_multiply_f32(const float* a, const float* b, float* result, size_t samples);
|
||
|
||
// 标量乘法
|
||
void vector_scale_f32(const float* input, float scale, float* output, size_t samples);
|
||
|
||
// 计算RMS(均方根)
|
||
float calculate_rms_f32(const float* input, size_t samples);
|
||
|
||
// 计算峰值
|
||
float calculate_peak_f32(const float* input, size_t samples);
|
||
|
||
// ================================================================================================
|
||
// 滤波器和效果函数
|
||
// ================================================================================================
|
||
|
||
// 简单低通滤波器(一阶)
|
||
void lowpass_filter_f32(const float* input, float* output, size_t samples,
|
||
float cutoff_freq, float sample_rate, float* state);
|
||
|
||
// 简单高通滤波器(一阶)
|
||
void highpass_filter_f32(const float* input, float* output, size_t samples,
|
||
float cutoff_freq, float sample_rate, float* state);
|
||
|
||
// 延迟效果
|
||
void delay_effect_f32(const float* input, float* output, size_t samples,
|
||
float* delay_buffer, size_t delay_buffer_size,
|
||
size_t delay_samples, float feedback, float* delay_index);
|
||
|
||
// ================================================================================================
|
||
// 音频分析函数
|
||
// ================================================================================================
|
||
|
||
// 检测静音
|
||
bool detect_silence_f32(const float* input, size_t samples, float threshold = -60.0f);
|
||
|
||
// 检测削波
|
||
bool detect_clipping_f32(const float* input, size_t samples, float threshold = 0.99f);
|
||
|
||
// 计算频谱能量(需要配合FFT使用)
|
||
void calculate_spectral_energy_f32(const float* fft_output, float* energy_bands,
|
||
size_t fft_size, size_t num_bands);
|
||
|
||
// ================================================================================================
|
||
// SIMD优化的音频缓冲区类
|
||
// ================================================================================================
|
||
template<typename T, size_t Alignment = ALIGNMENT_AVX>
|
||
class AudioBuffer {
|
||
public:
|
||
AudioBuffer() = default;
|
||
|
||
AudioBuffer(size_t channels, size_t samples)
|
||
: channels_(channels), samples_(samples) {
|
||
allocate(channels, samples);
|
||
}
|
||
|
||
void allocate(size_t channels, size_t samples) {
|
||
channels_ = channels;
|
||
samples_ = samples;
|
||
size_t total_samples = channels * samples;
|
||
buffer_.resize(total_samples);
|
||
}
|
||
|
||
void clear() {
|
||
std::fill(buffer_.begin(), buffer_.end(), T{});
|
||
}
|
||
|
||
T* channel_data(size_t channel) {
|
||
return buffer_.data() + channel * samples_;
|
||
}
|
||
|
||
const T* channel_data(size_t channel) const {
|
||
return buffer_.data() + channel * samples_;
|
||
}
|
||
|
||
T* data() { return buffer_.data(); }
|
||
const T* data() const { return buffer_.data(); }
|
||
|
||
size_t channels() const { return channels_; }
|
||
size_t samples() const { return samples_; }
|
||
size_t size() const { return buffer_.size(); }
|
||
|
||
bool empty() const { return buffer_.empty(); }
|
||
|
||
// 获取交错格式的数据(LRLRLR...)
|
||
void to_interleaved(T* output) const {
|
||
for (size_t sample = 0; sample < samples_; ++sample) {
|
||
for (size_t channel = 0; channel < channels_; ++channel) {
|
||
output[sample * channels_ + channel] =
|
||
buffer_[channel * samples_ + sample];
|
||
}
|
||
}
|
||
}
|
||
|
||
// 从交错格式填充数据
|
||
void from_interleaved(const T* input) {
|
||
for (size_t sample = 0; sample < samples_; ++sample) {
|
||
for (size_t channel = 0; channel < channels_; ++channel) {
|
||
buffer_[channel * samples_ + sample] =
|
||
input[sample * channels_ + channel];
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查对齐
|
||
bool is_properly_aligned() const {
|
||
return is_aligned<Alignment>(buffer_.data());
|
||
}
|
||
|
||
private:
|
||
size_t channels_ = 0;
|
||
size_t samples_ = 0;
|
||
AlignedBuffer<T, Alignment> buffer_;
|
||
};
|
||
|
||
// 便捷类型定义
|
||
using AudioBufferF32 = AudioBuffer<float>;
|
||
using AudioBufferI16 = AudioBuffer<int16_t>;
|
||
using AudioBufferI32 = AudioBuffer<int32_t>;
|
||
|
||
// ================================================================================================
|
||
// 函数注册器(用于在启动时注册所有SIMD版本)
|
||
// ================================================================================================
|
||
class AudioProcessingRegistry {
|
||
public:
|
||
static void register_all_functions();
|
||
static void print_available_functions();
|
||
};
|
||
|
||
// ================================================================================================
|
||
// 便捷宏定义
|
||
// ================================================================================================
|
||
|
||
// 调用最优SIMD版本的宏
|
||
#define CALL_SIMD_AUDIO_FUNCTION(name, ...) \
|
||
CALL_SIMD_FUNCTION(decltype(name), #name, __VA_ARGS__)
|
||
|
||
} // namespace audio_backend::simd
|