为什么会损坏声音?
Why corrupt sound?
对于此代码:
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);
}
声音坏了。每次迭代都会发出爆裂声!
这导致总是更新缓冲区。
为什么?
更新:
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;
}
}
这会产生非周期性白噪声。
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。音符将有很多可识别的泛音,并且不会发声像白噪音。
如果你想要白噪音,你不能让它循环得那么快...因为让它循环会使它成为周期性的,这意味着它是一个可识别的音符。如果你想让它循环,你必须让循环更长。
对于此代码:
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);
}
声音坏了。每次迭代都会发出爆裂声! 这导致总是更新缓冲区。 为什么?
更新:
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;
}
}
这会产生非周期性白噪声。
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。音符将有很多可识别的泛音,并且不会发声像白噪音。
如果你想要白噪音,你不能让它循环得那么快...因为让它循环会使它成为周期性的,这意味着它是一个可识别的音符。如果你想让它循环,你必须让循环更长。