[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]

[Burichan] [Futaba] [Gurochan] [Photon] - [Home] [Manage] [Archive]

[Return]
Posting mode: Reply
Leave these fields empty (spam trap):
Name
Link
Subject
Comment
File
Verification
Password (for post and file deletion)
  • Supported file types are: GIF, JPG, PDF, PNG
  • Maximum file size allowed is 20480 KB.
  • Images greater than 200x200 pixels will be thumbnailed.

File: 1331804895459.gif -(6159 B, 450x420) Thumbnail displayed, click image for full size.
6159 No.77448  

Новерь, будь бобр, поясни максимально просто про цифровые фильтры. Как я понял, весь процесс сводится к свёртке входного сигнала с заранее припасённой матрицей. Эта матрица, по сути, аналогична отклику фильтра на единичный импульс, за исключением того, что фильтра не существует.
Собственно вопрос - как её получить? Как сделать не простой ФНЧ/ФВЧ, а,например, фильтр с несколькими полосами пропускания? Как можно её быстро изменять, чтобы менялась полоса среза в реальном времени или типа того?
При помощи неё же, вроде как, можно изменять и временные характеристики - имитировать всякие дилэи и реверы. Как?
Ну и ещё - я как-то собрал готовый исходник, который даже работал и фильтровал, но при этом неслабо просаживал процессор на 2Ггц. Это нормально или же свёртка выполнялась как-то неоптимально?

>> No.77456  

>>77448

>поясни максимально просто про цифровые фильтры

Что ты уже знаешь об эквализации?

>Это нормально

Нет

>свёртка выполнялась как-то неоптимально?

FFT?

>> No.77498  

>>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;

Может проблема в том, что эта функция принимает на входе один сэмпл вместо целого буфера?

>> No.77518  

>>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;
>> No.77519  
File: 1331980023949.png -(39564 B, 685x750) Thumbnail displayed, click image for full size.
39564

>>77518
Сдаётся мне, что оно не работает. Вверху как было до, со старым кодом. Внизу - как стало.

>> No.77543  
File: 1332011149858.gif -(6601 B, 497x389) Thumbnail displayed, click image for full size.
6601

Кстати, может растолкуете одну непонятность? Матрица свёртки также может производить сдвиг по времени (в сторону запаздывания, разумеется). Как показали опыты, один отсчёт в таблице соответствует сдвигу также на один отсчёт. То есть, если мне нужен дилэй на 10мс, при Fд=48000, то нужно присвоить элементу номер 480 в таблице единицу. Пик почти рилейтед.
Собственно, вопрос - если снимается отклик с помещения, аппаратуры и тд, а затем воспроизводится при другой частоте дискретизации, что от этого может измениться?

>> No.77544  
File: 1332012479135.jpg -(233611 B, 808x507) Thumbnail displayed, click image for full size.
233611

>>77543
Логичнее всего перед воспроизведением привести к воспроизводимой частоте, тогда только качество изменится при интерполяции/экстраполяции семплов.

>> No.77845  
File: 1332401005851.gif -(12549 B, 582x275) Thumbnail displayed, click image for full size.
12549

ОП-хуй снова здесь. В своих поисках наткнулся-таки на интересную страницу, посвящённую обработке сигналов. dspguide.com - там и пдф-ки скачать можно.
Начал читать, столкнулся с непонятным моментом: при свёртке входного сигнала и отклика длина выходного сигнала равна сумме длин минус один. В принципе понятно, отчего такое возникает. Но при обработке звука мы оперируем буфером фиксированного (как правило) размера, при этом результат обработки должен быть той же длины, что и входной сигнал. Как поступают в таких случаях?
Хотя я читать только начал, может там дальше про это будет.

>> No.77846  

>>77845
Вариантов немного: аппроксимировать полученный буфер буфером нужной длины, либо переделать алгоритм.

>> No.78200  
File: 1333053452909.png -(13795 B, 700x420) Thumbnail displayed, click image for full size.
13795

Котаны, помогите, я совершенно запутался.
Стал разбираться сейчас с рекурсивными фильтрами. Для рассчёта коэффициентов фильтра требуется некоторая переменная 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.
Как вообще рассчитывают эти фльтры, исходя из требуемой частоты среза?

>> No.78602  

А не подскажет ли кто-нибудь простой способ расчёта коэффициентов для фильтра Чебышева малых порядков? Чтобы они могли быстро пересчитываться в реальном времени (скажем, если потребуется эффект фильтра, управляемого LFO).



Delete Post []
Password

[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]