2015-01-16 26 views
0

對於此代碼:爲什麼腐敗的聲音?

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

是否generate_noise每次都會生成不同的樣本? ,如果沒有,snd_pcm_writei是否有足夠的延遲來確保寫入完成(處理器運行速度可能比PCM塊快)? –

+0

@bare_metal我是更新的信息瞭解更多信息。 – Deep

+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); 
} 

在48kHz時,用了一段1024個樣本,其將在46.9 Hz,這是接近中間以下C.第三G中的音符將有很多recognizeable泛音生成的說明,並且將聽起來不像白噪音。

如果你想要白噪聲,你不能讓它循環得這麼快......因爲使它循環使它定期,這意味着它是一個可識別的音符。如果你想循環,你將不得不使循環更長。

+0

是的,你說得對! – Deep