0

团体,

目标:我正在尝试使用 sox-resample 库,从输入速率(44.1Khz,2 通道,16 位)下采样到输出速率(16Khz,1 通道,16 位)。是否可以在此过程中使用 sox-resample 库。

Sox Resample 库来源在这里:http: //sourceforge.net/p/soxr/code/ci/master/tree/

我试过soxr_oneshot这个api,产生的输出,没有输入缓冲区的原声,它有一个奇怪的声音输出,与原声输入相差甚远。

还尝试了 soxr_create 和 soxr_process api,但没有得到正确的输出。

我不确定,如果这些 api(soxr_oneshot、soxr_create 和 soxr_process)有一个选项,可以降级通道数,以及我们是否可以指定 16 位或 8 位。

也不确定我是否应该使用 LibSox api,例如 sox_create_effect/sox_add_effect,以及这是否是一个更好的选择。

这是使用 soxr_oneshot 的示例代码,请告诉我,可能有什么问题,或者如果您有任何建议。

#define INPUT_RATE  (44100)
#define OUTPUT_RATE (16000)
#define INPUT_NUM_CHANNELS (2)
#define OUTPUT_NUM_CHANNELS (1)

#define OUTPUT_BLOCK_ALIGN (2)

/*
ibuf - pointer to input buffer.
length - length of input buffer.
block_align - sample size of input rate.
*/
static int sox_test_function(void *ibuf, UINT32 length, UINT32 block_align)
{

    size_t olen = (size_t)((length * OUTPUT_RATE * OUTPUT_NUM_CHANNELS)/ (INPUT_RATE * OUTPUT_NUM_CHANNELS));   
    float * obuf = (float *)malloc(OUTPUT_BLOCK_ALIGN * olen);
    memset(obuf, 0, (OUTPUT_BLOCK_ALIGN * olen));
    size_t odone;
    FILE *ofile;
    UINT32 written = 0;

    //SKR: Need to find out, if we can downgrade # of channels..can we do that..??
    //also not sure..how to specify 16 bit/8 bit..etc..
    soxr_error_t err = soxr_oneshot(
    INPUT_RATE,
    OUTPUT_RATE,
    1,
    ibuf , length/block_align, NULL,
    obuf, olen/OUTPUT_BLOCK_ALIGN, &odone,
    NULL,
    NULL,
    NULL);

    ofile = fopen("nwave_file_16k_pcm.raw", "wb");

    if (ofile == NULL) {
        perror("Invalid file specified.");
        exit(-1);
    }

    written = fwrite(obuf, OUTPUT_BLOCK_ALIGN, odone, ofile); // Consume output.

   return 0;

}

请让我知道,可能是什么问题,或者如果您有任何建议。

4

1 回答 1

0

请参考 sox 源文件中示例程序中的 example3.c。您已使用 sox 效果“速率”进行下采样。我试过了,并且能够成功地对 wav 文件进行下采样,但我在波形被剪裁时遇到了问题。您可以参考我的帖子她使用 libsox 对 wav 文件进行下采样

于 2014-08-09T16:51:50.833 回答