#filter #port #augmented #ported #rbj #dsp-filters

augmented-dsp-filters

音频滤波器(C++ DSPFilters的移植)

18个版本 (9个稳定版)

2.4.0 2024年1月24日
2.2.0 2023年5月22日
2.0.0 2023年3月22日
1.3.1 2022年10月22日
0.2.0 2021年10月30日

#63 in 音频


2 组件 中使用

MIT 许可证

115KB
2K SLoC

augmented-dsp-filters

crates.io docs.rs


机械式移植Vinnie Falco的 https://github.com/vinniefalco/DSPFilters/

仅移植RBJ滤波器。不支持内省,实现方式也相当不同(因为Rust更倾向于组合而非多重继承)。

测试很少,请小心使用扬声器。

依赖于 audio-processor-traits。导出 FilterProcessor,可用于通用滤波需求。

查看此存储库中的 synth 以获取一个不错的示例。

低通滤波器示例

use audio_processor_traits::{
    AudioBuffer, AudioProcessor, AudioProcessorSettings
};
use augmented_dsp_filters::rbj::{FilterProcessor, FilterType};

pub struct YourProcessor {
    filter: FilterProcessor<f32>, // <- f32 may be f64 if you wish
}

impl YourProcessor {
    fn new() -> Self {
        Self {
            filter: FilterProcessor::new(FilterType::LowPass),
        }
    }
    
    fn set_cutoff(&mut self, midi_value_between_0_and_127: f32) {
        let cutoff_ratio = midi_value_between_0_and_127 / 127.0;
        let cutoff_freq_hz = 22000.0 * cutoff_ratio;
        self.filter.set_cutoff(cutoff_freq_hz);
    }
    
    fn set_q(&mut self, q: f32) {
        self.filter.set_q(q);
    }
}

impl AudioProcessor for YourProcessor {
    type SampleType = f32;

    fn prepare(&mut self, settings: AudioProcessorSettings) {
        self.filter.prepare(settings);
    }

    fn process<BufferType: AudioBuffer<SampleType = Self::SampleType>>(
        &mut self,
        data: &mut BufferType,
    ) {
        self.filter.process(data);
    }
}

多线程

滤波器修改函数会重新计算滤波器的系数。这应该在音频线程上运行。

为了与MIDI集成,请参阅 synth;这不会成为问题,因为 AudioProcessor(独立)将在音频线程上接收MIDI。

为了与GUI线程集成,最好的做法可能是让音频线程从原子存储中读取参数,并在它们更改时更新滤波器(参见此存储库中的 audio-parameter-store)。

许可证

与原始内容一样,使用MIT许可证。

依赖关系

~0.9–3MB
~61K SLoC