对于此代码:
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;
}
}
答案 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.音符会有很多可识别的泛音,听起来不会像白色噪声
如果你想要白噪声,你就不能让它如此快地循环......因为它使它循环使它成为周期性的,这意味着它是一个可识别的音符。如果你想让它循环,你必须让循环更长。