Остановка сэмпла PCM вызывает щелчок

Я создаю wav-файл из массива образцов. Я заметил, что если я начну, а затем остановлю копирование сигнала, он издаст звук «щелчка». Вот простой пример, когда я периодически копирую синусоиду, за которой не следует звук (16-битный стереофонический импульсно-кодовый сигнал со знаком при частоте 44 100 Гц):

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


person user3124047    schedule 29.09.2014    source источник
comment
Есть ли шанс, что вы могли бы передать весь код? Мне любопытно посмотреть, как строится весь волновой файл.   -  person plafratt    schedule 30.09.2014
comment
Я не писал код записи wav сам, я получил его из простой функции C++ здесь: ltheory.com /блог/writeWav.txt   -  person user3124047    schedule 30.09.2014
comment
Хорошо, спасибо за ссылку.   -  person plafratt    schedule 30.09.2014


Ответы (2)


Любой внезапный всплеск сигнала PCM на самом деле является щелчком.

Если вы заранее знаете, сколько семплов вы собираетесь копировать, вы можете начать постепенное их затухание раньше — линейная крутизна среза в течение 0,05 секунды является хорошей отправной точкой.

person Russell Borogove    schedule 29.09.2014
comment
Кажется, это единственный способ избежать щелчков. Спасибо! - person user3124047; 30.09.2014

Остановите образец в точке пересечения нуля. Это устранит шип.

person Robert Harvey    schedule 29.09.2014
comment
Усечение при переходе через нуль намного лучше, чем усечение на пике, но оно все еще может нести нежелательный шум. - person Russell Borogove; 30.09.2014