2014-09-29 32 views
1

我从一个采样数组中生成一个wav文件。我注意到如果我开始然后停止复制一个波形,它会产生一个“咔哒”声。这里有一个简单的例子,我在那里定期复制正弦波之后没有声音(16位有符号立体声PCM在44100赫兹):停止PCM采样导致点击

int c, counter = 0; 
short *wavdat = malloc(numberOfSamples * 2); 
for(c = 0; c < numberOfSamples * 2; c += 2){ 
    counter++; 
    if(counter % 10000 < 5000){ 
     wavdat[c] = sinf(counter * .1f) * 16000; 
     wavdat[c+1] = wavdat[c]; 
    }else{ 
     wavdat[c] = wavdat[c+1] = 0; 
    } 
} 

这里的WAV看起来像厚颜无耻的东西,在一个点放大,其中正弦波被切断:

​​

末的大幅攀升似乎是点击的声音,我听到的原因。为什么这会导致点击声音,而不是立即停止声音?如何在没有听到咔哒声的情况下阻止声音?我需要在确切的时间停止复制样本,所以我不确定我可以淡出它们。

即使有更复杂的波形(例如停止语音片段),这个问题也会发生在我身上。

这里是录制的声音文件,如果任何人的兴趣:http://clyp.it/yc2mpqni

+0

有没有可能传递所有代码?我很好奇看到整个wave文件是如何构建的。 – plafratt 2014-09-29 22:02:25

+1

我没有写自己写的wav编写代码,我从一个简单的C++函数中获取它:http://ltheory.com/blog/writeWav.txt – user3124047 2014-09-29 23:04:01

+0

好的,谢谢你的链接。 – plafratt 2014-09-29 23:11:36

回答

2

PCM波形中的任何突然尖峰实际上都是一次点击。

如果您事先知道需要复制多少个样本,则可以尽早开始淡出它们 - 超过0.05秒的线性截止斜率是一个很好的起点。

+0

这似乎是避免点击的唯一方法。谢谢! – user3124047 2014-09-29 21:44:45

0

在零交叉点停止样本。这将消除峰值。

+3

过零点截断比截断高峰要好得多,但它仍然可能带有不必要的噪音。 – 2014-09-29 21:03:35