|
Дата: 09 Ноя 2005 21:29:16
#
RadioWave
Ну типа начнем...
Для начала некоторые "интимности", практически КИХ фильтр является усеченной версией БИХ фильтра(теоретической моделью, которая имеет бесконечное число коэффициентов и идеальную АЧХ), подавление в полосе затухания реального КИХ фильтра практически не зависит от его длинны(!), как это ни прискорбно, но это так. К примеру КИХ фильтр с прямоугольной весовой функцией не может иметь подавление в полосе затухания более 21 дб(смешная для практических целей величина), ко всему прочему эти фильтры имеют сильную неравномерность в полосах затухания(пропускания) так же не зависящую от его длинны. Чем же в таком случае отличаются, к примеру, два КИХ фильтра с прямоугольной весовой функцией длинной в 10 и 200 отсчетов(коэффициентов)? Весьма немаловажным и существенным параметром, а именно, шириной переходной зоны, у одного она будет сотни герц(условно) у другого единицы или десятые доли.
Таким образом от длинны фильтра зависит крутизна скатов его АЧХ, остальные параметры зависят от вида весовой функции, с помощью которой осуществляется это самое усечение, до этой самой длинны. Любой(ФНЧ, ВФЧ, ПФ и РФ) фильтр может быть рассчитан на основе ФНЧ.
Оставим на время весовые функции и рассмотрим расчет ФНЧ. Базовая формула имеет следующий(весьма не злобный, в отличии от других формул в ЦОС) вид:
H(n)= [2*Fc*sin(2*pi*Fc*n)]/(2*pi*Fc*n), где n от минус бесконечности до плюс бесконечности, а Fc нормированная частота среза нашего ФНЧ, которая равна F/Fd, где F частота среза в герцах, Fd частота дискретизации на которой будет работать фильтр. К примеру для ФНЧ с частой среза 2 кгц и для сигнала с частотой дискретизации 8 кгц, Fc=2/8(нули опустим, это ничего не меняет) = 0.25 это и есть нормированная частота(величина безразмерная) среза ФНЧ.
Подставив в формулу Fc=0.25 и посчитав допустим для n от -50 до +50 получим 101 коэффициент нашего ФНЧ, это и есть способ расчета коэффициентов ФНЧ длинной 101 коэффициент, с прямоугольной весовой функцией. Есть некоторый нюанс в этой формуле, при нечетном количестве коэффициентов, при n=0, возникает неопределенность вида sin(x)/x, что даже двоечников смущать не должно, как известно(в школе это проходят) функция sin(x)/x при х равном нулю равна 1, то есть при n=0, H(0)=2*Fc, для четного количества этой проблемы нет.
На самом деле с отрицательными значениями n работать не совсем удобно, кроме того, относительно нулевого(центрального) коэффициента все остальные симметричны, так же из-за необходимости работать как с четным(по приведенной выше формуле это несколько проблемно) так и с не четным количеством коэффициентов базовую формулу несколько изменяют подгоняя ее под конкретные цели. В итоге получаются более простые(за счет симметрии фильтра) вычисления, но зато их уже два типа(чет/нечет), и для ФНЧ получается такая картина:
для нечетного количества коэффициентов
H(0)=2*Fc; для n=0;
H(n)=[sin(2*pi*Fc*n)]/(pi*n); для n = 0 ... (FilterLength-1)/2;
для четного
H(n)=[sin(2*pi*(n-0.5)*Fc)]/((n-0.5)*pi); для n = 1 ... FilterLength/2;
реально это выглядит так, к примеру для фильтра с частотой среза 2 кгц длинной 7 коэффициенов и частотой дискретизации 8 кгц, получаем:
H(0):=0.5;
H(1):=x1(ломает считать, обозначим условно);
H(2):=x2;
H(3):=x3;
в силу симметрии и нечетности коэффициентов получается последовательность x3, x2, x1, 0.5, x1, x2, x3 то есть за нулевой отсчет принят центральный, для того же фильтра с длинной 6 коэффициентов получаем
H(0):=x1;
H(1):=x2;
H(2):=X3;
в силу опять же симметрии, но учитывая, что центрального отсчета нет(он посередине шага) получаем x3, x2, x1, x1, x2, x3;
Таким образом легко получаем коэффициенты для ФНЧ любого порядка.
Вернемся теперь к весовым функциям, то что мы делали чуть выше, это и есть прямоугольная весовая функция, то есть попросту грубое обрезание бесконечного ряда конечным числом, что очень плохо сказывается на характеристиках самого фильтра, например на максимальном подавлении(не выше 21 дб) и крайне неравномерной АЧХ, причем как уже говорилось увеличение порядка(длинны) фильтра на это не влияет. Причиной этого является слишком грубое усечение бесконечного ряда, применение весовых функций обеспечивающих плавное, до нуля снижение значений коэффициентов в пределах длинны выборки существенно улучшает ситуацию(за это приходится правда платить). И именно вид весовой функции определяет максимально возможную степень подавления в полосе задерживания, и минимально достижимую величину неравномерности в полосе пропускания.
Самих весовых(оконных) функций довольно много, рассмотрим наиболее популярные.
Окно Ханна, обеспечивает подавление в полосе затухания -44 дб, при неравномерности в полосе пропускания 0.0546 дб
Окно Хемминга, подавление -53 дб, неравномерность 0.0194 дб
Окно Кайзера, в зависимости от параметров, затухание выше -90 дб, неравномерность менее 0.000275 дб
Как видим в принципе, все окна обладают весьма хорошими показателями, но платой за это является расширение переходной зоны, то есть попросту уменьшение крутизны фронтов(и смазывания частоты среза) АХЧ фильтра, и чем лучше весовая функция тем больше плата за ее характеристики.
Расчет первых двух весовых функций достаточно прост(Кайзера рассматривать не будем, важен принцип)
Для окна Ханна W(n)=0.5*[1-cos((2*n*pi)/N)], где n = 0 ... N-1, N=FilterLength;
Хемминга W(n)=0.54-0.46*cos[(2*n*pi)/N], где n = 0 ... N-1, N=FilterLength;
таким образом результирующие коэффициенты фильтра c весовой функцией(расчитанной по одной из формул) будут, к примеру, для первого варианта(длинной 7)
x3*W(0), x2*W(1), x1*W(2), 0.25*W(3), x1*W(4), x2*W(5), x3*W(6);
В принципе все..., приведу формулы расчета других типов фильтров(пока крутились вокруг ФНЧ)
ФВЧ для нечтной длинны:
H(0)=1-2*Fc;
H(n)=-[sin(2*pi*Fc*n)]/(pi*n); для n = для n = 0 ... (FilterLength-1)/2;
для четной:
H(n)=([sin(pi*(n-0.5)]-[sin(2*pi*(n-0.5)*Fc)])/((n-0.5)*pi); для n = 1 ... FilterLength/2;
ПФ для нечетной длинны:
H(0)=2*(F2-F1); где F2,F1 верхняя и нижняя нормированные частоты среза
H(n)=[sin(2*pi*F2*n)-sin(2*pi*F1*n)]/(pi*n); для n = 0 ... (FilterLength-1)/2;
для четной:
H(n)=[sin(2*pi*(n-0.5)*F2)-sin(2*pi*(n-0.5)*F1)]/((n-0.5)*pi); для n = 1 ... FilterLength/2;
РФ для нечетной длинны:
H(0)=1-2*(F2-F1); где F2,F1 верхняя и нижняя нормированные частоты среза
H(n)=[sin(2*pi*F1*n)-sin(2*pi*F2*n)]/(pi*n); для n = 0 ... (FilterLength-1)/2;
для четной:
H(n)=[sin(2*pi*(n-0.5)*F1)-sin(2*pi*(n-0.5)*F2)]/((n-0.5)*pi); для n = 1 ... FilterLength/2;
Осталась самая малость, сама длинна фильтра из чего берется? Как уже говорилось из допустимой ширины переходной зоны, к примеру, нужен фильтр с частотой среза 2 Кгц, шириной переходной зоны 100 Гц, частота дискретизации 8 кгц, подавление в полосе задерживания более 50 дб.
Получаем, весовая функция Хемминга(из требования уровня подавления), нормированная ширина переходной зоны 100/8000=0.0125, для весовой функции Хемминга минимальная длинна фильтра из требований переходной зоны равна 3.3/F_delta , где F_delta нормированная ширина переходной зоны, то есть получаем 3.3/0.0125 = 264 отсчета(коэффициента).
Для весовой функции Ханна длина фильтра по переходной зоне равна 3.1/F_delta, для многих весовых функций эти данные приводятся в литературе.
Уфф... по моему в самых общих чертах все. Это самый простой в вычислительном отношении метод, и самый не гибкий, но в большинстве случаев достаточный.
|
|
Дата: 04 Июн 2008 07:57:34 · Поправил: SergUA6 (04 Июн 2008 21:42:42)
#
CrazyFlik
Нет не верно, приведена схема расчета "половины" фильтра, полный фильтр состоит из двух таких половинок:
реально это выглядит так, к примеру для фильтра с частотой среза 2 кгц длинной 7 коэффициенов и частотой дискретизации 8 кгц, получаем:
H(0):=0.5;
H(1):=x1(ломает считать, обозначим условно);
H(2):=x2;
H(3):=x3;
в силу симметрии и нечетности коэффициентов получается последовательность x3, x2, x1, 0.5, x1, x2, x3 то есть за нулевой отсчет принят центральный, для того же фильтра с длинной 6 коэффициентов получаем
H(0):=x1;
H(1):=x2;
H(2):=X3;
в силу опять же симметрии, но учитывая, что центрального отсчета нет(он посередине шага) получаем x3, x2, x1, x1, x2, x3;
|