[/b/] [/d/] [/tu/] [/a/] [/34/] [/ph/] [/wa/] [/cg/] [/t/]
Аноны, киньте кто-нибудь исходник или мануал для полосового фильтра.На одном форуме рекомендовали делать следующее: "Сначала расчитывется импульсная характеристика ФНЧ с ВЕРХНЕЙ частотой среза желаемого ПФ, затем расчитывается импульсная характеристка ФНЧ c НИЖНЕЙ частотой, и наконец делается вычитание f_high - f_low результатом которого и будет характеристика нужного ПФ".Делал по этому рецепту, в итоге получил пикрилейтед. Ширина полосы пропускания должна быть 1кГц, а по диаграмме она с трудом до половины дотягивает. Кроме того, сигнал на выходе чересчур гасятся - раза в четыре точно. И, кроме того, беспокоят странные скачки на нижних частотах.
>>70217Разложи на спектр, убери ненужные полосы, собери обратно.
>>70220А не слишком медленно будет? Надо чтобы оно в реальном времени успевало и, по возможности, не сильно грузило машину.
>>70221Если ты не будешь пытаться сделать это на каком-нибудь скриптовом языке то проблем быть не должно.
>>70224А сможешь что-нибудь сказать про эти формуды? Нашёл на одном форуме, ругаются, что нерабочие, хотя у меня вроде завелось. Но есть всё-таки странность:
>>70353Для сравнения взял два ФНЧ.На пике верхняя кривая - АЧХ КИХ-фильтра по непонятной формуле, стыренной с того же форума. Нижняя сделана по формулам в предыдущем посте. Почему они так отличаются? Частоты выше граничной давятся плохо, да и ослабление в рабочей полосе почти на 1,5Дб больше.
>>70353> А сможешь что-нибудь сказать про эти формуды?Формулы как формулы. Если интересно, насколько хорошо они работают - попробуй построить для них АЧХ.>>70354> Почему они так отличаются?Могу предположить, что формулы разные. Это все что можно сказать, не глядя на сами фомулы.
>>70353
> А сможешь что-нибудь сказать про эти формуды?
Формулы как формулы. Если интересно, насколько хорошо они работают - попробуй построить для них АЧХ.>>70354
> Почему они так отличаются?
Могу предположить, что формулы разные. Это все что можно сказать, не глядя на сами фомулы.
>>70356Если в виде кусков кода, то выглядят они так:ПервыйFs = 4000; // Частота срезаn = FILTER_SIZE / 2;j = n + 1;omega = 2*M_PI * Fs / fRate;a = omega / M_PI;int i;for (i = 0; i < n; i++) {if (i == 0) mat[j] = a; else { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);И второйif (i == 0) mat[j] = 2*Fs / fRate; else { mat[j+i] = mat[j-i] = sinf((float)i * omega) /(float) (i * M_PI);}Второй - это нечётный ФНЧ из таблицы.
>>70356Если в виде кусков кода, то выглядят они так:ПервыйFs = 4000; // Частота среза
n = FILTER_SIZE / 2;j = n + 1;omega = 2*M_PI * Fs / fRate;a = omega / M_PI;
int i;for (i = 0; i < n; i++) {if (i == 0) mat[j] = a; else { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);
И второйif (i == 0) mat[j] = 2*Fs / fRate; else {
mat[j+i] = mat[j-i] = sinf((float)i * omega) /(float) (i * M_PI);}
Второй - это нечётный ФНЧ из таблицы.
>>70369Или я что-то не понимаю или у тебя случай с четным n не риализован.Олсо если вместо omega = 2*M_PI * Fs / fRate; a = omega / M_PI; int i; for (i = 0; i < n; i++) { if (i == 0) mat[j] = a; else { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);использовать a = M_PI * Fs / fRate; omega = a * M_PI; mat[0] = a; int i; for (i = 1; i < n; i++) { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);то ты получишь некоторый прирост производительности (нету сравнения в цикле) и точности (умножение чисел с плавающей точкой на константу а потом деление на нее же приводит к накоплению ошибок).Кстати что тебе мешает прогнать фильтр несколько раз подряд?
>>70369Или я что-то не понимаю или у тебя случай с четным n не риализован.
Олсо если вместо
omega = 2*M_PI * Fs / fRate; a = omega / M_PI; int i; for (i = 0; i < n; i++) { if (i == 0) mat[j] = a; else { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);
использовать
a = M_PI * Fs / fRate; omega = a * M_PI; mat[0] = a; int i; for (i = 1; i < n; i++) { mat[j+i] = mat[j-i] = a*sinf((float)i * omega) / ((float)i * omega);
то ты получишь некоторый прирост производительности (нету сравнения в цикле) и точности (умножение чисел с плавающей точкой на константу а потом деление на нее же приводит к накоплению ошибок).
Кстати что тебе мешает прогнать фильтр несколько раз подряд?
>>70378>риализованололо
>>70378
>риализован
ололо
>>70378>случай с четным n не риализованВот здесь не понял. Зачем мне делать формулу для чётного n, если размер окна нечётный и он не меняется?>что тебе мешает прогнать фильтр несколько раз подряд?Идея, конечно, интересная, но я боюсь, что в полосе пропускания всё заглохнет - он ведь и её ослабляет тоже. Да и задержка наверняка возрастёт. Ну кроме того интересно, какого хрена он так делает. В наборах LV2 плагинов, например, есть три разных ФНЧ со срезом в 12Дб/24Дб/36Дб, может и здесь как-то можно регулировать?
>случай с четным n не риализован
Вот здесь не понял. Зачем мне делать формулу для чётного n, если размер окна нечётный и он не меняется?
>что тебе мешает прогнать фильтр несколько раз подряд?
Идея, конечно, интересная, но я боюсь, что в полосе пропускания всё заглохнет - он ведь и её ослабляет тоже. Да и задержка наверняка возрастёт. Ну кроме того интересно, какого хрена он так делает. В наборах LV2 плагинов, например, есть три разных ФНЧ со срезом в 12Дб/24Дб/36Дб, может и здесь как-то можно регулировать?
>>70429> в полосе пропускания всё заглохнет - он ведь и её ослабляет тожеПредварительно усиль весь сигнал да и все.> задержка наверняка возрастётКуда же без этого, но заметить будет трудно.
>>70429
> в полосе пропускания всё заглохнет - он ведь и её ослабляет тоже
Предварительно усиль весь сигнал да и все.
> задержка наверняка возрастёт
Куда же без этого, но заметить будет трудно.
>>70430При внимательном рассмотрении оказалось, что формулы одинаковые, просто записаны немного по-разному. А не взлетало потому, что си - лучший способ выстрелить себе в ногу (особенно если нет явного приведения типов).Полосовой фильтр из таблицы заработал, выглядит слегка посимпатичнее.Спасибо, бро, за поддержку!
- wakaba 3.0.7 + futaba + futallaby -