AMR - 如何上采样

问题描述 投票:0回答:2

如何对 AMR 音频数据进行上采样。 amr 文件由 6 字节标头组成 - "!#AMR".getBytes(),之后有 32 字节的帧,每个帧有 1 字节标头和 31 字节音频。我应该如何对其进行上采样?我读过有关线性插值的内容,但我不确定如何在这里应用它。 我应该在不同的帧之间或帧中的字节之间或其他内容之间进行插值吗? 任何帮助将不胜感激:)

java audio sampling amr
2个回答
1
投票

您需要将 AMR 数据转换为原始 PCM 缓冲区,在 PCM 缓冲区上进行重采样,然后可以选择转换回 AMR。


0
投票

将 AMR 解码为线性 PCM。然后你可以用 https://github.com/dataandsignal/libhdsp 这样对它进行上采样:

hdsp_status_t hdsp_upsample_int16(int16_t *x, size_t x_len, int upsample_factor, int16_t *y, size_t y_len);

更完整的片段可能看起来像this

#include "hdsp.h"

int main(int argc, char **argv) {

    #define Fs_x 8000
    #define f_x 200
    #define Fs_y 48000
    #define FRAME_LEN_MS 20
    #define X_LEN_SAMPLES (FRAME_LEN_MS * Fs_x / 1000)
    #define Y_LEN_SAMPLES (FRAME_LEN_MS * Fs_y / 1000)
    #define UPSAMPLE_FACTOR (Fs_y / Fs_x)

    int16_t x[X_LEN_SAMPLES] = {0};
    int16_t y[Y_LEN_SAMPLES] = {0};

    int i = 0;
    while (i < X_LEN_SAMPLES) {
        x[i] = 100 * sin((double)i * 2 * M_PI * f_x / Fs_x);
        printf("%d\n",x[i]);
        i = i + 1;
    }

    hdsp_test(HDSP_STATUS_OK == hdsp_upsample_int16(x, X_LEN_SAMPLES, UPSAMPLE_FACTOR, y, Y_LEN_SAMPLES), "It did not work\n");

    i = 0;
    while (i < X_LEN_SAMPLES)
    {
        int j = 0;
        while (j < UPSAMPLE_FACTOR) {
            if (j == 0) {
                hdsp_test(y[UPSAMPLE_FACTOR * i + j] == x[i], "Wrong sample");
            } else {
                hdsp_test(y[UPSAMPLE_FACTOR * i + j] == 0, "Wrong zero");
            }
            j = j + 1;
        }
        i = i + 1;
    }
    return 0;
}

这是我写的一篇关于使用 libhdsp 进行上采样/下采样和过滤的文章(我是这个库的作者):

https://dataandsignal.com/blog/static/audio_upsampling_downsampling_and_filtering_with_libhdsp/

© www.soinside.com 2019 - 2024. All rights reserved.