#fft #fourier #data #dsp #stream

ruststft

对流数据进行短时傅里叶变换

2个版本

0.3.1 2023年6月22日
0.3.0 2023年6月22日

#2392算法

Download history 14/week @ 2024-03-09 1/week @ 2024-03-16 28/week @ 2024-03-30 3/week @ 2024-04-06 169/week @ 2024-04-27 104/week @ 2024-05-04 10/week @ 2024-05-11 78/week @ 2024-05-18 64/week @ 2024-05-25 59/week @ 2024-06-01 20/week @ 2024-06-08 21/week @ 2024-06-15 15/week @ 2024-06-22

每月116 次下载

MIT/Apache

15KB
239

STFT

状态:正在开发中。缺少一些测试。API仍在变化中。

Build Status

对流数据进行 短时傅里叶变换。用Rust编写。

要使用,请在您的 Cargo.toml 文件的 [dependencies] 部分添加 ruststft = "*",并在您的代码中调用 extern crate stft;

阅读文档以获取示例和更多信息!

贡献

根据您的选择,许可协议为Apache-2.0MIT


lib.rs:

对流数据进行 短时傅里叶变换

要使用,请在您的 Cargo.toml 文件的 [dependencies] 部分添加 ruststft = "*",并在您的代码中添加 use ruststft;

示例

use ruststft::{STFT, WindowType};

// let's generate ten seconds of fake audio
let sample_rate: usize = 44100;
let seconds: usize = 10;
let sample_count = sample_rate * seconds;
let all_samples = (0..sample_count).map(|x| x as f64).collect::<Vec<f64>>();

// let's initialize our short-time fourier transform
let window_type: WindowType = WindowType::Hanning;
let window_size: usize = 1024;
let step_size: usize = 512;
let mut stft = STFT::new(window_type, window_size, step_size);

// we need a buffer to hold a computed column of the spectrogram
let mut spectrogram_column: Vec<f64> =
std::iter::repeat(0.).take(stft.output_size()).collect();

// iterate over all the samples in chunks of 3000 samples.
// in a real program you would probably read from something instead.
for some_samples in (&all_samples[..]).chunks(3000) {
// append the samples to the internal ringbuffer of the stft
stft.append_samples(some_samples);

// as long as there remain window_size samples in the internal
// ringbuffer of the stft
while stft.contains_enough_to_compute() {
// compute one column of the stft by
// taking the first window_size samples of the internal ringbuffer,
// multiplying them with the window,
// computing the fast fourier transform,
// taking half of the symetric complex outputs,
// computing the norm of the complex outputs and
// taking the log10
stft.compute_column(&mut spectrogram_column[..]);

// here's where you would do something with the
// spectrogram_column...

// drop step_size samples from the internal ringbuffer of the stft
// making a step of size step_size
stft.move_to_next_column();
}
}

依赖关系

~3MB
~60K SLoC