[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]
Новерь, будь бобр, поясни максимально просто про цифровые фильтры. Как я понял, весь процесс сводится к свёртке входного сигнала с заранее припасённой матрицей. Эта матрица, по сути, аналогична отклику фильтра на единичный импульс, за исключением того, что фильтра не существует.Собственно вопрос - как её получить? Как сделать не простой ФНЧ/ФВЧ, а,например, фильтр с несколькими полосами пропускания? Как можно её быстро изменять, чтобы менялась полоса среза в реальном времени или типа того?При помощи неё же, вроде как, можно изменять и временные характеристики - имитировать всякие дилэи и реверы. Как?Ну и ещё - я как-то собрал готовый исходник, который даже работал и фильтровал, но при этом неслабо просаживал процессор на 2Ггц. Это нормально или же свёртка выполнялась как-то неоптимально?
>>77448>поясни максимально просто про цифровые фильтрыЧто ты уже знаешь об эквализации?>Это нормальноНет>свёртка выполнялась как-то неоптимально?FFT?
>>77448
>поясни максимально просто про цифровые фильтры
Что ты уже знаешь об эквализации?
>Это нормально
Нет
>свёртка выполнялась как-то неоптимально?
FFT?
>>77456>знаешь об эквализации?Хм, не понял вопроса. Эквализация - процесс обработки сигнала эквалайзером, или что ты имел ввиду?>FFT?Нет, обычное в таких случаях умножение с накоплением и сдвиг. Вот кусок кода:static float sample[FILTER_SIZE];float acc;float output;sample[0] = input;acc = 0.0f; /* Аккумулятор *//* Умножение с накоплением */for (i = 0; i < FILTER_SIZE; i++) { acc += (filterMatrix[i] * sample[i]);}/* Выход */ output = acc;/* Смещаем задержаный сигнал */for (i = FILTER_SIZE - 1; i > 0; i--) sample[i] = sample[i - 1];return output;Может проблема в том, что эта функция принимает на входе один сэмпл вместо целого буфера?
>>77456
>знаешь об эквализации?
Хм, не понял вопроса. Эквализация - процесс обработки сигнала эквалайзером, или что ты имел ввиду?
>FFT?
Нет, обычное в таких случаях умножение с накоплением и сдвиг. Вот кусок кода:
static float sample[FILTER_SIZE];float acc;float output;
sample[0] = input;
acc = 0.0f; /* Аккумулятор *//* Умножение с накоплением */for (i = 0; i < FILTER_SIZE; i++) { acc += (filterMatrix[i] * sample[i]);}
/* Выход */ output = acc;
/* Смещаем задержаный сигнал */for (i = FILTER_SIZE - 1; i > 0; i--)
sample[i] = sample[i - 1];
return output;
Может проблема в том, что эта функция принимает на входе один сэмпл вместо целого буфера?
>>77498static int curIdx;static float sample[FILTER_SIZE];float acc;sample[curIdx] = input;acc = 0.0f; /* Аккумулятор *//* Умножение с накоплением */for (i = 0; i < FILTER_SIZE; ++i) { acc = filterMatrix[i] * sample[i] + acc;}--curIdx;if(curIdx < 0) curIdx += FILTER_SIZE;return acc;
>>77498
static int curIdx;static float sample[FILTER_SIZE];float acc;
sample[curIdx] = input;
acc = 0.0f; /* Аккумулятор *//* Умножение с накоплением */for (i = 0; i < FILTER_SIZE; ++i) { acc = filterMatrix[i] * sample[i] + acc;}
--curIdx;if(curIdx < 0) curIdx += FILTER_SIZE;
return acc;
>>77518Сдаётся мне, что оно не работает. Вверху как было до, со старым кодом. Внизу - как стало.
Кстати, может растолкуете одну непонятность? Матрица свёртки также может производить сдвиг по времени (в сторону запаздывания, разумеется). Как показали опыты, один отсчёт в таблице соответствует сдвигу также на один отсчёт. То есть, если мне нужен дилэй на 10мс, при Fд=48000, то нужно присвоить элементу номер 480 в таблице единицу. Пик почти рилейтед.Собственно, вопрос - если снимается отклик с помещения, аппаратуры и тд, а затем воспроизводится при другой частоте дискретизации, что от этого может измениться?
>>77543Логичнее всего перед воспроизведением привести к воспроизводимой частоте, тогда только качество изменится при интерполяции/экстраполяции семплов.
ОП-хуй снова здесь. В своих поисках наткнулся-таки на интересную страницу, посвящённую обработке сигналов. dspguide.com - там и пдф-ки скачать можно.Начал читать, столкнулся с непонятным моментом: при свёртке входного сигнала и отклика длина выходного сигнала равна сумме длин минус один. В принципе понятно, отчего такое возникает. Но при обработке звука мы оперируем буфером фиксированного (как правило) размера, при этом результат обработки должен быть той же длины, что и входной сигнал. Как поступают в таких случаях?Хотя я читать только начал, может там дальше про это будет.
>>77845Вариантов немного: аппроксимировать полученный буфер буфером нужной длины, либо переделать алгоритм.
Котаны, помогите, я совершенно запутался.Стал разбираться сейчас с рекурсивными фильтрами. Для рассчёта коэффициентов фильтра требуется некоторая переменная x, которая может быть найдена двумя способами:1) При помощи количества сэмплов, требуемых для затухания x=exp(-1/d), где d - кол-во сэмплов. Здесь прослеживается полная аналогия с аналоговыми RC-цепями (смотри пик). Можно сказать, что exp(-1/d)=RC, так как оба выражения определяют длительность переходного процесса.2) Используя частоту среза Fc, x=exp(-2pi*Fc)Так вот, с этой частотой и проблемы, я не могу понять как она связана с реальной частотой в герцах. Если брать для расчёта выражение -1/d=-2pi*Fc (где d = 48000/440, длина в сэмплах), то частота получается какой-то нереальной, что-то вроде 0,128.Как вообще рассчитывают эти фльтры, исходя из требуемой частоты среза?
Котаны, помогите, я совершенно запутался.Стал разбираться сейчас с рекурсивными фильтрами. Для рассчёта коэффициентов фильтра требуется некоторая переменная x, которая может быть найдена двумя способами:1) При помощи количества сэмплов, требуемых для затухания x=exp(-1/d), где d - кол-во сэмплов. Здесь прослеживается полная аналогия с аналоговыми RC-цепями (смотри пик). Можно сказать, что exp(-1/d)=RC, так как оба выражения определяют длительность переходного процесса.2) Используя частоту среза Fc, x=exp(-2pi*Fc)
Так вот, с этой частотой и проблемы, я не могу понять как она связана с реальной частотой в герцах. Если брать для расчёта выражение -1/d=-2pi*Fc (где d = 48000/440, длина в сэмплах), то частота получается какой-то нереальной, что-то вроде 0,128.Как вообще рассчитывают эти фльтры, исходя из требуемой частоты среза?
А не подскажет ли кто-нибудь простой способ расчёта коэффициентов для фильтра Чебышева малых порядков? Чтобы они могли быстро пересчитываться в реальном времени (скажем, если потребуется эффект фильтра, управляемого LFO).
- wakaba 3.0.7 + futaba + futallaby -