Поскольку вы имеете дело с различными форматами, лучше всего при применении преобразования применять затухание на уровне образца.
Если вы выполняете преобразование в автономном режиме, то вы уже знаетеколичество семплов в файле, поэтому вы можете обработать X - B
семплов в обычном режиме (где X
- общее количество семплов, а B
- длительность замирания):
int i = 0;
for(i = 0; i < X - B; i++) {
sampleToBeConverted[i] = inputSample[i]
}
Затем дляпоследние B
сэмплов, вы бы сделали что-то вроде этого:
for(int j = 0; j < B; j++, i++) {
sampleToBeConverted[i] = inputSample[i] * (1.0 - (j / B));
}
Это было бы для линейного спада наклона, так что, если вы хотите что-то более изумительное, ну, тогда идите стучитесебя вне.;) По сути, формула для линейного замирания равна y = m * x + b
(помните класс алгебры?), Где ваш наклон в этом случае равен 1 / B
, а смещение по y равно 1,0, что является максимальным усилением громкости, которое вы хотите применить(т. е. без усиления).
Если вы выполняете преобразование в реальном времени, то вам нужно будет хранить B
выборок в кольцевом буфере, а затем применить вышеописанный алгоритм, когда вы достигнете конца обработки.