停止PCM示例会导致单击

时间:2014-09-29 20:57:42

标签: c audio wav pcm waveform

我从一组样本中生成一个wav文件。我注意到如果我开始然后停止复制波形,它会产生一个"点击"声音。这是一个简单的例子,我定期复制一个正弦波,然后没有声音(16位有符号立体声pcm,44100赫兹):

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在大胆中的样子,在正弦波被切断的位置放大:

enter image description here

最后尖锐的尖峰似乎是我听到的咔哒声的原因。为什么这会导致咔嗒声而不是瞬间停止声音?如何在没有咔嗒声的情况下停止声音?我需要在准确的时间停止复制样本,所以我不确定是否可以淡化它们。

即使波形更复杂(例如停止语音剪辑),也会出现此问题。

如果有人感兴趣,请点击录制的声音文件:http://clyp.it/yc2mpqni

2 个答案:

答案 0 :(得分:2)

PCM波形中的任何突然尖峰实际上都是咔嗒声。

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

答案 1 :(得分:0)

在过零点停止样品。这将消除飙升。