c - 停止 PCM 示例会导致点击

标签 c audio wav pcm waveform

我正在从样本数组中生成一个 wav 文件。我注意到如果我开始然后停止复制波形,它会产生“咔哒”声。这是一个简单的例子,我定期复制一个正弦波,然后没有声音(44100 赫兹的 16 位有符号立体声 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 在 audacity 中的样子,在正弦波被截断的点放大:

enter image description here

末端的尖峰似乎是我听到咔嗒声的原因。为什么这会引起咔嗒声而不是立即停止声音?如何在没有咔嗒声的情况下停止声音?我需要在准确的时间停止复制样本,所以我不确定是否可以淡出它们。

即使使用更复杂的波形(例如停止语音剪辑),我也会遇到这个问题。

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

最佳答案

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

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

关于c - 停止 PCM 示例会导致点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108786/

相关文章:

c - 在 C 中,检查是否存在名称与模式匹配的文件

c - 尝试模拟 grep 命令

java - Android MediaPlayer无法正常工作

c++ - 如何使用C++生成音频wav文件的波形

vb.net - 使用 VB.net 进行宣传

这可能是对齐内存问题吗?

c - 使用系统调用实现unix cat命令

Python Wave 字节数据

Java SFXR 端口 - 将 byte[] 写入 WAV 文件时遇到问题

c - 在波形文件上使用 KissFFT