【发布时间】:2015-11-29 05:55:20
【问题描述】:
我正在尝试实现这篇文章https://stackoverflow.com/a/5319085/1562784 中描述的简单延迟/混响,但我遇到了一个问题。在我录制 16bit/16khz 样本并在每次录制回调调用时获得 8k 样本的 Windows 上,它工作正常。但是在 linux 上,我从声卡中得到了小得多的块。大约 150 个样本。因此,我修改了延迟/混响代码以缓冲样本:
#define REVERB_BUFFER_LEN 8000
static void reverb( int16_t* Buffer, int N)
{
int i;
float decay = 0.5f;
static int16_t sampleBuffer[REVERB_BUFFER_LEN] = {0};
//Make room at the end of buffer to append new samples
for (i = 0; i < REVERB_BUFFER_LEN - N; i++)
sampleBuffer[ i ] = sampleBuffer[ i + N ] ;
//copy new chunk of audio samples at the end of buffer
for (i = 0; i < N; i++)
sampleBuffer[REVERB_BUFFER_LEN - N + i ] = Buffer[ i ] ;
//perform effect
for (i = 0; i < REVERB_BUFFER_LEN - 1600; i++)
{
sampleBuffer[i + 1600] += (int16_t)((float)sampleBuffer[i] * decay);
}
//copy output sample
for (i = 0; i < N; i++)
Buffer[ i ] = sampleBuffer[REVERB_BUFFER_LEN - N + i ];
}
这会导致输出出现白噪声,所以很明显我做错了什么。 在 linux 上,我以 16bit/16khz 录制,就像在 Windows 上一样,我在 VMWare 中运行 linux。
谢谢!
更新:
如已回答的帖子中所示,我一遍又一遍地“混响”旧样本。简单的“如果”解决了一个问题:
for (i = 0; i < REVERB_BUFFER_LEN - 1600; i++)
{
if((i + 1600) >= REVERB_BUFFER_LEN - N)
sampleBuffer[i + 1600] += (int16_t)((float)sampleBuffer[i] * decay);
}
【问题讨论】:
-
尝试注释掉
reverb函数,看看输出是否还是白噪声。也许问题出在其他地方。 -
感谢您的建议。我这样做了,没有混响功能输出很好。