Files
Alicho/src/simd/audio_processing.h
2025-10-24 18:17:58 +08:00

227 lines
8.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ================================================================================================
// 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