跳转至

说明

重采样 — 三种采样率变换模式

下采样(保留/跳过)、上采样(零插入)、任意因子线性插值重采样。


算法原理

下采样 — tiny_downsample_skip_f32

\[ y[n] = x[n \cdot M + \text{offset}], \quad n = 0, \dots, \lfloor (L - \text{offset}) / M \rfloor \]

每 \(M\) 个点保留一个。\(\text{offset}\) 控制起始相位。

混叠风险

下采样前信号须限带至 \(f_s / (2M)\),否则高频分量折叠到低频。

上采样 — tiny_upsample_zero_f32

每两个原采样间插入 \(L-1\) 个零。输出长 \(L \cdot N\)。

频谱镜像

零插入在频谱中引入原频谱的 \(L-1\) 个镜像副本,需接低通滤波去除。

线性插值重采样 — tiny_resample_f32

\[ y[m] = x[n] + (x[n+1] - x[n]) \cdot \alpha, \quad n = \lfloor m \cdot R \rfloor,\; \alpha = m \cdot R - n \]

\(R = \text{orig_len} / \text{new_len}\)。适用于任意有理重采样因子。

高频衰减

线性插值本质是一个时变低通滤波器,上采样时高频分量被压制。对频率成分敏感的信号需注意。


API 参考

// 下采样:每 M 个点保留一个
int tiny_downsample_skip_f32(const float *input, int len,
                             int M, int offset, float *output);

// 上采样:每两个点间插入 N-1 个零
int tiny_upsample_zero_f32(const float *input, int len,
                           int N, float *output);

// 任意有理因子线性插值重采样
int tiny_resample_f32(const float *input, int orig_len,
                      int new_len, float *output);