为什么腐败的声音?

时间:2015-01-16 04:42:37

标签: c buffer alsa circular-buffer

对于此代码:

while (1) {
    generate_noise(frames, period_size);
    snd_pcm_writei(dev, frames, period_size);
}

它工作得很好..

但是为此:

generate_noise(frames, period_size);
while (1) {
    snd_pcm_writei(dev, frames, period_size);
}

声音破碎了。每次迭代都有一个可听见的裂缝! 这会导致始终更新缓冲区。 为什么呢?

UPD:

typedef struct {
    int16_t left;
    int16_t right;
} pcm_frame;

...

void
generate_noise(pcm_frame *frames, const size_t size)
{
    size_t pos = 0;

    while (pos < size) {
        frames[pos].left  = rand() % 200;
        frames[pos].right = rand() % 200;
        pos += 1;
    }
}

1 个答案:

答案 0 :(得分:2)

这会产生非周期性白噪声。

while (1) {
    generate_noise(frames, period_size);
    snd_pcm_writei(dev, frames, period_size);
}

这会产生周期性波形......不会产生噪音!人耳是一台神奇的机器,它实际上可以说你一遍又一遍地重复使用同样的噪音。

generate_noise(frames, period_size);
while (1) {
    snd_pcm_writei(dev, frames, period_size);
}

在48 kHz时,周期为1024个样本,它会产生46.9 Hz的音符,接近中间C以下的第三个G.音符会有很多可识别的泛音,听起来不会像白色噪声

如果你想要白噪声,你就不能让它如此快地循环......因为它使它循环使它成为周期性的,这意味着它是一个可识别的音符。如果你想让它循环,你必须让循环更长。