у меня есть массив длины n, заполненный 16-битными (int16) необработанными данными PCM, данные находятся в 44100 sample_rate и стерео, поэтому у меня есть в моем массиве первые 2 байта левого канала, затем правого канала и т. д. ... я попытался реализовать простой низкий проход, преобразующий мой массив в числа с плавающей запятой -1 1, низкий проход работает, но есть круглые ошибки, которые вызывают небольшие щелчки в звуке, теперь я делаю просто это:
INT32 left_id = 0;
INT32 right_id = 1;
DOUBLE filtered_l_db = 0.0;
DOUBLE filtered_r_db = 0.0;
DOUBLE last_filtered_left = 0;
DOUBLE last_filtered_right = 0;
DOUBLE l_db = 0.0;
DOUBLE r_db = 0.0;
DOUBLE low_filter = filter_freq(core->audio->low_pass_cut);
for(UINT32 a = 0; a < (buffer_size/2);++a)
{
l_db = ((DOUBLE)input_buffer[left_id]) / (DOUBLE)32768;
r_db = ((DOUBLE)input_buffer[right_id]) / (DOUBLE)32768;
///////////////LOW PASS
filtered_l_db = last_filtered_left +
(low_filter * (l_db -last_filtered_left ));
filtered_r_db = last_filtered_right +
(low_filter * (r_db - last_filtered_right));
last_filtered_left = filtered_l_db;
last_filtered_right = filtered_r_db;
INT16 l = (INT16)(filtered_l_db * (DOUBLE)32768);
INT16 r = (INT16)(filtered_r_db * (DOUBLE)32768);
output_buffer[left_id] = (output_buffer[left_id] + l);
output_buffer[right_id] = (output_buffer[right_id] + r);
left_id +=2;
right_id +=2;
}
PS: входной буфер представляет собой массив int16 с данными PCM от -32767 до 32767;
я нашел эту функцию здесь Фильтр нижних частот в C
и был единственным, кого я мог понять xd
DOUBLE filter_freq(DOUBLE cut_freq)
{
DOUBLE a = 1.0/(cut_freq * 2 * PI);
DOUBLE b = 1.0/SAMPLE_RATE;
return b/(a+b);
}
вместо этого моя цель состоит в том, чтобы иметь абсолютную точность на волне и напрямую использовать низкие частоты, используя только целые числа с ценой потери разрешения на фильтре (и я в порядке с этим). я видел много примеров, но я действительно не понять что-нибудь ... кто-то из вас был бы так нежен, чтобы объяснить, как это делается, как вы объяснили бы маленькому ребенку? (в коде или представлении псевдокода) спасибо
float
или только некоторые из них? - person Lundin   schedule 19.02.2021input_buffer[b][left_id]
вы увеличиваете какb
, так иleft_id
- person Damien   schedule 19.02.2021filter_freq
- person Bodo   schedule 19.02.2021